2014-12-06 21 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