使用Java中的Swing定时器以一定的间隔绘制不同的形状
我必须编写一个项目,在JavaGUI中每三秒生成一个随机大小的填充形状(三角形、五角大楼或六边形)。它还必须允许用户从jlist中选择颜色。形状的颜色将为黑色,直到用户从列表中选择一种,然后形状的颜色将为所选颜色。我不确定在我的代码中在哪里或如何实现计时器。我也不确定在哪里添加代码来绘制形状 以下是我目前掌握的情况:使用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
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);
}
});
}
}