ActionListener我缺少什么?

时间:2012-02-14 02:46:21

标签: java swing actionlistener paintcomponent

我需要在前面加上我们不允许在课堂上使用IDE。我显然缺少一些重要的东西。我正在编写一个程序,允许用户单击一个单选按钮,然后将“灯”更改为该颜色。我以为我正确地连接了听众,但显然我忘了什么。有人可以帮我这个吗?

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

public class Lab4Frame extends JFrame {
    //public boolean red, yellow, green;
    Lab4Frame(){
        this.setLayout(new BorderLayout());
        setTitle("Lab 4 - Application #1");
        Lab4Panel p = new Lab4Panel();
        Lab4RadioButtonPanel p2 = new Lab4RadioButtonPanel();

        add(p, BorderLayout.CENTER);
        add(p2, BorderLayout.SOUTH);
    }

    public static void main(String[] args){

            Lab4Frame frame = new Lab4Frame();
            frame.setTitle("Lab4 Application # 1");
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(600, 600);
            frame.setVisible(true);
    }

}

class Lab4RadioButtonPanel extends JPanel {
        Lab4Panel canvas = new Lab4Panel();
        //Lab4RadioButtonPanel canvas2 = new Lab4RadioButtonPanel();

    public Lab4RadioButtonPanel() {
        boolean red, green, yellow;
        this.setLayout(new FlowLayout());
        JRadioButton jrbRed = new JRadioButton("Red", true);
        JRadioButton jrbYellow = new JRadioButton("Yellow");
        JRadioButton jrbGreen = new JRadioButton("Green");

        this.setBorder(BorderFactory.createLineBorder(Color.black));

        ButtonGroup group = new ButtonGroup();
        group.add(jrbRed);
        group.add(jrbYellow);
        group.add(jrbGreen);


        this.add(jrbRed);
        this.add(jrbYellow);
        this.add(jrbGreen);

        jrbRed.addActionListener(new RedListener(canvas));
        jrbYellow.addActionListener(new YellowListener(canvas));
        jrbGreen.addActionListener(new GreenListener(canvas));
    }
}

class Lab4Panel extends JPanel{

    public Lab4Panel(){}

    boolean red, green, yellow;
    int radius = 5;
    int x = -1;
    int y = -1;

    public void setRed(){
        red = true;
        repaint();
    }

    public void setYellow(){
        yellow = true;
        repaint();
    }

    public void setGreen(){
        green = true;
        repaint();
    }

    protected void paintComponent(Graphics g){
        if (x<0 || y<0) {
            x = getWidth() / 2 - radius;
            y = getHeight() / 2 - radius;
        }
        super.paintComponent(g);
        g.drawRect(x - 10,y - 90, 40, 120);
        g.drawRect(x - 5,y - 90, 40, 120);
        g.setColor(Color.RED);
        g.drawOval(x,y - 80, 4 * radius, 4 * radius);
        g.setColor(Color.YELLOW);
        g.drawOval(x,y - 40, 4 * radius, 4 * radius);
        g.setColor(Color.GREEN);
        g.drawOval(x,y, 4 * radius, 4 * radius);


        if(red){
            g.setColor(Color.RED);
            g.fillOval(x,y - 80, 4 * radius, 4 * radius);
            repaint();
        }

        else if (yellow){
            g.setColor(Color.YELLOW);
            g.fillOval(x,y - 40, 4 * radius, 4 * radius);
            repaint();
        }

        if(green){
            g.setColor(Color.GREEN);
            g.fillOval(x,y, 4 * radius, 4 * radius);
            repaint();
        }

    }


}

class RedListener implements ActionListener{
    //private Lab4RadioButtonPanel canvas;
    private Lab4Panel canvas;

    RedListener(Lab4Panel canvas) {
     this.canvas = canvas;
    }

    public void actionPerformed(ActionEvent e){
        canvas.setRed();
    }
}

class YellowListener implements ActionListener{
    private Lab4Panel canvas;

    YellowListener(Lab4Panel canvas) {
     this.canvas = canvas;
    }

    public void actionPerformed(ActionEvent e){
        canvas.setYellow();
    }
}

class GreenListener implements ActionListener{
    //private Lab4RadioButtonPanel canvas;
    private Lab4Panel canvas;

    GreenListener(Lab4Panel canvas) {
     this.canvas = canvas;
    }

    public void actionPerformed(ActionEvent e){
        canvas.setGreen();
    }
}

2 个答案:

答案 0 :(得分:3)

更改以下代码:

class Lab4RadioButtonPanel extends JPanel {
    Lab4Panel canvas = new Lab4Panel();
    //Lab4RadioButtonPanel canvas2 = new Lab4RadioButtonPanel();

    public Lab4RadioButtonPanel() {

class Lab4RadioButtonPanel extends JPanel {
    Lab4Panel canvas;
    //Lab4RadioButtonPanel canvas2 = new Lab4RadioButtonPanel();

    public Lab4RadioButtonPanel(Lab4Panel canvas) {
        this.canvas = canvas;

并更改以下代码:

Lab4Panel p = new Lab4Panel();
Lab4RadioButtonPanel p2 = new Lab4RadioButtonPanel();

为:

Lab4Panel p = new Lab4Panel();
Lab4RadioButtonPanel p2 = new Lab4RadioButtonPanel(p);

我得到如下图所示的结果,我想你会得到你的程序有什么问题: enter image description here

错误很明显:您显示的面板是在main函数中构建的,但是您根据单击单选按钮更改的面板是在Lab4RadioButtonPanel类中构造的,它们不指向同一个对象,这就是问题所在。

答案 1 :(得分:1)

paintComponent之后未调用repaint()来电。有两个Lab4Panels。您设置侦听器的那个不是您正在绘制的那个。

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

class Lab4Frame extends JFrame
{
   Lab4Frame()
   {
      this.setLayout( new BorderLayout() );
      setTitle( "Lab 4 - Application #1" );
      Lab4Panel p = new Lab4Panel();
      Lab4RadioButtonPanel p2 = new Lab4RadioButtonPanel(p);

      add( p, BorderLayout.CENTER );
      add( p2, BorderLayout.SOUTH );
   }

   ...
}

class Lab4RadioButtonPanel extends JPanel
{
    Lab4Panel canvas;

   public Lab4RadioButtonPanel(Lab4Panel p)
   {
      canvas = p;
      this.setLayout( new FlowLayout() );
      ...
   }
}