2016-11-18 132 views
0

当我运行这段代码时PaintComponent永远不会被调用,因为“绘制”消息永远不会被打印,我不知道为什么?谁能帮忙?PaintComponent不会被JPanel调用

public class DisplayManager extends JPanel { 

public static final int WIDTH = 700, HEIGHT = 900; 

public Bottle bottle1 = new Bottle("res/bottleimage.png"); 
public Slider slider1 = new Slider(); 

public void initDisplay() 
{ 
    JFrame frame = new JFrame(); 
    JPanel panel = new JPanel(); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(new Dimension(WIDTH, HEIGHT)); 

    frame.add(panel); 

    frame.setVisible(true); 
} 

@Override 
public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    bottle1.imageIcon.paintIcon(this, g, 50, 50); 
    System.out.println("painted"); 
} 
} 
+1

如果你的'DisplayManager'应该是'JPanel',你必须将'DisplayManager'添加到'Frame'而不是一个新的'JPanel'。 'frame.add(this)'而不是'frame.add(面板)' –

+0

感谢伙计这工作 – PDPIG

+0

@PDPIG,这只是解决方案的一半。 – camickr

回答

2

有几个与基本代码的问题:

  1. 已经提到你需要你的DisplayManager类添加实例的框架或面板。

  2. 当您进行自定义绘画时,您需要覆盖组件的getPreferredSize()方法以返回所需的尺寸。目前您的组件的首选大小是(0,0)。

到DISPLAYMANAGER添加到框架的建议只能是因为默认布局管理器是一个BorderLayout,默认情况下被添加到,这意味着它获得帧中所有可用空间的布局CENTER

但是如果你使用:

frame.add(this, BorderLayout.PAGE_START); 

你不会看到的元件尺寸它的大小为(0,0);