2009-07-06 10 views

Respuesta

11

Si entiendo bien la pregunta entonces usted debe leer la sección del tutorial Swing en How to Write a Component Listener que muestra cómo escuchar para un cambio en un tamaño de componentes.

4

Si el cálculo no requiere mucho tiempo, simplemente volvería a calcular el valor cada vez en paintComponent().

De lo contrario, puede guardar un valor que sea del tamaño del componente y compararlo con el nuevo tamaño en paintComponent. Si el tamaño cambió, entonces recalcula, de lo contrario no lo haga.

private Dimension size; 

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

O bien, puede hacer el cálculo en un evento de cambio de tamaño.

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

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

Supongo que puede anular los diversos métodos setSize y resize y realizar el cálculo allí. Sin embargo, es posible que no encuentre todos los lugares donde se puede cambiar el tamaño. Es posible que desee que su clase implemente ComponentListener y simplemente se escuche a sí mismo para cambiar el tamaño de los eventos.

Advertencia: No soy experto en Swing.

Advertencia: No he compilado este código.

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

Sin embargo, si el componente cambia de tamaño, pero no está pintado, puede que no desee calcular nada todavía – jjnguy

+0

+1 para mostrar todos los métodos que tiene que implementar para el ComponentListener, así que no es necesario buscarlos yo mismo;) –

22

Como Adán Paynter sugirió, también se puede añadir una clase interna a su código, así:

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

El código que ha entrado entre los corchetes más internos se ejecutará cada vez que el componente de conseguir cambiar el tamaño .

Luego se agrega esto oyente a su componente con

myJPanel.addComponentListener(new ResizeListener()); 

Usted puede conseguir su componente utilizando e.getComponent(). De esta manera usted puede llamar a cualquier método de su componente del interior de la clase interna como

e.getComponent().getWeight(); 
0

Se cambia automáticamente el tamaño si es

  1. dentro de un panel BorderLayout y
  2. puesto allí como componente BorderLayout.CENTER.

Si no funciona, probablemente haya olvidado uno de estos dos.

2

La forma más sencilla es la implementación de un ComponentListener:

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

Aquí, he utilizado una ComponentAdapter porque sólo la intención de anular componentResized().

0

Esto es lo que yo uso (donde CoordinatePlane es un JPanel):

No soy un experto

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