-1

我是 java 图形设计的新手,如果可能的话,我希望你能通过一个简单的例子来帮助我理解 JFrames、Timers、SwingControllers 和所有这些东西的基本功能。您将如何实施以下情况:

我们有一个 JFrame,里面有一个 JPanel。当执行开始时,JPanel 是白色的,但我们希望它每两秒改变一次颜色:

public class MiJFrame extends javax.swing.JFrame {

    public MiJFrame() {
        initComponents();
    }


    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new MiJFrame().setVisible(true);
                jPanel1.setBackground(Color.yellow);
                jPanel1.setBackground(Color.RED);
            }
        });
    }

    // Variables declaration - do not modify
    private static javax.swing.JPanel jPanel1;
    // End of variables declaration
}

起初,我在 setBackgroud() 方法之间使用了线程对象的 sleep 方法,但它不起作用,因为它只显示最后的更改。您将如何在这里使用 Timer 对象?

4

1 回答 1

6

首先,每当您需要更改所述事物的颜色时,请始终将所述事物的Opaque属性设置为true。就像您的情况一样,它是JPanel您必须首先使用panelObject.setOpaque(true)的,对于某些人来说Look And Feel,调用此方法是背景颜色更改生效的必要条件。

关于其余部分,请尝试此代码示例:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/*
 * @see
 * http://stackoverflow.com/q/11036830/1057230
 */

public class ColourTimer
{
    private JPanel contentPane;
    private Timer timer;
    private int counter;
    private Color[] colours = {
                                Color.RED,
                                Color.WHITE,
                                Color.BLUE,
                                Color.DARK_GRAY,
                                Color.YELLOW,
                                Color.LIGHT_GRAY,
                                Color.BLACK,
                                Color.MAGENTA,
                                Color.PINK,
                                Color.CYAN
                              };

    private ActionListener timerAction = new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent ae)
        {
            if (counter == (colours.length - 1))
                counter = 0;
            contentPane.setBackground(colours[counter++]);
        }    
    };

    public ColourTimer()
    {
        counter = 0;
    }

    private void displayGUI()
    {
        JFrame frame = new JFrame("Colour Timer");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        contentPane = new JPanel();
        contentPane.setOpaque(true);

        final JButton button = new JButton("STOP");
        button.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                if (timer.isRunning())
                {
                    button.setText("START");
                    timer.stop();
                }
                else
                {
                    button.setText("STOP");
                    timer.start();
                }
            }
        });

        frame.getContentPane().add(contentPane, BorderLayout.CENTER);
        frame.getContentPane().add(button, BorderLayout.PAGE_END);
        frame.setSize(300, 200);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
        timer = new Timer(2000, timerAction);
        timer.start();
    }

    public static void main(String... args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new ColourTimer().displayGUI();
            }
        });
    }
}
于 2012-06-14T16:18:21.310 回答