2014-12-06 64 views
2
JFrame f = new JFrame(); 

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
f.setSize(new Dimension(500,500)); 
JLayeredPane layers = new JLayeredPane(); 
JPanel p1,p2; 

p1=new JPanel(); 
p2=new JPanel(); 


p1.setBounds(0,0,200,200); 
p2.setBounds(0,0,200,200); 

p1.setOpaque(false); 
p2.setOpaque(false); 

layers.setLayer(p1,new Integer(0)); 
layers.setLayer(p2,new Integer(1)); 

layers.add(p1); 
layers.add(p2); 

f.add(layers); 
f.setVisible(true); 


Graphics2D gr = (Graphics2D) p2.getGraphics(); 
gr.setColor(Color.BLACK); 

gr.drawLine(10,10,20,20); 

我想在JLayeredPane中绘制一个JPanel,但没有画任何东西。如果我将一个组件(一个JButton)添加到p1或p2中,它将被绘制。Java:JLayeredPane中的JPanel上画线条

在JLayeredPane中绘制正确的方法是什么?

回答

2

你不能仅仅画到外部的图形上下文,它不会像你期望的那样持久化。相反,您需要重写JPanel中的JComponent.paintComponent(Graphics g)。尝试这个。理想情况下,你可以将JPanel作为一个独立的类来继承。

一个很好的甲骨文教程“Perform custom painting

p2=new JPanel() { 
    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D gr = (Graphics2D) g; 
     gr.setColor(Color.BLACK); 

     gr.drawLine(10,10,20,20) 

    } 

} 
+0

但如果我要动态地画线是什么?唯一的选择是在JPanel类中添加一个“行”数组并调用repaint()? – user 2014-12-06 08:33:42

+0

是的,你的paintComponent可以引用你在其他地方控制的状态(列表,模型等),然后调用repaint()... – Adam 2014-12-06 08:35:48