繁体   English   中英

我对ActionListener缺少什么?

[英]What am I missing with the ActionListener?

我需要以不允许在课堂上使用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();
    }
}

更改以下代码:

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

我得到如下图所示的结果,我想您会发现程序出了什么问题: 在此处输入图片说明

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

repaint()之后,不会调用paintComponent调用。 有两个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() );
      ...
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM