我做了一个简单的绘画程序,你可以使用画笔工具绘制一些不同的颜色并擦除(只需涂上白色)。
它运行正常,但我有一个非常奇怪的图形错误,导致工具面板和最后一个鼠标悬停的颜色/工具图标被绘制在绘图面板的顶部。
实现:该框架包含两个JPanel扩展:ToolPanel和DrawPanel。 ToolPanel拥有两个JPanel,它们包含颜色和工具按钮。 Buttons是JComponent的扩展。
链接到屏幕截图(我不允许发布图片):
注意:第二个“假”工具面板中的按钮不是可以点击的实际按钮,我可以在它上面绘画。如果我在左角的“假”颜色按钮上绘画,当我将鼠标移到新颜色并用鼠标进入绘图面板时,它将再次重新绘制。
注意2:我曾经有一个JMenuBar,它也被绘在了drawpanel上。每次在窗口(而不仅仅是面板)失去焦点后,每次拉窗板被重新绘制时都会重新绘制。
一些代码: (我知道工具选择实现不是最好的:P)
DrawPanel的paintComponent方法:
public void paintComponent(Graphics g) {
if(isMousePressed) {
if(tool == "BRUSH") {
g.setColor(color);
g.fillOval(currentEvent.getX(), currentEvent.getY(), 30, 30);
} else if(tool == "ERASER") {
g.setColor(getBackground());
g.fillOval(currentEvent.getX(), currentEvent.getY(), 30, 30);
}
}
}
如果我遗漏了任何相关信息或代码,请告诉我。
假设: 我没有在DrawPanels paintComponent方法中调用super.paintComponent,也许这会导致一些问题?我不这样做的原因是,如果我这样做,它将一直重新绘制背景,因此只有我最后绘制的点才会可见。不确定超级调用是否实际解决了问题,或者假面板是否也被背景覆盖。也许我需要以其他方式解决这个问题?或者是别的什么?
谢谢!
答案 0 :(得分:3)
听起来你可能正在改变Graphics对象,而不是创建新对象(g.create()
),因此可以设置可能会改变绘制位置的边界或剪裁区域。
如果您可以发布更多细节(例如您绘制的所有地点)或甚至是完整的SSCCE,那么我将更新此答案以使其更具体。在那之前,那是不可能的。
最好始终创建一个新的Graphics
对象来使用。
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (isMousePressed) {
// create the new Graphics context which
// we can work with/modify independently
g2 = g.create();
// use "str".equals() for String comparisons
if ("BRUSH".equals(tool)) {
g2.setColor(color);
g2.fillOval(currentEvent.getX(), currentEvent.getY(), 30, 30);
} else if ("ERASER".equals(tool)) {
g2.setColor(getBackground());
g2.fillOval(currentEvent.getX(), currentEvent.getY(), 30, 30);
}
// you should always dispose() of a Graphics
g2.dispose();
}
}
答案 1 :(得分:3)
自从我使用Swing已经有很长一段时间,但你的基本问题是背景没有被重新绘制。这意味着正确的工作组件应该每次都绘制整个区域,因此您必须保存并重新绘制任何先前的图形。
您可以尝试将组件设置为透明(检查setTransparent或setOpaque方法),但由于已经好几年了,我不确定具体结果是什么。