java - 在 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);
}
});
}
}
解决方案
推荐阅读
- sql - 使用 SQL 或 WQL 查询以查找应用程序的安装位置
- azure-cosmosdb - Cosmos 存储过程 - console.log 问题
- java - 注释属性 GetMapping.produces 的值必须是常量表达式
- haskell - Haskell 类型类实例语法
- c# - 在页面控制器中使用 API 控制器
- xamarin - 使用 Appcenter 时,我还能在 App 构造函数中调用 VersionTracking 吗?
- javascript - 单击排序按钮后数据不会重新呈现
- grep - grep -v 迁移后不再排除模式
- r - R中的Wordcloud包括字符“和”,我该如何删除它们?
- python - defaultdict 中未定义键的条件