2017-12-18 69 views
0

我是新来Java,不知道到底是什么cause.Let我解释问题我试图矩形颜色更改为黑色,但它不工作

我创建一个矩形,和它的工作,然后我想改变它的颜色为黑色的一些测试,但似乎不工作以下是我的代码。 当我从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(); 
} 
+0

你需要调用changecolor函数 –

+0

是的,我从paintComonent调用它的工作..但是,当我从另一个函数调用该方法时不起作用 –

+0

所有的绘画都应该在'paintComponent'方法内完成。这个想法是你改变状态(即颜色)并调用'repaint'来触发新的paint pass – MadProgrammer

回答

0

至于我还记得,当你改变一些属性(颜色在这情况),你必须打电话repaint。这将调用paintComponent并再次绘制框架。

在你的情况,我猜测,即使你调用重绘改变颜色后,抽签方法被再次的paintComponent其重置变色回(0,0,200)调用。因此,您在屏幕上看不到任何更改。但是,当你的paintComponent方法调用changeColor(假设调用后绘制),颜色的变化仍然存在,并没有得到重写。

可能的解决方案

只要保持存储在其他地方的颜色。像

Color myColor = new Color(0,0,200); 

然后在DRAW:

private void DRAW() { 
    graphics2d.setColor(myColor); 
    graphics2d.fill(myRect); 
} 

和ChangeColor:

private void ChangeColour() { 
    myColor = Color.BLACK; 
} 

希望它能帮助。

+0

我会更新代码和张贴在这里先生:)感谢您的提示 –

+0

我编辑了一个建议的可能的解决方案 – Soulslayer

+0

非常感谢你的先生现在的工作:) –

0

更新像在Swing这

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"); 
} 
+0

谢谢先生:)快速回复 –

+0

当我点击积极的一些弹出是触发先生,感谢您的feedbacl!那些投不到票15reputation是记录,但不改变公开展示后得分 –

+0

如果它解决您的问题,然后向上投票,并标记为已解决:) –

0

绘画的功能是被动的和破坏性的。也就是说,任何时候都可能出现涂料过关,其中许多原因是您无法控制的。破坏性意味着,在每次通过涂料时,您都需要重新从头开始重新涂刷整个组件。

在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(); 
    } 
} 

此外,图形上下文传递给您的组件与所有其他组件共享,所以它的任何显著重要您对环境的变化被撤销的方法存在之前 - 在大多数情况下,它是在Graphics方面呼吁create到快照的状态和dispose(你创建的副本),当你做的只是一个简单的例子

+0

好的,先生,我将继续留在介意:D –

相关问题