簡體   English   中英

Java簡單形狀程序

[英]Java Simple Shape Program

我試圖使用GUI創建這個簡單的程序,一旦按下JButton就會創建一個圓圈。 我一直在研究這個問題,並試圖弄清楚為什么這對夫妻時間不起作用。 我在stackoverflow上查看類似的代碼與類似問題的人,但是,我仍然無法弄清楚這一點。 有人可以告訴我哪里出錯了,為什么我不對? 謝謝。

public class ColorShape {

    public static void main(String[] args) {

        CreatePanel c = new CreatePanel();
        c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        c.setSize(300, 450);
        c.setVisible(true);

    }
}

public class CreatePanel extends JFrame {

    private JButton DC;
    private BorderLayout layout;

    public CreatePanel() {
        super("Color-Shape");
        layout = new BorderLayout();
        setLayout(layout);

        DC = new JButton("Circle");
        DC.addActionListener(
                new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                DrawCirc circ = new DrawCirc();
                add(circ);
                repaint();
            }
        }
        );
        add(DC, BorderLayout.NORTH);

    }
}

public class DrawCirc extends JPanel {

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.cyan);
        g.fillOval(100, 100, 50, 50);

    }
}

好吧,你的第一個問題是, DrawCirc沒有提供大小調整提示,這意味着它的默認大小將是0x0

public class DrawCirc extends JPanel {

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(150, 150);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.cyan);
        g.fillOval(100, 100, 50, 50);
    }
}

另外,請記住, Graphics上下文已被翻譯,因此0x0是組件的左上角。

第二個問題是,Swing很懶。 它允許您對UI進行一些更改,然后批量處理它們。 這意味着當您完成UI的更新后,您必須同時調用revalidaterepaint以觸​​發布局和繪制傳遞

DC.addActionListener(
        new ActionListener() {
    public void actionPerformed(ActionEvent event) {
        DrawCirc circ = new DrawCirc();
        add(circ);
        revalidate();
        repaint();
    }
});

這兩個問題並不罕見。 您應該花更多時間了解布局管理系統,因為它會讓您的生活更簡單;)

更改組件層次結構后,將repaint()更改為revalidate() 如果調整窗口大小,您會注意到當前版本會繪制圓圈,因為這會重新驗證布局。

來自文檔:

將組件層次結構重新驗證到最近的驗證根。 此方法首先使從此組件開始的組件層次結構無效,直至最近的驗證根。 然后,從最近的驗證根開始驗證組件層次結構。 這是一種方便的方法,可以幫助應用程序開發人員避免手動查找驗證根。 基本上,它相當於首先在此組件上調用invalidate()方法,然后在最近的驗證根上調用validate()方法。

暫無
暫無

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

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