簡體   English   中英

我正在嘗試將矩形顏色更改為黑色,但無法正常工作

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

我是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的調用,並且將再次繪制框架。

在您的情況下,我猜想即使您在更改顏色后調用repaint,在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();
    }
}

此外,傳遞給您的組件的圖形上下文與所有其他組件共享,因此,重要的是之前的方法存在您對內容的任何顯著更改都會被撤消-在大多數情況下,它調用的只是一個簡單的情況下createGraphics對其狀態進行快照並dispose (在創建的副本上)的Graphics上下文

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM