2014-11-21 129 views
1

這是一個noob問題。 我們在課堂上正在教小應用程序,我正在嘗試自己的一些東西。paintComponent重寫在面板上繪製

以下是代碼

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


class controls extends JPanel{ 

@Override public void paintComponent(Graphics g) { 
    g.drawOval(50, 50, 50, 50); // <-- draws an oval on the panel 
} 

} 

public class test extends JApplet{ 
public void init(){ 
    final JPanel stage = new JPanel(); 
    final JPanel controlPanel = new controls(); 
    final JPanel banner = new JPanel(); 
    final JLabel name = new JLabel("Test", JLabel.CENTER); 
    this.setLayout(new BorderLayout()); 
    banner.setBackground(Color.CYAN); 
    banner.add(name); 
    this.add(controlPanel, BorderLayout.WEST); 
    this.add(banner, BorderLayout.NORTH); 
} 
} 

據我瞭解,的paintComponent()無需顯式調用。 單獨使用控件類時效果很好。

我的意思是下面的代碼工程。

public class test extends JApplet{ 
public void init(){ 
    JPanel controlPanel = new controls(); 
    this.add(controlPanel); 
} 
} 

我無法理解區別。爲什麼相同的代碼在這種情況下工作,而不是在以前?

謝謝。

+0

我不確定我關注。哪些代碼有效,哪些不會?當你運行不起作用的代碼時會發生什麼? – 2014-11-21 16:17:30

+0

@MichaelMyers:沒有佈局的代碼工作。具有佈局的人將顯示橫幅面板,但不顯示其在測試類中創建的對象的控件面板。 – psyc0der 2014-11-21 17:19:50

回答

4

重寫public Dimension getPreferredSize()(並返回new Dimensioncontrols類。當組件放入WEST時,寬度將由preferredSize確定。如果您不覆蓋getPreferredSize,則首選大小將爲0.在計算WEST等後,CENTER將佔用剩餘空間。第二種情況是有效的,因爲它在默認的CENTERBorderLayout

+0

我加了 'public Dimension getPreferredSize(){ \t return new Dimension(50,50); }'在控件類中。但它仍然不渲染面板。難道我做錯了什麼? – psyc0der 2014-11-21 17:16:07

+0

嘗試用'100'。不知道爲什麼50不會工作 – 2014-11-21 17:20:48

+2

哦,這是因爲你正在繪製的圓的位置。如果面板的大小爲50,並且您開始以50繪製,則圓形將超出面板的大小。如果你在'0,0,50,50'處繪製,你可以使用'50,50'。但是你應該把面板的尺寸做得很大,就像你想要的那樣,整個圖面是 – 2014-11-21 17:21:58

相關問題