使用JButton更改JFrame中的背景颜色

时间:2014-06-11 01:46:18

标签: java swing colors jbutton

我正在编写一个使用JButton的程序。当用户单击按钮时,背景应更改颜色,但无法从actionPerformed()方法访问JFrame。有人可以告诉我如何让它发挥作用吗?

import java.awt.event.*; 
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
public class HandlerClass implements ActionListener{

  public static void main(String[] args){
    HandlerClass handler = new HandlerClass();
     final JFrame f = new JFrame("Testing out these JPanels");
     f.setSize(400, 100); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLocationRelativeTo(null); 
     f.setLayout(new GridLayout(2, 3));
     JButton b = new JButton("button 1");
     b.addActionListener(new HandlerClass());
     JButton butt = new JButton("button 2");

     JButton bug = new JButton("button 3");

     JButton button = new JButton("button 4");

     JButton button5 = new JButton("button 5");

     JButton button6 = new JButton("button 6");

     JPanel p = new JPanel();
     p.setVisible(true);
     JPanel pnl = new JPanel();
     p.add(b);
     p.add(butt);
     p.add(bug);
     pnl.add(button);
     pnl.add(button5);
     pnl.add(button6);
     f.add(p, BorderLayout.CENTER);
     f.add(pnl, BorderLayout.SOUTH);
     f.setVisible(true);
     f.setBackground(Color.RED);
   }
     public void actionPerformed(ActionEvent e){
        f.setBackground(Color.WHITE);
       }

     }

3 个答案:

答案 0 :(得分:4)

  1. 不要将所有代码都写在一个巨大的main方法中。这是排名初学者计划,如果你希望你的代码比hello world更多,那么你将不得不把它变成一个真正的OOPs程序。
  2. 使用非静态字段和方法创建一个类。
  3. 让ActionListener调用一个方法,该方法在其主体中更改主JPanel的背景颜色,即添加到JFrame的contentPane的颜色。
  4. 考虑使用匿名内部侦听器类,然后将侦听器代码的内容卸载到GUI或控件类中的单独方法中。

答案 1 :(得分:2)

你几乎没有选择:

  1. JFrame实例移到主体外部,使其成为实例变量

    public class HandlerClass {
        private JFrame frame;
    
        public HandlerClass() {
            ...
        }
    }
    
  2. ActionListener移到同一方法中:

    public class HandlerClass {
        public HandlerClass() {
            final JFrame frame = new JFrame();
            JButton button = new JButton();
            ...
            button.addActionListener(new ActionerListener() {
                @Override
                public void actionPerformed(ActionEvent e){
                    frame.setBackground(Color.WHITE);
                }
            }
        }
    }
    

    第二种选择的唯一问题是,您必须使用frame修饰符final来{{1}}进行引用。

  3. 执行上述两项操作。

答案 2 :(得分:0)

你的问题:

JFrame can't be accessed from the actionPerformed()

解决方案是,您无法从其他方法访问本地变量 看看herehere

现在重要的是: 您的JPanel上有两个JFrame。因此,如果您更改JFrame的颜色,那么您将无法使用。{1}} 看到颜色变化。所以我的建议是改变JPanel的颜色。 以下面的代码为例:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class HandlerClass extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    HandlerClass frame = new HandlerClass();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public HandlerClass() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        GridBagLayout gbl_contentPane = new GridBagLayout();
        gbl_contentPane.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 0};
        gbl_contentPane.rowHeights = new int[]{0, 0, 0, 0};
        gbl_contentPane.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
        gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE};
        contentPane.setLayout(gbl_contentPane);

        JButton btnRed = new JButton("Red");
        GridBagConstraints gbc_btnRed = new GridBagConstraints();
        gbc_btnRed.insets = new Insets(0, 0, 5, 5);
        gbc_btnRed.gridx = 3;
        gbc_btnRed.gridy = 1;
        contentPane.add(btnRed, gbc_btnRed);

        JButton btnBlue = new JButton("Blue");
        GridBagConstraints gbc_btnBlue = new GridBagConstraints();
        gbc_btnBlue.insets = new Insets(0, 0, 5, 0);
        gbc_btnBlue.gridx = 5;
        gbc_btnBlue.gridy = 1;
        contentPane.add(btnBlue, gbc_btnBlue);

        JButton btnWhite = new JButton("White");
        GridBagConstraints gbc_btnWhite = new GridBagConstraints();
        gbc_btnWhite.insets = new Insets(0, 0, 0, 5);
        gbc_btnWhite.gridx = 3;
        gbc_btnWhite.gridy = 2;
        contentPane.add(btnWhite, gbc_btnWhite);

        JButton btnGreen = new JButton("Green");
        GridBagConstraints gbc_btnGreen = new GridBagConstraints();
        gbc_btnGreen.gridx = 5;
        gbc_btnGreen.gridy = 2;
        contentPane.add(btnGreen, gbc_btnGreen);

        btnRed.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                contentPane.setBackground(Color.red);

            }
        });
        btnBlue.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                contentPane.setBackground(Color.blue);
            }
        });
        btnWhite.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                contentPane.setBackground(Color.WHITE);

            }
        });
        btnGreen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                contentPane.setBackground(Color.green);
            }
        });

        pack();
    }

}

截屏: enter image description here