我是Java
的新手,并不确切知道原因是什么。让我解释一下这个问题
我创建了一个矩形形状及其工作,然后我考虑将其颜色更改为黑色进行一些测试,但它似乎不能在下面工作是我的代码。当我从paintComponent
本身调用该方法然后它的工作,但如果我从任何其他方法做同样的事情,那么它不改变颜色。我尝试调用方法重绘但仍然相同
public class Meme extends JPanel {
Rectangle2D.Float myRect = new Rectangle2D.Float(90, 90, 90, 90);
Graphics2D graphics2d;
public void DRAW() {
graphics2d.setColor(new Color(0, 0, 200));
graphics2d.fill(myRect);
}
public void ChangeColour() {
System.out.println("Called");
graphics2d.setPaint(Color.BLACK);
System.out.println("Called2");
graphics2d.fill(myRect);
System.out.println("Called3");
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
graphics2d = (Graphics2D) g;
graphics2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
DRAW();
}
}
按钮单击侦听器方法
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
meme1.ChangeColour();
}
据我所知,每当你改变一些属性(在这种情况下为颜色)时,你必须调用重绘。这将调用对paintComponent的调用,并再次绘制帧。
在你的情况下,我猜即使你在改变颜色后调用重绘,在paintComponent中再次调用DRAW方法,它将改变的颜色重置为(0,0,200)。因此,您在屏幕上看不到任何更改。但是当你在paintComponent方法中调用changeColor时(假设在调用DRAW之后),颜色的变化仍然存在并且不会被覆盖。
可能的解决方案
只需将颜色保存在其他地方。喜欢
Color myColor = new Color(0,0,200);
然后在DRAW:
private void DRAW() {
graphics2d.setColor(myColor);
graphics2d.fill(myRect);
}
在ChangeColor中:
private void ChangeColour() {
myColor = Color.BLACK;
}
希望能帮助到你。
像这样更新你的功能
public void ChangeColour() {
System.out.println("Called");
graphics2d.setColor(new Color(1, 1, 200));
System.out.println("Called2");
graphics2d.fill(myRect);
System.out.println("Called3");
}
Swing中的绘画既是被动的,也是破坏性的。也就是说,油漆通行证可以随时出现,原因有很多,其中许多是你无法控制的。破坏性的手段,在每个油漆过程中,您需要从头开始重绘整个组件。
在Swing中,您更新要更改的状态,然后调用repaint
以触发新的绘制过程。
绘画应该只绘制当前状态,它永远不应该尝试改变它
public class Meme extends JPanel {
Rectangle2D.Float myRect = new Rectangle2D.Float(90, 90, 90, 90);
private Color color;
public void draw(Graphics2D graphics2d) {
graphics2d.setColor(color);
graphics2d.fill(myRect);
}
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
public void ChangeColour() {
color = Color.BLACK;
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
graphics2d = (Graphics2D) g.create();
graphics2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
draw(graphics2d);
graphics2d.dispose();
}
}
此外,传递给组件的图形上下文与所有其他组件共享,因此在方法存在之前撤消对上下文所做的任何重大更改都很重要 - 在大多数情况下,这只是调用create
的简单情况。当你完成时,Graphics
上下文快照它状态和dispose
(在你创建的副本上)