2011-08-07 14 views
5

Chcę animować ramkę JFrame, aby uzyskać połowę rozmiaru po naciśnięciu przycisku w moim programie. Myślę, że najłatwiejszym sposobem jest umieszczenie bieżących granic JFrame w stoper i zmniejszenie granic 1 na 1, gdy zegar działa. Ale kiedy deklaruję nowy zegar w IDE netbeans, będzie wyglądać tak.Problem z uzyskaniem granic JFrame wewnątrz licznika czasu w 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 

      } 

     } 
    }); 

Ale problem jest tutaj „to” nie odnosząc się do JFrame.And też nie mogę nawet utworzyć nowy obiekt z moich JFrame.Because to daje mi kolejną window.Can ktoś mi pomóc rozwiązać ten problem? .

+1

Wypróbuj 'frame.getWidth()' gdzie 'frame' to nazwa JFrame, do której się odwołujesz. – fireshadow52

Odpowiedz

5

Spróbuj

int width = Foo.this.getWidth(); 

gdzie Foo podklasy JFrame.

+0

Lol ... dzięki za wsparcie ... Ale to nie działa ...:/ – Thusitha

+0

@Thusitha, Zamień 'JFrame' na nazwę klasy, która podklasuje' JFrame'. – mre

+2

Powinno to zadziałać, jeśli kod czasowy jest wewnętrzny dla głównej klasy, a jeśli główna klasa jest podklasą JFrame (a więc 1+ pobrań dla tej odpowiedzi), ale zalecenie camickr będzie działało niezależnie od tych ograniczeń (więc 1+ do odpowiedzi camickr). –

5

Chcę animować JFrame stać pół rozmiaru po naciśnięciu przycisku w moim programie

Więc po kliknięciu przycisku masz dostęp do przycisku. Następnie możesz użyć:

SwingUtilities.windowForComponent(theButton); 

, aby uzyskać odniesienie do ramki.

Teraz, gdy tworzysz ActionListener dla Timera, możesz przekazać w oknie jako argument dla ActionListener.

Edit:

Sugestia przez MRE jest proste i prosto do przodu i łatwy w użyciu w wielu przypadkach (i chyba lepszym rozwiązaniem w tym przypadku).

Moja sugestia jest trochę bardziej skomplikowana, ale wprowadzono cię do metody SwingUtilities, która pozwoli ci na napisanie większego kodu wielokrotnego użytku, który mógłby potencjalnie zostać użyty przez dowolną ramkę lub okno dialogowe, które możesz utworzyć.

Prostym przykładem może być coś takiego:

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(); 
      } 
     }); 
    } 
} 

Oczywiście, że chcesz zatrzymać stoper kiedy Winów osiągnie pewną minimalną wielkość. Zostawię ci ten kod.

+0

proszę wyjaśnić to dalej ... Jestem całkiem nowy dla javy. – Thusitha

+0

jasne i poprawne +1 – mKorbel

+0

@Thusitha, patrz edycja. – camickr

Powiązane problemy