所以,我正在制作一个绘画程序,我有一个主要的Paint
类,它检测鼠标输入和绘画,还有一个Tools
类,它是左侧的工具栏,拥有许多工具,例如画笔大小更改和形状更改。因此,我想向 Tools
类添加一个清除按钮,以清除整个屏幕。我的问题是 Paint
类保存了它绘制的点的 ArrayList,并且我无法从 Tools
中重新绘制 Paint
。 p>
Paint
类
//imports
public class Paint extends JPanel{
private ArrayList<Brush> points;
...
public Paint() {
...
}
public void paintComponent(Graphics page) {
...
//draws all points in the arraylist
for (Brush b : points) {
//paint points
}
}
}
工具
类
//imports
public class Tools extends JPanel
{
private JButton clear;
public Tools() {
clear = new JButton("Clear");
clear.addActionListener(new BrushInput());
}
public void paintComponent(Graphics page) {
...
}
private class BrushInput implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == clear) {
//clear points arraylist and repaint
}
}
}
}
我遇到的问题是 repaint()
是一个实例方法,因此我无法从 Tools< 中访问
.Paint
的重绘
最佳答案
只需将对 Paint
实例的引用传递给 Tools
的构造函数即可。或者,对包含这两个容器的容器(JFrame
等)调用 repaint,这应该会导致其所有子级都被重新绘制。
例如:
public class Paint extends JPanel {
private ArrayList<Brush> points;
// . . .
public void clear() {
points.clear();
repaint();
}
}
public class Tools extends JPanel {
private JButton clear;
private Paint paint;
public Tools(Paint paint) {
this.paint = paint;
// . . .
}
// . . .
private class BrushInput implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == clear) {
paint.clear();
}
}
}
}
创建这些组件的代码:
Paint paint = new Paint();
Tools tools = new Tools(paint);
关于java - 从另一个 JPanel 中重新绘制一个 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44233889/