问题描述
我只是实现了继承JPanel的类,如下所示
i simply implemented class that inherits JPanel like below
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是加载图片并调整它自己的大小。
class Orpanel is loading image and adjusting it's own size.
这里的问题。
调用JFrame的setContentpane(Orpanel的实例)使它成为现实工作正常
但是当我将Orpanel附加到JFrame时调用add()方法而不是setContentpane(我知道setcontentpane并不意味着附加..无论如何),它不起作用。
Calling JFrame's setContentpane(Orpanel's instance) makes it works finebut when i attach Orpanel to JFrame calling add() method instead of setContentpane (i know setcontentpane is not meaning attach.. anyway), it dosen't work.
最后弄清楚当我使用add()方法时,添加到JFrame的Component不会调用paintComponent()方法。即使我手动调用repaint()方法,仍然不会调用paintComponent()方法。
finally figured out when i used add() method, Component that was added to JFrame doesn't call paintComponent() method. even though i call repaint() method manually, still paintComponent() method is not called.
我错过了什么吗?
任何帮助将不胜感激!
did i miss something?any help will be appreciated!
提前。
Jaeyong shin。
thx in advance.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是相同的:)
still doesn't work if setContentpane() method replaced to getContentpane().add().don't be confused. Owpanel and Orpanel is same :)
推荐答案
在您的示例代码中,我看到您选择了不使用LayoutManager,这是一个非常糟糕的主意,但无论如何,你是这样走的,我看到你的 Orpanel.paintComponent()
没有被调用的一个原因:它可能在框架内不可见!
In your sample code, I see you have chosen NOT to use a LayoutManager, that's a very bad idea, but anyway, sicne you go this way, I see one reason for your Orpanel.paintComponent()
not being called: it is probably not visible inside the frame!
如果你没有 LayoutManager
,那么你必须明确设置大小和位置(通过 setBounds()
)你添加到框架的所有组件。
If you have no LayoutManager
, then you must explicitly set the size and location (through setBounds()
) of all components you add to the frame.
很可能你没有这样做,因此它的大小 Orpanel
实例可能为0因此它永远不会被绘制。
It is likely you didn't do it, hence the size of Orpanel
instance is probably 0 hence it never gets painted.
这篇关于Swing - 未调用paintComponent方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!