2

JPanelグラフィックスを持つ を に追加するとJFrame、正常に動作します。しかし、JPanel 別のJPanelグラフィックスを追加した を追加しようとすると、 に表示されませんJFrame。以下のコードを参照してください

package sample;

import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JFrame{
    public static void main(String[] args) {
        new Main();
    }

    public Main(){
        setTitle("Sample");
        setVisible(true);
        setSize(500,500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        add(new SamplePanel2());
    }
}

class SamplePanel2 extends JPanel{
    public SamplePanel2(){
        add(new JButton("Hi"));
        add(new SamplePanel());
    }
}
class SamplePanel extends JPanel {
    public SamplePanel(){
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString("HHHHHHHHHHHH", 100, 100);
    }
}
4

1 に答える 1

4

クラスのコンストラクターを監視してくださいMain。この例に示されているシーケンスに従うように、これを習慣にしてください。最初に にコンポーネントを追加してから、その前ではなくJFrameのような呼び出しのみを行います pack(), setSize() or setVisible(...)

paintcomponent()メソッドをオーバーライドするたびに、getPreferredSize()メソッドもオーバーライドすることを常に習慣にしてください。

pack()/setVisible(...)そして、常にEDT - イベント ディスパッチ スレッド内のように呼び出しを行います。このトピックの詳細については、Swing での同時実行をお読みください。

import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JFrame{
    public static void main(String[] args) {
        new Main();
    }

    public Main(){
        setTitle("Sample");        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setContentPane(new SamplePanel2());
        pack();        
        setVisible(true);
    }
}

class SamplePanel2 extends JPanel{
    public SamplePanel2(){
        add(new JButton("Hi"));
        add(new SamplePanel());
    }
}
class SamplePanel extends JPanel {
    public SamplePanel(){
    }

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

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString("HHHHHHHHHHHH", 100, 100);
    }
}
于 2012-07-07T15:38:10.880 に答える