我正在尝试将矩形颜色更改为黑色,但它不起作用

问题描述 投票:0回答:3

我是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();
} 
java graphics2d
3个回答
0
投票

据我所知,每当你改变一些属性(在这种情况下为颜色)时,你必须调用重绘。这将调用对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;
}

希望能帮助到你。


0
投票

像这样更新你的功能

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
投票

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(在你创建的副本上)

© www.soinside.com 2019 - 2024. All rights reserved.