2014-11-21 89 views
1

这是一个noob问题。 我们在课堂上正在教小应用程序,我正在尝试自己的一些东西。paintComponent重写在面板上绘制

以下是代码

import java.awt.*; 
import javax.swing.*; 


class controls extends JPanel{ 

@Override public void paintComponent(Graphics g) { 
    g.drawOval(50, 50, 50, 50); // <-- draws an oval on the panel 
} 

} 

public class test extends JApplet{ 
public void init(){ 
    final JPanel stage = new JPanel(); 
    final JPanel controlPanel = new controls(); 
    final JPanel banner = new JPanel(); 
    final JLabel name = new JLabel("Test", JLabel.CENTER); 
    this.setLayout(new BorderLayout()); 
    banner.setBackground(Color.CYAN); 
    banner.add(name); 
    this.add(controlPanel, BorderLayout.WEST); 
    this.add(banner, BorderLayout.NORTH); 
} 
} 

据我了解,的paintComponent()无需显式调用。 单独使用控件类时效果很好。

我的意思是下面的代码工程。

public class test extends JApplet{ 
public void init(){ 
    JPanel controlPanel = new controls(); 
    this.add(controlPanel); 
} 
} 

我无法理解区别。为什么相同的代码在这种情况下工作,而不是在以前?

谢谢。

+0

我不确定我关注。哪些代码有效,哪些不会?当你运行不起作用的代码时会发生什么? – 2014-11-21 16:17:30

+0

@MichaelMyers:没有布局的代码工作。具有布局的人将显示横幅面板,但不显示其在测试类中创建的对象的控件面板。 – psyc0der 2014-11-21 17:19:50

回答

4

重写public Dimension getPreferredSize()(并返回new Dimensioncontrols类。当组件放入WEST时,宽度将由preferredSize确定。如果您不覆盖getPreferredSize,则首选大小将为0.在计算WEST等后,CENTER将占用剩余空间。第二种情况是有效的,因为它在默认的CENTERBorderLayout

+0

我加了 'public Dimension getPreferredSize(){ \t return new Dimension(50,50); }'在控件类中。但它仍然不渲染面板。难道我做错了什么? – psyc0der 2014-11-21 17:16:07

+0

尝试用'100'。不知道为什么50不会工作 – 2014-11-21 17:20:48

+2

哦,这是因为你正在绘制的圆的位置。如果面板的大小为50,并且您开始以50绘制,则圆形将超出面板的大小。如果你在'0,0,50,50'处绘制,你可以使用'50,50'。但是你应该把面板的尺寸做得很大,就像你想要的那样,整个图面是 – 2014-11-21 17:21:58