【问题标题】:Java ActionListener with JFrame and JButtons带有 JFrame 和 JButton 的 Java ActionListener
【发布时间】:2018-10-22 18:23:32
【问题描述】:

有人能告诉我为什么我的 ActionListener 不工作吗? 我用 JFrame 创建了一个寡妇,用 JButton 创建了一些按钮。

需要JPanel吗?

我想更改窗口的背景颜色。这是行不通的。如果我尝试buttonz[0].setBackground(Color.red);,只有按钮的颜色会改变。但我想改变窗口的背景。

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() {

    }

}

【问题讨论】:

  • 请更好地定义“不起作用”。细节很重要。
  • 我想更改窗口的背景颜色。这是行不通的。如果我尝试 buttonz[0].setBackground(Color.red);只有按钮的颜色会改变。但我想改变窗口的背景。
  • edit您对此信息的问题

标签: java swing jframe jbutton actionlistener


【解决方案1】:

您需要设置 JFrame 的 contentPane 的颜色,而不是 JFrame 本身,因为实际上保存 JButton 的是 contentPane。所以:

@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 着色
  • 让按钮的听众“更聪明”,让他们保持您想要将背景更改为的颜色,例如:

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

【讨论】:

猜你喜欢
  • 2012-02-07
  • 1970-01-01
  • 2012-05-09
  • 2017-07-24
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
相关资源
最近更新 更多