每次按下按钮时,我都试图更改 JPanel 的背景颜色

I'm trying to change the background color of a JPanel each time a button is pressed

我已经查看了几个类似的问题,但未能解决这个问题。我正在显示时间并添加了一个计数到 4 并重新开始的计数器,但我只能让它设置开始背景颜色。我在这里错过了什么?我试过将我的 if 语句放在几个地方。除了颜色变化之外的一切都工作正常。

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TimeFrame extends JFrame {
        private static final int FRAME_WIDTH = 250;
        private static final int FRAME_HEIGHT = 200;
        private JButton CurrentTime;
        private JLabel CurrentTimeLabel;
        private JTextField CurrentTimeField;
        private int click;
        private JTextField clicktest;

        public TimeFrame() {
            CurrentTimeLabel = new JLabel("The Current Time is: ");

            createTextField();
            createButton();
            createPanel();

            setSize(FRAME_WIDTH, FRAME_HEIGHT);
            setSize(250, 200);
            initialize();


        }
        private void initialize()
        {
        click = 0;
        }

        private void createTextField()
        {
           final int FIELD_WIDTH = 10;
           CurrentTimeField = new JTextField(FIELD_WIDTH);
           Date now = new Date();
           DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
           CurrentTimeField.setText("" + dateFormat.format(now));

           clicktest = new JTextField(FIELD_WIDTH);
           clicktest.setText(" " + click);

        }
        private void createButton()
        {
            CurrentTime = new JButton("Display Current Time");

            ActionListener listener = new AddCurrentTimeListener();
            CurrentTime.addActionListener(listener);

        }
        private void createPanel()
        {
           JPanel panel = new JPanel();
           //panel.addActionListener(backgroundListener);
           panel.add(CurrentTimeLabel);
           panel.add(CurrentTimeField);
           panel.add(CurrentTime);
           panel.add(clicktest);
           //int click = 0;

           if (click == 0){
                panel.setBackground(Color.ORANGE);
            } 
           else if (click == 1) {
                panel.setBackground(Color.YELLOW);
            } 
           else if (click == 2) {
                panel.setBackground(Color.BLUE);
            } 
           else if (click == 3) {
                panel.setBackground(Color.GREEN);
            } 
           else if (click == 4) {
                panel.setBackground(Color.PINK);
            }

           add(panel);

        }

        class AddCurrentTimeListener implements ActionListener
        {
           public void actionPerformed(ActionEvent event){

               new java.util.Date();
               Date now = new Date();
               DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
               CurrentTimeField.setText("" + dateFormat.format(now));getClass();                                   
               if (click < 4){
                   click++;
               } else  {
                   click = click - 4;}

               clicktest.setText("" + click);getClass();

               /**
               if (click == 0){
                    panel.setBackground(Color.ORANGE);
                } 
               else if (click == 1) {
                    panel.setBackground(Color.YELLOW);
                } 
               else if (click == 2) {
                    panel.setBackground(Color.BLUE);
                } 
               else if (click == 3) {
                    panel.setBackground(Color.GREEN);
                } 
               else if (click == 4) {
                    panel.setBackground(Color.PINK);
                }
               */

               repaint();
               }


            }

}

通过向框架添加 JPanel,您有效地阻止了框架 contentPane,这本身并不是一个特定的问题,除了在您的 ActionListener ,您正在尝试设置框架本身的背景颜色。

现在,这不起作用,因为框架由许多重叠的组件组成。

不会显示对框架背景的任何更改,因为它隐藏在 contentPane 后面。

相反,您应该更改 contentPane 的背景。

好的,但这又把我们带回了第一个问题(JPanel)。现在,您可以使 JPanel 成为一个实例字段并在 ActionListener 中更改它的背景颜色,这样就可以了,或者您可以去掉它并简单地更改框架的 contentPane,这你选择由你决定

对于我这个过于简化的示例,我选择简单地使用框架的 contentPane,因为它展示了一个您需要了解框架的重要概念...

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class TimeFrame extends JFrame {

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TimeFrame().setVisible(true);
            }
        });
    }

    private JButton currentTime;
    private JLabel currentTimeLabel;
    private JTextField currentTimeField;
    private int click;
    private JTextField clicktest;

    public TimeFrame() {
        currentTimeLabel = new JLabel("The Current Time is: ");

        createTextField();
        createButton();
        createPanel();

        pack();
        setLocationRelativeTo(null);
        initialize();

    }

    private void initialize() {
        click = 0;
    }

    private void createTextField() {
        final int FIELD_WIDTH = 10;
        currentTimeField = new JTextField(FIELD_WIDTH);
        Date now = new Date();
        DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
        currentTimeField.setText("" + dateFormat.format(now));

        clicktest = new JTextField(FIELD_WIDTH);
        clicktest.setText(" " + click);

    }

    private void createButton() {
        currentTime = new JButton("Display Current Time");

        ActionListener listener = new AddCurrentTimeListener();
        currentTime.addActionListener(listener);

    }

    private void createPanel() {
        setLayout(new FlowLayout());
        //panel.addActionListener(backgroundListener);
        add(currentTimeLabel);
        add(currentTimeField);
        add(currentTime);
        add(clicktest);
    }

    class AddCurrentTimeListener implements ActionListener {

        public void actionPerformed(ActionEvent event) {

            new java.util.Date();
            Date now = new Date();
            DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
            currentTimeField.setText("" + dateFormat.format(now));
            getClass();
            if (click < 4) {
                click++;
            } else {
                click = click - 4;
            }

            clicktest.setText("" + click);

            if (click == 0) {
                getContentPane().setBackground(Color.ORANGE);
            } else if (click == 1) {
                getContentPane().setBackground(Color.YELLOW);
            } else if (click == 2) {
                getContentPane().setBackground(Color.BLUE);
            } else if (click == 3) {
                getContentPane().setBackground(Color.GREEN);
            } else if (click == 4) {
                getContentPane().setBackground(Color.PINK);
            }
            repaint();
        }

    }

}

免责声明:

就个人而言,我会避免直接从 JFrame 扩展,它会将您锁定在一个用例中并使您依赖框架的功能(例如必须使用 getContentPane

就个人而言,我会从 JPanel 开始,然后将其添加到我想要的每个容器中