Не отображать графику в 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);
    }
}
 nIcE cOw08 июл. 2012 г., 07:44
@MaVRoSCy: Mate, вы просто забыли поставить ссылку на комментарий, например, чтобы оставить комментарий здесь, поставить квадратные скобки [] здесь как [здесь] с последующими круглыми скобками как [здесь] () и внутри скобок вставьте URL.
 MaVRoSCy07 июл. 2012 г., 17:35
см. "Как я могу добавить класс JPanel в класс форм JFrame в NetBeans?" на stackoverflow для получения дополнительной информации
 nIcE cOw07 июл. 2012 г., 17:33
Просто переопределитьgetPreferredSize() и заставить его вернуть какое-то значение, какreturn new Dimension(300, 300);внутри вашегоSamplePanel Class

Ответы на вопрос(1)

Решение Вопроса

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);
    }
}
 07 июл. 2012 г., 19:33
@ user1508907: обратите внимание, что макет по умолчаниюJPanel являетсяFlowLayout.
 08 июл. 2012 г., 20:31
Вы САМЫЙ ДОБРО ПОЖАЛОВАТЬ и ПРОДОЛЖИТЬ УЛЫБАТЬСЯ :-)
 nullptr08 июл. 2012 г., 20:22
Спасибо всем за помощь.

Ваш ответ на вопрос