2014-01-11 36 views
0

我學習Java和我從一開始:)Java如何在面板上添加組件?

開始我想提請對面板生產線,但我不能

這是我的代碼:

public class Window extends JFrame{ 

    public Window(){  
     setSize(600,600); 
    this.setDefaultCloseOperation(EXIT_ON_CLOSE); 

    Container pow = getContentPane(); 
    Component k = new Test();   
    pow.add(k); 

    Panel p1 = new Panel(); 
    p1.setBounds(40, 40, 520, 520); 
    p1.setBackground(Color.white); 
    pow.add(p1);  
} 
} 

和麪板類

import java.awt.*; 
import javax.swing.*; 

public class Test extends JPanel{ 

public void paintComponent(Graphics g){ 
    g.drawLine(30, 50, 30, 550); 
    g.drawLine(30, 550, 550, 550); 

    g.drawLine(30, 50, 20, 60); 
    g.drawLine(30, 50, 40, 60); 

    g.drawLine(550, 550, 540, 540); 
    g.drawLine(550, 550, 540, 560); 
} 

} 

and main

public static void main(String[] args){ 
    Window mo = new Window(); 
    mo.setVisible(true); 
} 

爲什麼我的組件位於面板下? Sory這是我的代碼

+0

'Panel'和'Component'是AWT,'JPanel'和'JComponent'是Swing。 AWT不使用'paintComponent',而是使用'paint'。將AWT類切換到Swing類或將paintComponent切換到paint類,並且它可以工作。 – Pietu1998

+0

發佈完整的代碼,以便我們可以將其粘貼到我們的IDE中並進行測試。並學習如何使用佈局管理器。 –

+0

如果您的類擴展了AWT'Panel',則不存在'paintComponent'方法,因此任何繪畫都將停止顯示,因爲您實際上並未覆蓋任何東西 –

回答

1
  • contentPane使用BorderLayout作爲其默認佈局。
  • 當您將組件添加到BorderLayout容器而未指定位置時,它將被添加BorderLayout.CENTER。
  • 這將覆蓋以前添加到相同位置的任何其他組件。

解決方案:

  • 閱讀上和實驗與使用其他佈局管理器。檢查this tutorial
  • 請勿設置空白或使用空白布局。
1

PanelComponent是AWT,JPanelJComponent是搖擺。 AWT不使用paintComponent,但使用paint。將AWT類切換到Swing類或paintComponentpaint,它可能會工作。

這就是爲什麼添加@Override來覆蓋方法是個好主意,因爲它告訴你paintComponent不是Component的方法。

此外,您將組件和麪板都添加到同一個容器。將組件放在面板中。

p1.add(k); // yes (add this to your code) 
pow.add(k); // no (remove this from your code) 
pow.add(p1); // previous would get covered 
相關問題