首页 > 解决方案 > 在 Java 中使用 Swing Timer 以间隔绘制不同的形状

问题描述

我必须编写一个项目,在 java gui 中每三秒生成一个随机大小的填充形状(三角形、五边形或六边形)。它还必须允许用户从 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();
    }
}

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);
            }

        });
    }
}

标签: javaswinguser-interfacegraphicstimer

解决方案


推荐阅读