Java GUI在运行时设置背景色,保持灰色,然后显示背景色

时间:2018-11-14 11:31:07

标签: java background-color

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;



     public class ButtonExample{
     public static void main(String[] args) {
        JFrame f = new JFrame("Demo");
        f.setSize(300, 250);
        f.setLocationRelativeTo(null);
        f.getContentPane().setBackground(Color.BLUE);
        f.setDefaultCloseOperation(2);


        final JTextField tf = new JTextField();
        tf.setBounds(75, 52, 150, 30);

        JButton b = new JButton("Hit it!");
        b.setBounds(50, 150, 80, 30);
        b.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            tf.setText("Hello world!");
            tf.setBackground(Color.cyan);
            }
        });

        JButton c = new JButton("Colse");

        c.setBounds(170, 150, 80, 30);
        c.addActionListener(new ActionListener() {
            @Override
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    });
    f.add(b);
    f.add(tf);
    f.add(c);


    f.setLayout(null);
    f.setVisible(true);
}
}

基本上,我的代码是,我将背景色设置为蓝色,但是首先将其设置为灰色,然后几秒钟变成蓝色,我试图找出它,但实际上不起作用,希望你们能给我一些帮助

1 个答案:

答案 0 :(得分:0)

  

但是首先显示为灰色,然后在几秒钟后变为蓝色,

我没有看到这个问题。我承认有时候我确实会看到几毫秒的轻微闪烁,但这是不可重复的。

这是我的建议:

  1. 所有Swing组件都应在Event Dispatch Thread (EDT)上创建。因此,您应该使用SwingUtilities.invokeLater(...)创建GUI。

  2. Swing旨在与布局管理器一起使用。因此,您应该a)设置布局,b)添加组件c)pack()框架d)使框架可见。尽管您不应该使用null布局,但是对于这个简单的示例,我仍然会使用相同的逻辑顺序,只是在使框架可见之前,您将使用setSize(...)而不是pack()。

  3. 请勿使用魔术值:f.setDefaultCloseOperation(2);。我们不知道“ 2”是什么意思。该API具有供您使用的变量。例如JFrame.EXIT_ON_CLOSE。使用这些变量可使代码更具可读性。

这是代码的稍微重新构建的版本:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ButtonExample
{
    private static void createAndShowGUI()
    {
        JFrame f = new JFrame("Demo");
        f.setLayout(null);
        f.getContentPane().setBackground(Color.BLUE);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JTextField tf = new JTextField();
        tf.setBounds(75, 52, 150, 30);

        JButton b = new JButton("Hit it!");
        b.setBounds(50, 150, 80, 30);
        b.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                tf.setText("Hello world!");
                tf.setBackground(Color.cyan);
            }
        });

        JButton c = new JButton("Colse");
        c.setBounds(170, 150, 80, 30);
        c.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        });

        f.add(b);
        f.add(tf);
        f.add(c);

        f.setLocationRelativeTo(null);
        f.setSize(300, 250);
        f.setVisible(true);
    }

    public static void main(String[] args)
    {
        java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}

阅读Swing Tutorial,了解Swing的基础知识。关于以下内容:

  1. Concurrency in Swing-进一步说明EDT
  2. Using Layout Managers-有关使用标准布局管理器的示例