Swing – 未调用paintComponent方法

我只是实现了inheritanceJPanel的类,如下所示

public class Orpanel extends JPanel { .... @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D)g; g2d.setPaint(tpaint); g2d.fill(rect); } .... } 

Orpanel正在加载图像并调整它自己的大小。

这是问题。

调用JFrame的setContentpane(Orpanel的实例)使它工作正常但是当我将Orpanel附加到JFrame时调用add()方法而不是setContentpane(我知道setcontentpane并不意味着附加..无论如何),它不起作用。

最后想通了当我使用add()方法时,添加到JFrame的Component不会调用paintComponent()方法。 即使我手动调用repaint()方法,仍然不会调用paintComponent()方法。

我错过了什么? 任何帮助将不胜感激!

提前thx。 Jaeyong shin。


我添加了额外的代码。

 public Test(OwPanel op) { super(); Dimension monitor = Toolkit.getDefaultToolkit().getScreenSize(); op.setBackground(Color.white); this.setBackground(Color.white); this.setBounds(monitor.width / 2 - 200 , monitor.height / 2 - 200, 400, 400); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setTitle("test"); this.setLayout(null); this.getContentPane().add(op); //this.setContentPane(op); this.setVisible(true); this.validate(); } public static void main(String[] args) { // TODO Auto-generated method stub SwingUtilities.invokeLater(new Runnable() { @Override public void run() { OwPanel op = new OwPanel("d:\\java_workplace\\img\\img1.jpg", 100, 100); OwLabel ol = new OwLabel("d:\\java_workplace\\img\\img2.jpg", 300, 50); Test tst = new Test(op); tst.add(ol); } }); 

如果将setContentpane()方法替换为getContentpane()。add(),则仍然无效。 不要混淆。 Owpanel和Orpanel是一样的:)

在你的示例代码中,我看到你选择了不使用LayoutManager,这是一个非常糟糕的主意,但无论如何,你这样做,我看到你的Orpanel.paintComponent()没有被调用的一个原因:它可能不是在框架内可见!

如果没有LayoutManager ,则必须显式设置添加到框架的所有组件的大小和位置(通过setBounds() )。

很可能你没有这样做,因此Orpanel实例的大小可能为0因此它永远不会被绘制。

听起来你只是使用了错误的方法。 在向框架添加面板时,您应该这样做:

 frame.getContentPane().add(panel) ;