2009-07-06 8 views

risposta

11

Se ho capito correttamente alla domanda allora si dovrebbe leggere la sezione dal tutorial Swing on How to Write a Component Listener che mostra come di ascoltare per un cambiamento in una dimensione componenti.

4

Se il calcolo non è dispendioso in termini di tempo, vorrei semplicemente ricalcolare il valore ogni volta in paintComponent().

Altrimenti, è possibile salvare un valore delle dimensioni del componente e confrontarlo con le nuove dimensioni in paintComponent. Se la dimensione è cambiata, ricalcolare, altrimenti no.

private Dimension size; 

protected void paintComponent(Graphics g){ 
    if (!size.equals(getSize()){ 
     size = getSize(); 
     // recalculate value 
    } 
} 

Oppure, è possibile eseguire il calcolo su un evento di ridimensionamento.

private CompoentListener resizeListener = new ComponentAdapter(){ 
    public void componentResized(ActionEvent e){ 
     // recalculate value 
    } 
}; 

//in the constructor add the line 
addComponentListener(resizeListener); 
16

Suppongo che sia possibile ignorare i vari metodi setSize e resize ed eseguire il calcolo lì. Tuttavia, potresti non trovare tutti i luoghi in cui è possibile modificare la dimensione. Si consiglia di avere la classe implementare ComponentListener e semplicemente ascoltare se stessa per gli eventi di ridimensionamento.

Avviso: Non sono un esperto di Swing.

Avviso: Non ho compilato questo codice.

public class MyJPanel extends JPanel implements ComponentListener { 

    public MyJPanel() { 
     this.addComponentListener(this); 
    } 

    public void paintComponent(Graphics g) { 
     // Paint, paint, paint... 
    } 

    public void componentResized(ComponentEvent e) { 
     // Perform calculation here 
    } 

    public void componentHidden(ComponentEvent e) {} 

    public void componentMoved(ComponentEvent e) {} 

    public void componentShown(ComponentEvent e) {} 

} 
+2

Tuttavia, se il componente viene ridimensionato, ma non viene dipinto, potresti non voler calcolare ancora nulla – jjnguy

+0

+1 per mostrare tutti i metodi che devi implementare per ComponentListener, quindi non ho avuto bisogno di cercarli me stessa ;) –

22

Come Adamo Paynter ha suggerito, è anche possibile aggiungere una classe interna al codice, in questo modo:

class ResizeListener extends ComponentAdapter { 
     public void componentResized(ComponentEvent e) { 
      // Recalculate the variable you mentioned 
     } 
} 

Il codice che avete inserito tra le parentesi più interne sarà eseguito ogni volta che il componente di ottenere ridimensionato .

quindi si aggiunge questo listener per il componente con

myJPanel.addComponentListener(new ResizeListener()); 

È possibile ottenere il componente utilizzando e.getComponent(). In questo modo è possibile chiamare qualsiasi metodo del componente dall'interno della classe interna come

e.getComponent().getWeight(); 
0

Si ridimensiona automaticamente se è

  1. all'interno di un pannello BorderLayout e
  2. messo lì come componente BorderLayout.CENTER.

Se non funziona, probabilmente hai dimenticato uno di questi due.

2

Il modo più semplice è quello di implementare un ComponentListener:

myjpanel.addComponentListener(new ComponentAdapter() { 
    @Override 
    public void componentResized(ComponentEvent e) { 
     //recalculate variable 
    } 
}); 

Qui, ho usato un ComponentAdapter perché intendo solo l'override componentResized().

0

Ecco quello che uso (dove CoordinatePlane è un JPanel):

Io non sono un esperto

public CoordinatePlane() { 
    setBackground(Color.WHITE); 
    this.addComponentListener(new ComponentAdapter(){ 
     public void componentResized(ComponentEvent e) { 
      //YOUR CODE HERE   
     } 
    }); 
} 
Problemi correlati