使用按钮更改背景的GUI应用程序

时间:2014-12-02 16:42:21

标签: java user-interface jframe jpanel jbutton

我正在尝试创建一个包含标签和按钮的Java GUI应用程序。单击该按钮时,第一个面板的背景颜色会发生变化。我有标签和按钮,但每次单击按钮时都会出错。此外,我希望第一个面板最初具有黄色背景,然后切换到任何颜色。这是我的代码:

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;

public class ChangeDemo extends JFrame implements ActionListener 
{
public static final int WIDTH = 300;
public static final int HEIGHT= 200;
private JPanel biggerPanel;

public static void main(String[] args) 
{
    ChangeDemo gui = new ChangeDemo();
    gui.setVisible(true);
}

public ChangeDemo()
{
    super ("ChangeBackgroundDemo");
    setSize(WIDTH,HEIGHT);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new GridLayout(2,3));      

    JPanel biggerPanel = new JPanel();
    biggerPanel.setLayout(new BorderLayout());
    biggerPanel.setBackground(Color.YELLOW);

    JLabel namePanel = new JLabel("Click the button to change the background color");
    biggerPanel.add(namePanel, BorderLayout.NORTH);


    add(namePanel);
    JPanel buttonPanel = new JPanel();
    buttonPanel.setLayout(new FlowLayout());
    buttonPanel.setBackground(Color.LIGHT_GRAY);

    JButton changeButton = new JButton("Change Color");
    changeButton.addActionListener(this);
    buttonPanel.add(changeButton);

    add(buttonPanel); 
}

 public void actionPerformed(ActionEvent e)
{
    String buttonString = e.getActionCommand();

    if(buttonString.equals("Change Color"))
        biggerPanel.setBackground(Color.RED);            
    else
        System.out.println("Unexpected Error!");
}




}

2 个答案:

答案 0 :(得分:0)

这是基于代码修正的工作演示,没有时间整理它,但希望你能得到它的要点。问题是你没有将面板添加到边框(北,南等)以便为它们着色。希望这会有所帮助。

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;

public class ChangeDemo extends JFrame implements ActionListener 
{
public static final int WIDTH = 300;
public static final int HEIGHT= 200;
private JPanel biggerPanel = new JPanel();
private JPanel namePanel = new JPanel();

public static void main(String[] args) 
{
    ChangeDemo gui = new ChangeDemo();
    gui.setVisible(true);
}

public ChangeDemo()
{
super ("ChangeBackgroundDemo");
setSize(WIDTH,HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(2,3));      

//JPanel biggerPanel = new JPanel();
this.biggerPanel.setLayout(new BorderLayout());
this.biggerPanel.setBackground(Color.YELLOW);

JLabel nameLabel = new JLabel("Click the button to change the background color");
namePanel.add(nameLabel);
namePanel.setBackground(Color.YELLOW);
//this.biggerPanel.add(namePanel, BorderLayout.NORTH);


add(namePanel);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());
buttonPanel.setBackground(Color.LIGHT_GRAY);

JButton changeButton = new JButton("Change Color");
changeButton.addActionListener(this);
changeButton.setActionCommand("Change Color");
buttonPanel.add(changeButton);

add(buttonPanel); 
}

 public void actionPerformed(ActionEvent e)
{
    String buttonString = e.getActionCommand();
        if(buttonString.equals("Change Color"))
            this.namePanel.setBackground(Color.RED);            
        else
        System.out.println("Unexpected Error!");
}

}

答案 1 :(得分:0)

我对您的代码进行了一些更改。

首先,您必须通过调用SwingUtilities.invokeLater启动Swing应用程序。

public static void main(String[] args) {
    SwingUtilities.invokeLater(new ChangeDemo());
}

其次,您使用Swing组件。当您想要覆盖Swing组件的方法时,只需扩展Swing组件。

第三,我专门为你的JButton做了一个动作监听器。这样,您就不必检查特定的JButton字符串。您可以根据GUI的需要创建任意数量的动作侦听器。

    JButton changeButton = new JButton("Change Color");
    changeButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            isYellow = !isYellow;

            if (isYellow) buttonPanel.setBackground(Color.YELLOW);
            else buttonPanel.setBackground(Color.RED);
        }
    });

最后,我改变了JButton面板的背景颜色。

这是整个ChangeDemo课程。

package com.ggl.testing;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ChangeDemo implements Runnable {

    private boolean isYellow;

    private JFrame frame;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new ChangeDemo());
    }

    @Override
    public void run() {
        frame = new JFrame("Change Background Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));

        JPanel namePanel = new JPanel();
        JLabel nameLabel = new JLabel(
                "Click the button to change the background color");
        nameLabel.setAlignmentX(JLabel.CENTER_ALIGNMENT);
        namePanel.add(nameLabel);

        mainPanel.add(namePanel);

        final JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new FlowLayout());
        buttonPanel.setBackground(Color.YELLOW);
        isYellow = true;

        JButton changeButton = new JButton("Change Color");
        changeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                isYellow = !isYellow;

                if (isYellow) buttonPanel.setBackground(Color.YELLOW);
                else buttonPanel.setBackground(Color.RED);
            }
        });

        buttonPanel.add(changeButton);

        mainPanel.add(buttonPanel);

        frame.add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

}