Чего мне не хватает в ActionListener? - PullRequest
2 голосов
/ 14 февраля 2012

Мне нужно предвосхитить это, нам не разрешено использовать 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 ]

3 голосов
/ 14 февраля 2012

Измените код ниже:

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

Ошибка очевидна: отображаемая панель построена в основной функции, но панельВы изменяете в соответствии с нажатием кнопки-переключателя, созданной в классе Lab4RadioButtonPanel, они не указывают на один и тот же объект, это проблема.

1 голос
/ 14 февраля 2012

Вызов 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() );
      ...
   }
}
...