簡體   English   中英

了解paintComponent

[英]Understanding paintComponent

更新 19/01/14(對於有類似問題的人)
我在下面描述的問題源於我的 circle 類擴展了 JPanel。 所以我從這個類創建的每個圓圈實際上都是它自己的面板。 因此,通過添加布局,我可以看到兩個圓圈。 我現在了解到,它有一個單獨的“板類”來擴展 JPanel,在這種情況下,讓圓圈不擴展任何東西。 這樣我就可以在 circleclass 中實現一個 drawMySelf 方法並在我的板上繪制它們。 這樣我就可以在同一個面板中擁有各種幾何對象!
更新結束。

我正在做一個需要畫兩個圓圈的任務。 當我調整框架大小時,這些圓圈應該隨機重新定位。 並且需要在它們的中心之間有一條線來說明距離。 我的圈子課遇到了麻煩。 當我將我的自定義圓圈添加到我的測試程序時,只會出現其中一個。 我不明白為什么。 我認為我的代碼中有一個錯誤,使程序跳過了其中的一些。 因為我只會出現一個圓圈。 誰能看出這段代碼有什么問題?

請記住,我應該使用到目前為止所學的工具。 JPanel、JFrame、覆蓋paintComponent()。

圓圈類:

    package oppgave4;
    import javax.swing.*;
    import java.awt.*;

    public class Circle extends JPanel {
    
    public static final int OVAL = 1;
    public static final int ANOTHEROVAL = 2;
    
    public int OVALCENTER = 0;
    public int ANOTHEROVALCENTER = 0;
    
    private int type = 1;
    private boolean filled = false;
    
    public Circle(){
        
    }
    
    public Circle(int type){
        this.type = type;
    }
    
    public Circle(int type, boolean filled){
        this.type = type;
        this.filled = filled;
    }
    
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        
        int width = getWidth();
        int height = getHeight();
        int randomWidth = (int)(width * Math.random());
        int randomHeight = (int)(height * Math.random());
        
        switch (type){
        case OVAL:
            g.setColor(Color.BLUE);
            if(filled)
                g.fillOval(randomWidth, randomHeight, 30, 30);    
            else
                g.drawOval(randomWidth, randomHeight, 30, 30);
      
            
        case ANOTHEROVAL:
            g.setColor(Color.RED);
                if(filled)
                    g.fillOval(randomWidth, randomHeight, 30, 30);
                else
                    g.drawOval(randomWidth, randomHeight, 30, 30);
                break;
            
        }
    }
    
}

和測試程序:當我運行它時,只會出現紅色圓圈。

    package oppgave4;
    import javax.swing.*;
    import java.awt.*;

    public class TestProgram extends JFrame {
        public TestProgram(){
        add(new Circle(Circle.OVAL));
        add(new Circle(Circle.ANOTHEROVAL));
   
        }

    public static void main(String[] args) {
        TestProgram sirkel = new TestProgram();
        sirkel.setSize(400, 300);
        sirkel.setLocationRelativeTo(null);
        sirkel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        sirkel.setVisible(true);
    }
}

首先,通過使每個Circle成為JPanel ,您將獲得意想不到的結果,因為兩個JPanels不能繪制到同一個地方。 相反,它們被放置在我的 LayoutManager 中。 在這種情況下,我會想象你的一個面板在另一個面板的頂部,所以你只能看到一個。

如果您希望圓圈位於同一個“面板”中(它們可以重疊),那么您將需要一個可以繪制多個圓圈的JPanel

如果您希望它們在單獨的面板中“並排”,我會查看GridLayout

嘗試使用除默認 BorderLayout 之外的布局管理器添加它們,看看會發生什么

import java.awt.*;    

public TestProgram(){
    setLayout(new GridLayout(1, 2);
    add(new Circle(Circle.OVAL));
    add(new Circle(Circle.ANOTHEROVAL));
}

另一種解決方案是使用JFrame的默認BorderLayout 當您只是.add(something) ,它會自動添加到BorderLayout.CENTER ,除非您指定位置。 一個 BorderLayout 並且每個位置只包含一個組件。 因此,當您嘗試添加第二個時,只有第二個會出現在CENTER位置。

如果你做了

public TestProgram(){
    setLayout(new GridLayout(1, 2);
    add(new Circle(Circle.OVAL), BorderLayout.CENTER);
    add(new Circle(Circle.ANOTHEROVAL), BorderLayout.SOUTH);
}

它也可以工作

暫無
暫無

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

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