Java Swing和ActionListeners

时间:2014-08-09 21:26:05

标签: java swing jframe actionlistener

我仍然不熟悉使用Swing并在Java中创建GUI。我正在研究一个简单的测试代码,按下时按钮的颜色会变成随机颜色。虽然它有效,但每次按下按钮时,它都会最小化前一个窗口并打开一个新窗口并且它们会不断堆积。我怎么做到这样才不会发生这种情况?这是因为我在actionPerformed方法中创建了一个对象吗?我创建一个对象的原因是为了操作按钮变量,将Swing类与我所做的单独的Action类链接起来。

因此,我的两个问题是:

  • 如何防止出现多个窗口,而是让它们相互替换?
  • 有没有办法在同一个类中使用ActionListener,这会让事情变得更容易吗?

非常感谢任何帮助!

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);

}
}

1 个答案:

答案 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));