使用Java中的Swing定时器以一定的间隔绘制不同的形状

使用Java中的Swing定时器以一定的间隔绘制不同的形状,java,swing,user-interface,graphics,timer,Java,Swing,User Interface,Graphics,Timer,我必须编写一个项目,在JavaGUI中每三秒生成一个随机大小的填充形状(三角形、五角大楼或六边形)。它还必须允许用户从jlist中选择颜色。形状的颜色将为黑色,直到用户从列表中选择一种,然后形状的颜色将为所选颜色。我不确定在我的代码中在哪里或如何实现计时器。我也不确定在哪里添加代码来绘制形状 以下是我目前掌握的情况: public enum MyColor { BLUE("Blue"), RED("Red"), GREEN("Green"), ORANGE("Orange

我必须编写一个项目,在JavaGUI中每三秒生成一个随机大小的填充形状(三角形、五角大楼或六边形)。它还必须允许用户从jlist中选择颜色。形状的颜色将为黑色,直到用户从列表中选择一种,然后形状的颜色将为所选颜色。我不确定在我的代码中在哪里或如何实现计时器。我也不确定在哪里添加代码来绘制形状

以下是我目前掌握的情况:

public enum MyColor {
            BLUE("Blue"), RED("Red"), GREEN("Green"), ORANGE("Orange"), MAGENTA("Magenta");

    private String color;

    private MyColor(String color) {
        this.color = color;
    }

    public String getMyColor() {
        return color;
    }

    public String toString() {
        return getMyColor();
    }
}



想想“责任”。管理
计时器是
ColorPane
还是
MainPane2
的责任?如果选择一个而不是另一个,会产生什么影响?从概念上讲,您需要一个Swing
计时器,它每3秒重复一次,并将重新绘制
颜色窗格
。就其本身而言,一个简单的问题和一个简单的解决方案而言,您需要决定的是,
计时器
最适合于使用
计时器
实现您的目标的位置,或者仅仅是每三秒绘制一个新形状来满足要求?除了使用
计时器
之外,还有其他方法可以间歇性地绘制对象。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;

public class ColorPane extends JPanel{

    private MyColor myColor;

    public void setMyColor(MyColor myColor) {
        this.myColor = myColor;
        repaint();
    }

    public MyColor getMyColor() {
        return myColor;
    }

    public Dimension getPreferredSize() {
        return new Dimension(700, 700);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        MyColor myColor = getMyColor();
        g2.fillRect(20,20,300,300);

        if(myColor == null) {
            g2.setColor(Color.BLACK);
        }
        switch (myColor) {
            case BLUE:
                g2.setColor(Color.BLUE);
                break;
            case RED:
                g2.setColor(Color.RED);
                break;
            case GREEN:
                g2.setColor(Color.GREEN);
                break;
            case ORANGE:
                g2.setColor(Color.ORANGE);
                break;
            case MAGENTA:
                g2.setColor(Color.MAGENTA);
                break;
        }
    }
}
import java.awt.BorderLayout;

import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class MainPane2 extends JPanel{

    private JList<MyColor> colorList;
    private ColorPane colorPane;

    public MainPane2() {
        setLayout(new BorderLayout());

        DefaultListModel<MyColor> dlm = new DefaultListModel<MyColor>();
        dlm.addElement(MyColor.BLUE);
        dlm.addElement(MyColor.RED);
        dlm.addElement(MyColor.GREEN);
        dlm.addElement(MyColor.ORANGE);
        dlm.addElement(MyColor.MAGENTA);

        colorPane = new ColorPane();

        colorList = new JList<MyColor>(dlm);
        colorList.setVisibleRowCount(2);
        colorList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        JScrollPane jsp = new JScrollPane(colorList);
        colorList.addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                MyColor myColor = colorList.getSelectedValue();
                colorPane.setMyColor(myColor);
            } 

        });
        add(colorPane, BorderLayout.CENTER);
        add(jsp, BorderLayout.EAST);
    }
}
import java.awt.EventQueue;

import javax.swing.JFrame;

public class Driver2 {

    public static void main(String[] args) {
        new Driver2();
    }

    public Driver2() {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setTitle("Random Shapes");
                frame.add(new MainPane2());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }
}