2011-08-07 14 views
5

私のプログラムでボタンを押したときにJFrameをハーフサイズにするアニメーションを作成したいと思います。私は最も簡単な方法は、タイマーにJFrameの現在の境界を入れて、タイマーrunning.But netbeans IDEで新しいタイマーを宣言するときに、このようになります1で1を減らしていると思う。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 

      } 

     } 
    }); 

しかし、問題はここにある「これは」私も、それは別のwindow.Canの誰もが、私はこの問題を解決するために私を与える私のJFrame.Becauseの新しいオブジェクトを作成カントもJFrame.Andに参照のうえではありませんか? 。

+1

'frame.getWidth()'を試してください。ここで 'frame'はあなたが参照しているJFrameです。 – fireshadow52

答えて

5

int width = Foo.this.getWidth(); 

どこFooサブクラスJFrameを試してみてください。

+0

Lol ...ありがとうございました...しかし、うまくいきません..../ – Thusitha

+0

@Thusitha、 'JFrame'を' JFrame'をサブクラス化するクラスの名前に置き換えてください。 – mre

+2

タイマーコードがメインクラスの内部にあり、メインクラスがJFrameをサブクラス化している場合(この回答に対して1+ upvote)、camickrの推奨事項はこれらの制限に関係なく動作します(Camickrの回答に1+以上)。 –

5

私はあなたがボタンへのアクセス権を持っているボタンをクリックしたときに私は私のプログラムで

をボタンを押すと、ハーフサイズになるためのJFrameをアニメーション化します。次に、使用することができます:

SwingUtilities.windowForComponent(theButton); 

フレームへの参照を取得します。

これで、TimerのActionListenerを作成するときに、WindowにActionListenerの引数として渡すことができます。

編集:MREによって

提案は、シンプルでまっすぐ進むと、多くの場合、使いやすい(そしておそらく、この場合は、よりよい解決策)。

私の提案はもう少し複雑ですが、SwingUtilitiesメソッドを紹介しています。これにより、作成するフレームやダイアログで使用される可能性のある再利用可能なコードを書くことができます。 winowは、特定の最小サイズに達したときに、タイマーを停止したいと思う。もちろん、

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

簡単な例は次のようになります。私はそのコードをあなたに任せます。

+0

あなたはそれをさらに説明できますか...私はかなりJavaの新しいです。 – Thusitha

+0

明確で正しい+1 – mKorbel

+0

@Thusitha、編集を参照してください。 – camickr

関連する問題