2011-08-07 54 views
5

我想在我的程序中按下按鈕時將JFrame的動畫變爲半尺寸。我認爲最簡單的方法是將JFrame的當前邊界放入計時器中,並在定時器運行時逐個減小邊界。但是,當我在netbeans IDE中聲明新計時器時,它看起來像這樣。在Netbeans的計時器中獲取JFrame邊界的問題

 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 

      } 

     } 
    }); 

但問題是這裏的「this」不是指的JFrame.And還我不能甚至創造我的新對象JFrame.Because它會給我一個window.Can誰能幫我解決這個問題? 。

+1

嘗試'frame.getWidth()'其中'frame'是您所指的JFrame。 – fireshadow52

回答

5

嘗試

int width = Foo.this.getWidth(); 

其中Foo子類JFrame

+0

大聲笑...謝謝你的支持...但它不工作....:/ – Thusitha

+0

@Thusitha,用'JFrame'的子類的名稱替換'JFrame'。 – mre

+2

如果計時器代碼是內部的主類,並且如果主類的子類爲JFrame(因此1+支持這個答案),但是camickr的推薦可以工作而不管這些限制(所以1+對camickr的答案),這應該工作。 –

5

我想動畫一個JFrame變成一半大小的,當我在我的程序按一個按鈕

所以,當你點擊按鈕,您可以訪問按鈕。然後你可以使用:

SwingUtilities.windowForComponent(theButton); 

獲得對幀的引用。

所以,現在當您爲Timer創建ActionListener時,您可以在Window中將其作爲ActionListener的參數傳遞。

編輯:

的建議通過MRE是簡單和直接的,容易在很多情況下使用(並可能在這種情況下,更好的解決方案)。

我的建議稍微複雜一些,但它向您介紹了SwingUtilities方法,它最終將允許您編寫更多可重用的代碼,這些代碼可能會被您可能創建的任何框架或對話框使用。

一個簡單的例子是這樣的:

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

當然你想停止計時時winow達到一定的最小尺寸。我將把這些代碼留給你。

+0

請你可以進一步解釋一下......我對Java很有點新鮮感。 – Thusitha

+0

清除並正確+1 – mKorbel

+0

@Thusitha,請參閱編輯。 – camickr