[英]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.