2017-01-03 11 views
0

JButtonのdoClick()メソッドはactionPerformedメソッドをトリガーしますが、doClick()メソッドを使用してpaintComponent()をトリガーしたい!助けてください!JButtonのdoClick()メソッド

これはお勧めですか?ここでは、doClick()メソッドのアクションが実行されるたびにテキストが変更されているラベルがあります。しかし残念なことに、paintComponentメソッドはactionPerformed()メソッドと同じ回数を実行しません。これはAnswerとして提案されているコードです。私は実際にデータがファイルから読み込まれているときにdoClick()メソッドをトリガーし、テキストファイルのデータに従って異なる形状がペイントされます。

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
public class myFrame { 
JFrame jFrame; 
myPanel bpanel; 
JButton jbutton; 
int radius; 
JLabel label; 
public myFrame() { 
    jFrame=new JFrame(); 
    bpanel=new myPanel(); 
    jbutton=new JButton("presss"); 
    radius=50; 
    label=new JLabel(radius+" "); 
    bpanel.add(jbutton); 
    bpanel.add(label); 
    jbutton.addActionListener(new myButtonListener()); 
    for (int i=0; i< 5; i++) 
     jbutton.doClick(); 
    jFrame.getContentPane().add(bpanel); 
    jFrame.pack(); 
    jFrame.setVisible(true); 
} 
public class myPanel extends JPanel { 
     public myPanel() { 
      setBackground(Color.cyan); 
      setPreferredSize(new Dimension(300,400)); 
     } 
     public void paintComponent(Graphics g) { 
     System.out.println("paint component triggered"); 
     super.paintComponent(g); 
     g.drawOval(0,0,radius,radius); 
     } 
} 
private class myButtonListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
      radius=radius+20; 
      label.setText(radius+" "); 
      bpanel.repaint(); 
      System.out.println("mouse click event triggered"); 
    } 
} 
public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new myFrame(); 
      } 
     }); 
} 

}

+0

なぜこれが必要ですか?いずれにせよ、ボタンに 'ActionListener'を追加するだけです:' button.addActionListener(e - > repaint()); ' – Moira

+0

あなたのコードは、イベントディスパッチスレッドではなくメインスレッドからGUI操作を呼び出します。無効。初めてコンポーネントを描画する前に、すべての更新を呼び出しています。 – kdgregory

+0

あなたが解決しようとしている*本当の問題は何ですか? – kdgregory

答えて

2

が、私はdoClick()メソッドを使用することによってpaintComponent()をトリガーにしたいです!

スイングコンポーネントは、コンポーネントのプロパティが変更されたときに自分自身を再描画するほどスマートでなければなりません。

たとえば、JLabelでsetText(...)メソッドを使用すると、ラベルは指定されたテキストで再ペイントされます。

ボタンをクリックすると、クラスのメソッドを呼び出すだけでクラスのプロパティを変更する必要があります。そのメソッドではrepaint()を呼び出し、コンポーネントはそれ自身を再描画します。

編集:

N paintComponent法ものactionPerformedと同じ回数(のために実行されるように変更)が

を実行しているコードにはいくつかの問題がある:

  1. doClick()メソッドを呼び出すとフレームが表示されません。フレームが表示された後にのみコンポーネントがペイントされるため、何の効果もありません。したがって、フレームが表示された後にアニメーションコードを実行する必要があります。

  2. ループは使用できません。次の2つのうちの1つが発生します:a)ループが非常に速く実行され、コンポーネントのインクリメンタルペインティングが表示されません。またはb)RepaintManagerにrepaint()要求が行われ、RepaintManagerが各要求を1回のペイント要求。

アニメーションを行いたい場合は、Swing Timerを使用してアニメーションをスケジュールする必要があります。

+0

コードの説明を参照してください....n paintComponentメソッドもactionPerformed()が実行されている回数だけ実行するように変更します。 –

+0

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

+0

助けてくれてありがとう...はい、ループを適用することはrepaint()が一度だけ実行していた問題でした...問題を解決するために別のアプローチを採用しました!ループnでいくつかのオブジェクトを作って解決しました! –