【发布时间】:2020-07-08 23:32:36
【问题描述】:
免责声明:我是 Java 新手。我是 Swing 的新手。我敢肯定它会显示出来。
我已经查看了很多关于如何在 jpanel“画布”上绘图的示例/教程。但它们大多具有相同的基本格式,并将它们的所有 drawLine/drawRect/drawArc 放在 paintComponent() 方法中。似乎假设人们想一次将静态的东西绘制到 jpanel 上。但是,如果我想在程序的运行过程中更改 jpanel 对象,比如绘画程序或游戏,该怎么办?
我想我需要能够访问 jpanel 对象和内部方法来绘制。我打赌我正在做的不是最佳实践,但这是我所拥有的:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PaintPanel extends JPanel {
public static JFrame frame;
private Graphics g = getGraphics();
public static void main(String[] args) {
frame = new JFrame();
frame.getContentPane().setBackground(new Color(32, 32, 32));
frame.setResizable(false);
frame.setBounds(1, 1, 800, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
frame.setVisible(true);
frame.setLocationRelativeTo(null); // center frame on screen
PaintPanel paintPanel = new PaintPanel();
paintPanel.setBounds(10, 10, 100, 100);
paintPanel.setBackground(Color.red);
frame.add(paintPanel);
}
// constructor
public PaintPanel() {
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
}
public void DrawRect(Integer x, Integer y, Integer w, Integer h, Color color) {
g.setColor(color);
g.fillRect(x, y, w, h);
this.repaint(); // doesn't seem to do anything
}
}
此代码导致一个红色面板框,但我的用户方法 DrawRect() 没有绘制任何内容。
- 我在某些地方读到有必要重写paintComponent() 方法。如果里面什么都没有,目的是什么?
- 如何让我的 DrawRect() 方法工作?
【问题讨论】:
-
但是,如果我想在程序运行期间更改 jpanel 对象怎么办 - 你保留一个要绘制的对象的 ArrayList。然后在paintComponent() 方法中遍历ArrayList 以绘制所有对象。这使您可以选择从 ArrayList 中动态添加/删除对象。有关此方法的工作示例,请参阅 Custom Painting Approaches。
-
如何让我的 DrawRect() 方法工作? - 1) 方法名称不应以大写字符开头。 2) 将信息添加到存储在 ArrayList 中的自定义对象中。从上面修改工作示例。
-
camickr 提供的答案正是我需要的推动力。我创建了一个扩展的 JPanel 类并将列表添加到 paintComponent() 功能中,并且它正在工作。谢谢大家。
标签: java swing graphics jpanel drawing