我仍然不熟悉使用Swing并在Java中创建GUI。我正在研究一个简单的测试代码,按下时按钮的颜色会变成随机颜色。虽然它有效,但每次按下按钮时,它都会最小化前一个窗口并打开一个新窗口并且它们会不断堆积。我怎么做到这样才不会发生这种情况?这是因为我在actionPerformed方法中创建了一个对象吗?我创建一个对象的原因是为了操作按钮变量,将Swing类与我所做的单独的Action类链接起来。
因此,我的两个问题是:
非常感谢任何帮助!
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.*;
public class Swing extends JFrame{
private JFrame f;
private JLabel l;
private JButton b;
private JPanel p;
public Swing(){
test();
}
//*
public JFrame getJFrame(){
return f;
}
public JLabel getJLabel(){
return l;
}
public JButton getJButton(){
return b;
}
public JPanel getJPanel(){
return p;
}
//*
public void test(){
// Frame Setup
f = new JFrame("Frame");
f.setVisible(true);
f.setSize(500, 500);
f.setResizable(true);
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
//
// Panel Setup
p = new JPanel();
p.setVisible(true);
//
// Other
b = new JButton("Button");
l = new JLabel("Label");
b.addActionListener(new Action());
//
// Additions
p.add(b);
p.add(l);
f.add(p); // ***
//
}
public static void main(String[] args){
Swing swing = new Swing();
swing.test();
}
}
final class Action implements ActionListener{
public void actionPerformed(ActionEvent e){
Swing swingObject = new Swing(); //
JButton button = swingObject.getJButton(); //
button.setBackground(randomColor());
}
public Color randomColor(){
Random rn = new Random();
ArrayList<Color> color = new ArrayList<Color>();
color.add(Color.BLUE);
color.add(Color.GREEN);
color.add(Color.RED);
color.add(Color.YELLOW);
color.add(Color.PINK);
color.add(Color.CYAN);
color.add(Color.ORANGE);
color.add(Color.MAGENTA);
int s = color.size();
int random = rn.nextInt(s);
return color.get(random);
}
}
答案 0 :(得分:3)
从你的听众那里,你正在执行
Swing swingObject = new Swing();
这可以做它应该做的:创建一个新的Swing JFrame。您不需要新的JFrame,因此不要调用其构造函数。从侦听器中,只需获取触发事件的按钮,然后更改其颜色:
JButton button = (JButton) e.getSource();
button.setBackground(randomColor());
您还可以在创建侦听器时传递按钮进行修改:
class Action implements ActionListener{
private JButton buttonToUpdate;
public Action(JButton buttonToUpdate) {
this.buttonToUpdate = buttonToUpdate;
}
public void actionPerformed(ActionEvent e){
buttonToUpdate.setBackground(randomColor());
}
}
并且,创建它:
b = new JButton("Button");
b.addActionListener(new Action(b));