2011-08-07 58 views
5

Programımdaki bir düğmeye bastığımda yarı boyutta bir JFrame'i canlandırmak istiyorum. Bence en kolay yolu JFrame'in mevcut sınırlarını bir zamanlayıcıya koyup 1'den 1'e kadar zaman sınırını azaltmayı düşünüyorum. Ama net olarak IDE'de yeni bir zamanlayıcı bildirdiğimde bunun gibi görünecektir.NetBeans'de bir zamanlayıcının içindeki JFrame sınırlarını aşarken sorun

 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 

      } 

     } 
    }); 

Ama sorun burada mı "Bu" JFrame.And atıfta değil de ben bile Sesimin yeni bir nesne oluşturmak olamaz JFrame.Because bana bana bu sorunu çözmek yardımcı başka window.Can kimseye verecek? .

+1

'frame.getWidth()' öğesini deneyin; burada 'frame' size atıfta bulunduğunuz JFrame'dir. – fireshadow52

cevap

5

int width = Foo.this.getWidth(); 

deneyin nerede Foo alt sınıfları JFrame.

+0

Lol ... Desteğiniz için teşekkürler ... Ama çalışmıyor ...:/ – Thusitha

+0

@Thusitha, 'JFrame' alt sınıflarını' JFrame' sınıfının adıyla değiştirin. – mre

+2

Zamanlayıcı kodu ana sınıfa içerse ve ana sınıftaki JFrame alt sınıfları (yani bu cevap için 1'den fazla oy), ancak camickr'in tavsiyesi bu kısıtlamalardan bağımsız olarak çalışacaktır (bu yüzden 1 + 'dan itibaren camickr cevabı). –

5

Ben benim programda bir düğmeye basın Tıkladığınız anda

Yani düğmesine erişimi varken yarım boyutunu olmak için bir JFrame animasyon istiyorum. Sonra çerçeveye referans almak için

kullanabilirsiniz.

Artık Zamanlayıcı için ActionListener öğesini oluşturduğunuzda, Window'da ActionListener için bir argüman olarak iletebilirsiniz.

Düzenleme: mre tarafından

öneri basit ve yalındır ve birçok durumda kullanımı kolaydır (ve muhtemelen bu durumda daha iyi bir çözüm).

Benim önerim biraz daha karmaşık ama size SwingUtilities yöntemini tanıtıyordu, bu da sonunda oluşturabileceğiniz herhangi bir çerçeve veya iletişim kutusu tarafından kullanılabilecek daha fazla yeniden kullanılabilir kod yazmanıza izin verecek. Winow belirli bir minimum boyuta ulaştığında zamanlayıcı durdurmak isteyeyim Tabii

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

:

Basit bir örnek gibi bir şey olurdu. Bu kodu sana bırakacağım.

+0

lütfen daha fazla açıklayabilir misiniz ... Ben oldukça java için yeni biriyim. – Thusitha

+0

temizle ve düzelt +1 – mKorbel

+0

@Thusitha, düzenlemeye bakın. – camickr