Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225

    dimensioni titolo in JInternalFrame

    sono nuovo di Java e sicuramente chiedo una banalità.
    Avrai la necessità di capire come determinare le dimensioni del titolo di una finestra interna JInternalFrame.
    Ho scritto questo scheletro di codice e utilizzato insets per visualizzare le dimensioni dei bordi della finestra interna, ma questi, nel mio sistema operativo, appaiono tutte uguali a 5 pixel mentre il top me lo sarei aspettato pari alla dimensione della finestra, cioè almeno 25-30 pixel.
    Qualcuno ha qualche idea ?
    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.net.*;
    import javax.imageio.ImageIO;
    import java.io.File;
    
    public class Main implements Runnable {
    
    	private final Dimension PANEL_SIZE = new Dimension(200, 200);
    
    	public static void main(String...args) {
    		SwingUtilities.invokeLater(new Main());
    	}
    
    
    	public void run() {
    
    		/* Pannello del contenuto del frame interno */
    		JPanel firstPanel = new JPanel ( new FlowLayout());
    
    		firstPanel.setPreferredSize(PANEL_SIZE);
    
    		JDesktopPane desktop = new JDesktopPane ();
    
    		/* Frame interno che contiene il Panel */
    		JInternalFrame firstFrame = new JInternalFrame(
    			"Primo pannello", true, false, true);
    
    		firstFrame.setContentPane( firstPanel);
    
    		/* Aggiunge il frame interno al desktop */
    		desktop.add(firstFrame);
    
    		/* Assegna una dimensione al frame interno e li rende visibili */
    		firstFrame.pack();
    		firstFrame.setVisible(true);
    
    		/* Crea una finestra */ 
    		JFrame window = new JFrame();
    
    		/* apre la finestra sullo schermo */
    		window.add(desktop, BorderLayout.CENTER);
    		window.setSize(640, 480);
    		window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		window.setVisible(true);
    
    		/* ok, vediamo quanto valgono gli insets del frame interno */
    		System.out.println ( 
    			"\ntop="+firstFrame.getInsets().top + 
    			"\nright="+firstFrame.getInsets().right + 
    			"\nbottom="+firstFrame.getInsets().bottom + 
    			"\nleft="+firstFrame.getInsets().left 
    		);
    		
    	}
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: dimensioni titolo in JInternalFrame

    Originariamente inviato da sebaldar
    Ho scritto questo scheletro di codice e utilizzato insets per visualizzare le dimensioni dei bordi della finestra interna, ma questi, nel mio sistema operativo, appaiono tutte uguali a 5 pixel mentre il top me lo sarei aspettato pari alla dimensione della finestra, cioè almeno 25-30 pixel.
    No. Ma hai detto bene all'inizio: sono i bordi, non centra il titolo!

    Infatti gli insets nel JInternalFrame rappresentano solo i bordi del frame e se ne vuoi la prova, dopo che hai istanziato il JInternalFrame fai:

    firstFrame.setBorder(BorderFactory.createLineBorde r(Color.RED, 10));

    ti troverai con un bel bordone rosso di 10 pixel e il tuo println messo alla fine stamperà

    top=10
    right=10
    bottom=10
    left=10
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    grazie,
    ed l'altezza del titolo come faccio a ricavarla ?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da sebaldar
    l'altezza del titolo come faccio a ricavarla ?
    Innanzitutto sarei curioso di sapere il motivo di questa richiesta.

    Ma a livello tecnico mi sembrerebbe abbastanza sensato determinarlo dalla dimensione del frame, togliendo la dimensione dei bordi, togliendo la dimensione del content pane (il contenuto del frame).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    Originariamente inviato da andbin
    Innanzitutto sarei curioso di sapere il motivo di questa richiesta.
    ho implementato un drag and drop ed ho notato, probabilmente per la scarsa conoscenza che ho di java, che subivo uno spostamento pari al bordo del frame interno, al premere del tasto del mouse. L'ho corretto manualmente con un offset pari alle dimensioni del bordo del frame e dell'altezza del titolo, ma questa soluzione, oltre che poco elegante, potrebbe non essere portabile, in quanto l'altezza del titolo dipende da sistema operativo.
    Ma a livello tecnico mi sembrerebbe abbastanza sensato determinarlo dalla dimensione del frame, togliendo la dimensione dei bordi, togliendo la dimensione del content pane (il contenuto del frame).
    buon suggerimento, in effetti anch'io non avevo trovato una funzione che restituisca direttamente l'altezza del frame interno, cosa che invece dà l'insets top per i JFrame.

    grazie
    ciao

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da sebaldar
    ho implementato un drag and drop
    drag-and-drop .... di cosa esattamente?

    La mia sensazione è che se il l'altezza del titolo ti serve per "correggere" qualcosa che riguarda un drag-and-drop .... qualcosa non quadra, presumo, nel concetto o nell'implementazione della tua logica.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    il codice è un po' sporco, ti posto la funzione che gestisce la pressione del mouse, nella quale prima di tutto si determina la posizione assoluta del mouse e attraverso queste coordinate il componente da draggare. Se questo esiste viene ritornata una struttura dati (la dragData) dove viene memorizzata una copia del componente da draggare. currentDataPoint contiene le coordinate relative al contenitore su cui si disegna. SIccome l'origine dell'immagine del componente da draggare è, normalmente, non coincidente con la posizione relativa del mouse devo correggere la posizione corrente traslandola della quantità dx, dy che dipende dalla posizione relativa del componente e delle dimensioni h e w dell'immagine.
    E' a questo punto che ho dovuto correggerla ancora delle quantità 26 e 5, che corrispondono al bordo e all'altezza del titolo (comprensivo del bordo). I systemOut mi sono serviti solo per capire perchè avevo questa traslazione.
    codice:
    	/* Gestisce la pressione del mouse estraendo i dati da trascinare */
    	private void handleMousePressed(MouseEvent e) {
    
    		Point screenPoint = convertPointToScreen(
    			e.getPoint(), e.getComponent());
    
    		dragData = ddUnit.carve(screenPoint);
    		if(dragData != null) {
    			setVisible(true);
    			currentDataPoint = convertPointFromScreen(screenPoint, this);
    
    Component image = dragData.getData(Component.class);
    
    Container c = this;
    while ( c != null ) {
    Insets insets = c.getInsets();
    System.out.println("\ninsets.top:"+insets.top);
    System.out.println("\ninsets.right:"+insets.right);
    System.out.println("\ninsets.botton:"+insets.bottom);
    System.out.println("\ninsets.left:"+insets.left);
    c=c.getParent();
    }
    
    dx = e.getX() - image.getX() - 5 ;
    dy = e.getY() - image.getY() - 26 ;
    
    dragData.setOffset( dx, dy );
    
    currentDataPoint.x -= dx ;
    currentDataPoint.y -= dy ;
    
    			repaint();
    
    /*
    System.out.println("\npremuto in:"+e.getPoint().getX()+" - "+e.getPoint().getY());
    Point location = e.getComponent().getLocationOnScreen();
    System.out.println("\nComponente:"+location.x+" - "+location.y);
    location = this.getLocationOnScreen();
    System.out.println("\nPannello:"+location.x+" - "+location.y);
    System.out.println("\nscreenPoint:"+screenPoint.x+" - "+screenPoint.y);
    System.out.println("\ncurrentDataPoint:"+currentDataPoint.x+" - "+currentDataPoint.y);
    if ( image != null )
    System.out.println("\nimmagine:"+image.getX()+" - "+image.getY());
    System.out.println("\ndelta:"+dx+" - "+dy);
    */
    		}
    	}

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.