Не показывать графику в JPanel, которая добавлена ​​в другую JPanel

При добавлении 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);
    }
}

person nullptr    schedule 07.07.2012    source источник
comment
Просто переопределите getPreferredSize() и заставить его возвращать какое-то значение, например return new Dimension(300, 300);, внутри вашего SamplePanel Class   -  person nIcE cOw    schedule 07.07.2012
comment
см. «Как я могу добавить класс JPanel в класс формы JFrame в netbeans?» на stackoverflow для получения дополнительной информации   -  person MaVRoSCy    schedule 07.07.2012
comment
@MaVRoSCy : Приятель, ты просто забыл поставить ссылку на комментарий, например, чтобы оставить комментарий здесь, помести квадратные скобки [] здесь, например [здесь], за которыми следуют круглые скобки, например [здесь](), и внутри круглых скобок. вставьте URL-адрес.   -  person nIcE cOw    schedule 08.07.2012


Ответы (1)


Пожалуйста, следите за конструктором класса Main, сделайте это своей привычкой следовать последовательности, как показано в этом примере. Сначала добавьте компоненты в JFrame, затем делайте только вызовы типа pack(), setSize() or setVisible(...), не раньше.

Всегда сделайте своей привычкой, что всякий раз, когда вы переопределяете метод paintcomponent(), переопределяйте и метод getPreferredSize().

И всегда помещайте такие вызовы, как pack()/setVisible(...), в поток EDT — Event Dispatch Thread. Пожалуйста, прочитайте Параллелизм в 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);
    }
}
person nIcE cOw    schedule 07.07.2012
comment
@user1508907: обратите внимание, что макет JPanel по умолчанию — FlowLayout. - person trashgod; 07.07.2012
comment
ДОБРО ПОЖАЛОВАТЬ И ПРОДОЛЖАТЬ УЛЫБАТЬСЯ :-) - person nIcE cOw; 08.07.2012