Java 带有 JFrame 和 JButton 的 ActionListener
Java ActionListener with JFrame and JButtons
有人能告诉我为什么我的 ActionListener 不工作吗?
我用 JFrame 创建了一个窗口,用 JButton 创建了一些按钮。
是否需要 JPanel?
我想更改 window 的背景颜色。这是行不通的。如果我尝试 buttonz[0].setBackground(Color.red);
只有按钮的颜色会改变。但我想更改 window.
的背景
public class ColorButtons implements Runnable {
public static void main(String args[]) {
new ColorButtons().init();
}
public void init() {
//Creating window
JFrame frame = new JFrame();
frame.setVisible (true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1000,400);
frame.setLayout(new FlowLayout(FlowLayout.CENTER,100,100));
//creating buttons
JButton[] buttonz = {
new JButton("Red"),
new JButton("Yellow"),
new JButton("Blue"),
new JButton("Green")};
//adding my buttons
for (int i = 0; i < buttonz.length; i++) {
frame.add(buttonz[i]);
final int j = i;
buttonz[i].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
switch (j) {
case 0:
frame.setBackground(Color.red);
break;
case 1:
frame.setBackground(Color.yellow);
break;
case 2:
frame.setBackground(Color.blue);
break;
default:
frame.setBackground(Color.green);
break;
}
}
});
}
}
@Override
public void run() {
}
}
您需要设置 JFrame 的 contentPane 的颜色,而不是 JFrame 本身,因为实际上是 contentPane 持有您的 JButton。所以:
@Override
public void actionPerformed(ActionEvent e) {
switch (j) {
case 0:
frame.getContentPane().setBackground(Color.red);
break;
case 1:
frame.getContentPane().setBackground(Color.yellow);
break;
case 2:
frame.getContentPane().setBackground(Color.blue);
break;
default:
frame.getContentPane().setBackground(Color.green);
break;
}
}
考虑
- 将所有内容放入其自己的 JPanel 并为 JPanel 着色
- 让按钮的监听器 "smarter" 通过让他们保持您想要将背景更改为的颜色,例如:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class ColorButtons2 extends JPanel {
public ColorButtons2() {
int ebGap = 80;
setBorder(BorderFactory.createEmptyBorder(ebGap, ebGap, ebGap, ebGap));
setLayout(new GridLayout(1, 0, ebGap/2, 0));
add(new JButton(new ColorAction("Red", Color.RED)));
add(new JButton(new ColorAction("Yellow", Color.YELLOW)));
add(new JButton(new ColorAction("Blue", Color.BLUE)));
add(new JButton(new ColorAction("Green", Color.GREEN)));
}
private class ColorAction extends AbstractAction {
private Color color;
public ColorAction(String name, Color color) {
super(name);
this.color = color;
}
@Override
public void actionPerformed(ActionEvent e) {
setBackground(color);
}
}
private static void createAndShowGui() {
ColorButtons2 mainPanel = new ColorButtons2();
JFrame frame = new JFrame("ColorButtons2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
有人能告诉我为什么我的 ActionListener 不工作吗? 我用 JFrame 创建了一个窗口,用 JButton 创建了一些按钮。
是否需要 JPanel?
我想更改 window 的背景颜色。这是行不通的。如果我尝试 buttonz[0].setBackground(Color.red);
只有按钮的颜色会改变。但我想更改 window.
public class ColorButtons implements Runnable {
public static void main(String args[]) {
new ColorButtons().init();
}
public void init() {
//Creating window
JFrame frame = new JFrame();
frame.setVisible (true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1000,400);
frame.setLayout(new FlowLayout(FlowLayout.CENTER,100,100));
//creating buttons
JButton[] buttonz = {
new JButton("Red"),
new JButton("Yellow"),
new JButton("Blue"),
new JButton("Green")};
//adding my buttons
for (int i = 0; i < buttonz.length; i++) {
frame.add(buttonz[i]);
final int j = i;
buttonz[i].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
switch (j) {
case 0:
frame.setBackground(Color.red);
break;
case 1:
frame.setBackground(Color.yellow);
break;
case 2:
frame.setBackground(Color.blue);
break;
default:
frame.setBackground(Color.green);
break;
}
}
});
}
}
@Override
public void run() {
}
}
您需要设置 JFrame 的 contentPane 的颜色,而不是 JFrame 本身,因为实际上是 contentPane 持有您的 JButton。所以:
@Override
public void actionPerformed(ActionEvent e) {
switch (j) {
case 0:
frame.getContentPane().setBackground(Color.red);
break;
case 1:
frame.getContentPane().setBackground(Color.yellow);
break;
case 2:
frame.getContentPane().setBackground(Color.blue);
break;
default:
frame.getContentPane().setBackground(Color.green);
break;
}
}
考虑
- 将所有内容放入其自己的 JPanel 并为 JPanel 着色
- 让按钮的监听器 "smarter" 通过让他们保持您想要将背景更改为的颜色,例如:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class ColorButtons2 extends JPanel {
public ColorButtons2() {
int ebGap = 80;
setBorder(BorderFactory.createEmptyBorder(ebGap, ebGap, ebGap, ebGap));
setLayout(new GridLayout(1, 0, ebGap/2, 0));
add(new JButton(new ColorAction("Red", Color.RED)));
add(new JButton(new ColorAction("Yellow", Color.YELLOW)));
add(new JButton(new ColorAction("Blue", Color.BLUE)));
add(new JButton(new ColorAction("Green", Color.GREEN)));
}
private class ColorAction extends AbstractAction {
private Color color;
public ColorAction(String name, Color color) {
super(name);
this.color = color;
}
@Override
public void actionPerformed(ActionEvent e) {
setBackground(color);
}
}
private static void createAndShowGui() {
ColorButtons2 mainPanel = new ColorButtons2();
JFrame frame = new JFrame("ColorButtons2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}