0

JFrame の 2 つのボタンにアクション リスナーを実装しようとしていますが、問題は 2 つのボタンのうちの 1 つが両方の機能を実行していることです。しかし、私はそうするように構成していません。サンプルコードを見つけてください:-

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class MyChangingCirlce implements ActionListener{
JButton colorButton, labelButton;
JLabel myLabel;
MyDrawPanel mdp;
JFrame frame;
   public static void main(String [] args)
   {
    MyChangingCirlce mcc = new MyChangingCirlce();
    mcc.createFrame();
   } 

  public void createFrame()
  {
frame = new JFrame();
colorButton = new JButton("Changing Colors");
labelButton = new JButton("Change Label");
myLabel = new JLabel("BA");
mdp = new MyDrawPanel();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


frame.getContentPane().add(BorderLayout.CENTER, mdp);   
frame.getContentPane().add(BorderLayout.SOUTH,colorButton); 
frame.getContentPane().add(BorderLayout.EAST,labelButton);  
frame.getContentPane().add(BorderLayout.WEST,myLabel);
colorButton.addActionListener(this);
labelButton.addActionListener(this);    
frame.setSize(300,300);
frame.setVisible(true);

  } // end of createFrame Method


public void actionPerformed(ActionEvent e)
{
if(e.getSource()== colorButton)
{
frame.repaint();        
}
else
{
myLabel.setText("AB");
}

}   //end of interface method...

}

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MyDrawPanel extends JPanel{

public void paintComponent(Graphics g)
{
    int red = (int) (Math.random() * 255);
    int green = (int) (Math.random() * 255);
    int blue= (int) (Math.random() * 255);
    Color randomColor = new Color(red,green,blue);
    g.setColor(randomColor);
    g.fillOval(20,70,100,100);
}

}

4

1 に答える 1

2

ifボタンがandelseステートメントの両方をトリガーすると思いますが、そうではありません。次の方法でコードを調整するとします。

  • setColor、またはクラスchangeColorに似たものを追加しますMyDrawPanel
  • ランダムな色の代わりに固定色を使用する方法を調整MyDrawPanel#paintComponentし、最初のステップで作成した方法でのみ色を調整します
  • 色変更ボタンは、最初のステップで作成したメソッドを使用して、MyDrawPanel

問題はpaintComponent、Swing 自体から呼び出すことができるということです。呼び出したときに呼び出されるだけではありませんrepaint(これは良いことです。そうしないと、Swing コンポーネント用に記述したすべてのコードが呼び出しでいっぱいになりrepaintます)。

補足:メソッドをオーバーライドするときは、同様paintComponentに呼び出すことをお勧めしますsuper.paintComponent

于 2012-07-25T19:12:25.573 に答える