2012-07-07 107 views
2

将具有图形的JPanel添加到JFrame时,它工作正常。但是当我尝试添加一个JPanel,其中我添加了另一个JPanel图形,但它没有显示在JFrame中。请看下面的代码在JPanel中未显示添加到另一个JPanel的图形

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); 
    } 
} 
+1

简单地覆盖[的getPreferredSize()](http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#getPreferredSize()),并使其返回一定的价值就像'返回新的Dimension(300,300);',在你的'SamplePanel Class'里面' – 2012-07-07 15:33:54

+0

请参阅'我如何将JPanel类添加到NetBeans的JFrame表单类中?'在更多信息的stackoverflow – MaVRoSCy 2012-07-07 15:35:50

+0

@MaVRoSCy:伙伴,你只是忘了把链接到评论,就像为了在这里发表评论,把方括号[]放在这里像[这里],然后像[这里]括号一样, ()并在括号内粘贴URL。 – 2012-07-08 05:44:32

回答

4

请不要观​​看Main类的构造函数,使此习惯中遵循所示的序列这个例子。首先将组件添加到JFrame,然后只拨打电话pack(), setSize() or setVisible(...),而不是之前。

始终让它成为你的习惯,只要你重写paintcomponent()方法,也可以重写getPreferredSize()方法。

并且始终在EDT - Event Dispatch Thread中放置pack()/setVisible(...)等呼叫。请阅读Concurrency in 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); 
    } 
} 
+1

@ user1508907:请注意,'JPanel'的默认布局是['FlowLayout'](http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html#flow)。 – trashgod 2012-07-07 17:33:50

+0

谢谢大家的帮助。 – UDPLover 2012-07-08 18:22:46

+0

你是最欢迎和保持微笑:-) – 2012-07-08 18:31:24

相关问题