如何使用 actionListener 更改 JButton 的颜色
How do I change the color of a JButton with actionListener
我有以下 JFrame。
enter image description here
它包含一个JButton[100]的方形和圆形JButtons。我想在单击它们时更改它们的颜色。所以我为此使用 actionListener。但是当我编写 actionListener 来更改颜色时,它给了我一个例外
线程“AWT-EventQueue-0”中的异常java.lang.ArrayIndexOutOfBoundsException:索引 100 超出长度 100
它说异常在 b[i].setBackground(Color.blue);在 actionListener 中。
我搜索了很多,没有任何东西改变颜色,只是给出了例外。
这是我的代码
Subject.java
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.*;
public class Subject extends JFrame{
public Subject() {
super("Subject");
p = new JPanel(new GridLayout(10,10));
b = new JButton[100];
Random r = new Random();
for(i=0;i<100;i++) {
y = r.nextInt(2) +1;
if(y==1) {
b[i] = new JButton();
b[i].setBackground(Color.black);
b[i].setPreferredSize(new Dimension(35,35));
p.add(b[i]);
}else {
b[i] = new Circle();
b[i].setBackground(Color.black);
p.add(b[i]);
}
b[i].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
b[i].setBackground(Color.blue);
}
});
}
add(p);
pack();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocation(100,200);
}
private JPanel p;
private JButton[] b;
private int i, y;
}
Circle.java
import java.awt.*;
import java.awt.geom.Ellipse2D;
import javax.swing.*;
public class Circle extends JButton{
public Circle() {
setBackground(Color.red);
setFocusable(false);
/*
These statements enlarge the button so that it
becomes a circle rather than an oval.
*/
Dimension size = getPreferredSize();
size.width = size.height = Math.min(35,35);
setPreferredSize(size);
/*
This call causes the JButton not to paint the background.
This allows us to paint a round background.
*/
setContentAreaFilled(false);
}
protected void paintComponent(Graphics g) {
if (getModel().isArmed()) {
g.setColor(Color.yellow);
} else {
g.setColor(getBackground());
}
g.fillOval(0, 0, getSize().width - 1, getSize().height - 1);
JLabel l = new JLabel("Click Me");
super.paintComponent(g);
}
protected void paintBorder(Graphics g) {
g.setColor(Color.darkGray);
g.drawOval(0, 0, getSize().width - 1, getSize().height - 1);
}
// Hit detection.
Shape shape;
public boolean contains(int x, int y) {
// If the button has changed size, make a new shape object.
if (shape == null || !shape.getBounds().equals(getBounds())) {
shape = new Ellipse2D.Float(0, 0, getWidth(), getHeight());
}
return shape.contains(x, y);
}
}
我也尝试了以下但没有任何改变。
b[i].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource()==b[i])
{
b[i].setBackground(Color.blue);
}
}
});
有人对如何修复它有任何建议吗?谢谢!
只需更改 actionPerformed()
方法中的以下行...
b[i].setBackground(Color.blue);
对此...
((JButton) e.getSource()).setBackground(Color.blue);
您正在为每个 JButton
创建一个单独的匿名 class(实现 ActionListener
接口)。因此,ActionEvent
源 只能 是您为其创建匿名 class 的 JButton
。
请注意,编译 java 代码后,每个 ActionListener
都会有一个单独的 class 文件。 class 文件名将以 Subject$
开头并以 .class
结尾,例如:
Subject.class
Subject.class
Subject.class
至少会有 100 个这样的 class,因为您已经为每个 JButton
创建了一个。
我有以下 JFrame。 enter image description here
它包含一个JButton[100]的方形和圆形JButtons。我想在单击它们时更改它们的颜色。所以我为此使用 actionListener。但是当我编写 actionListener 来更改颜色时,它给了我一个例外
线程“AWT-EventQueue-0”中的异常java.lang.ArrayIndexOutOfBoundsException:索引 100 超出长度 100
它说异常在 b[i].setBackground(Color.blue);在 actionListener 中。 我搜索了很多,没有任何东西改变颜色,只是给出了例外。 这是我的代码
Subject.java
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.*;
public class Subject extends JFrame{
public Subject() {
super("Subject");
p = new JPanel(new GridLayout(10,10));
b = new JButton[100];
Random r = new Random();
for(i=0;i<100;i++) {
y = r.nextInt(2) +1;
if(y==1) {
b[i] = new JButton();
b[i].setBackground(Color.black);
b[i].setPreferredSize(new Dimension(35,35));
p.add(b[i]);
}else {
b[i] = new Circle();
b[i].setBackground(Color.black);
p.add(b[i]);
}
b[i].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
b[i].setBackground(Color.blue);
}
});
}
add(p);
pack();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocation(100,200);
}
private JPanel p;
private JButton[] b;
private int i, y;
}
Circle.java
import java.awt.*;
import java.awt.geom.Ellipse2D;
import javax.swing.*;
public class Circle extends JButton{
public Circle() {
setBackground(Color.red);
setFocusable(false);
/*
These statements enlarge the button so that it
becomes a circle rather than an oval.
*/
Dimension size = getPreferredSize();
size.width = size.height = Math.min(35,35);
setPreferredSize(size);
/*
This call causes the JButton not to paint the background.
This allows us to paint a round background.
*/
setContentAreaFilled(false);
}
protected void paintComponent(Graphics g) {
if (getModel().isArmed()) {
g.setColor(Color.yellow);
} else {
g.setColor(getBackground());
}
g.fillOval(0, 0, getSize().width - 1, getSize().height - 1);
JLabel l = new JLabel("Click Me");
super.paintComponent(g);
}
protected void paintBorder(Graphics g) {
g.setColor(Color.darkGray);
g.drawOval(0, 0, getSize().width - 1, getSize().height - 1);
}
// Hit detection.
Shape shape;
public boolean contains(int x, int y) {
// If the button has changed size, make a new shape object.
if (shape == null || !shape.getBounds().equals(getBounds())) {
shape = new Ellipse2D.Float(0, 0, getWidth(), getHeight());
}
return shape.contains(x, y);
}
}
我也尝试了以下但没有任何改变。
b[i].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource()==b[i])
{
b[i].setBackground(Color.blue);
}
}
});
有人对如何修复它有任何建议吗?谢谢!
只需更改 actionPerformed()
方法中的以下行...
b[i].setBackground(Color.blue);
对此...
((JButton) e.getSource()).setBackground(Color.blue);
您正在为每个 JButton
创建一个单独的匿名 class(实现 ActionListener
接口)。因此,ActionEvent
源 只能 是您为其创建匿名 class 的 JButton
。
请注意,编译 java 代码后,每个 ActionListener
都会有一个单独的 class 文件。 class 文件名将以 Subject$
开头并以 .class
结尾,例如:
Subject.class
Subject.class
Subject.class
至少会有 100 个这样的 class,因为您已经为每个 JButton
创建了一个。