gpt4 book ai didi

java - 从另一个 JPanel 中重新绘制一个 JPanel

转载 作者:行者123 更新时间:2023-12-02 13:03:28 28 4
gpt4 key购买 nike

所以,我正在制作一个绘画程序,我有一个主要的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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com