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

I'm trying to change the Rectangle colour to Black but its not working

我是 Java 的新手,不完全了解 cause.Let 我对 问题

的解释

我创建了一个矩形及其工作原理,然后我考虑将其颜色更改为黑色以进行一些测试,但它似乎不起作用,下面是我的代码。 当我从 paintComponent 本身调用该方法时,它会工作,但如果我从任何其他方法执行相同的操作,则它不会改变颜色。我也试过调用 repaint 方法,但还是一样

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);

然后在绘图中:

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

此外,传递给组件的图形上下文与所有其他组件共享,因此在方法存在之前撤消对上下文所做的任何重大更改很重要 - 在大多数情况下,这只是一个简单的情况在 Graphics 上下文中调用 create 以对其状态进行快照,并在完成后 dispose(在您创建的副本上)