2011-08-07 12 views
5

Quiero animar un JFrame para que se vuelva de tamaño medio cuando presiono un botón en mi programa. Creo que la forma más fácil es poner los límites actuales de JFrame en un temporizador y disminuir los límites 1 por 1 cuando se ejecuta el temporizador. Pero cuando declaro un nuevo temporizador en Netbeans IDE, se verá así.problema con la obtención de límites de JFrame dentro de un temporizador en Netbeans

 Timer t = new Timer(5,new ActionListener() { 

     public void actionPerformed(ActionEvent e) { 

      //inside this I want to get my Jframe's bounds like this 
      // int width = this.getWidth();---------here,"this" means the Jframe 

      } 

     } 
    }); 

Pero el problema está en que aquí "esto" no refiriéndose a JFrame.And también no puedo incluso crear un nuevo objeto de mi JFrame.Because me dará otra cualquiera window.Can me ayude a resolver este problema? .

+1

Pruebe 'frame.getWidth()' donde 'frame' es el JFrame al que se refiere. – fireshadow52

Respuesta

5

Trate

int width = Foo.this.getWidth(); 

donde Foo subclases JFrame.

+0

Lol ... gracias por su apoyo ... Pero no funciona ...:/ – Thusitha

+0

@Thusitha, reemplace 'JFrame' con el nombre de la clase que subclasifica' JFrame'. – mre

+2

Esto debería funcionar si el código del temporizador es interno para la clase principal, y si la clase principal subclasifica JFrame (por lo que 1+ sube la voz para esta respuesta), pero la recomendación de camickr funcionará independientemente de estas restricciones (por lo tanto, 1+ a la respuesta de camickr). –

5

Quiero animar un JFrame para convertirse en un medio de tamaño cuando se presiona un botón en mi programa

Así que cuando se hace clic en el botón que tiene acceso al botón. A continuación, puede utilizar:

SwingUtilities.windowForComponent(theButton); 

para obtener una referencia del marco.

Así que ahora cuando crea el ActionListener para el temporizador puede pasar en la ventana como un argumento para el ActionListener.

Editar:

La sugerencia de la ERM es simple y sencillo y fácil de usar en muchos casos (y probablemente la mejor solución en este caso).

Mi sugerencia es un poco más complicada pero le presentaba el método SwingUtilities que eventualmente le permitirá escribir más código reutilizable que podría ser utilizado por cualquier cuadro o diálogo que pueda crear.

Un ejemplo sencillo sería algo así como:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class AnimationSSCCE extends JPanel 
{ 
    public AnimationSSCCE() 
    { 
     JButton button = new JButton("Start Animation"); 
     button.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       JButton button = (JButton)e.getSource(); 
       WindowAnimation wa = new WindowAnimation(
        SwingUtilities.windowForComponent(button)); 
      } 
     }); 

     add(button); 
    } 


    class WindowAnimation implements ActionListener 
    { 
     private Window window; 
     private Timer timer; 

     public WindowAnimation(Window window) 
     { 
      this.window = window; 
      timer = new Timer(20, this); 
      timer.start(); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      window.setSize(window.getWidth() - 5, window.getHeight() - 5); 
//   System.out.println(window.getBounds()); 
     } 
    } 


    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("AnimationSSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new AnimationSSCCE()); 
     frame.setSize(500, 400); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

Por supuesto que se desea detener el temporizador cuando el winow alcanza un cierto tamaño mínimo. Te dejaré ese código.

+0

por favor, ¿puedes explicarlo más? Soy bastante nuevo en Java. – Thusitha

+0

claro y correcto +1 – mKorbel

+0

@Thusitha, ver edición. – camickr

Cuestiones relacionadas