2014-10-26 49 views
0
//TbsgMain.java: 
package tbsg; 

import javax.swing.JFrame; 

public class TbsgMain { 

public static void main(String[] args) { 
    TbsgEngine engine = new TbsgEngine(); 
    JFrame mainFrame = new TbsgFrame(engine); 
    mainFrame.setVisible(true); 

} 

} 

//TbsgFrame.java 
package tbsg; 

class TbsgFrame extends JFrame { 

private TbsgEngine engine; 
private JLayeredPane mainScreen; 
private JLabel label1; 

public TbsgFrame(TbsgEngine eng) { 
    engine = eng; 
    setTitle("TBSG"); 
    setLocation(10, 10); 
    setPreferredSize(new Dimension(600, 600)); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setLayout(new BorderLayout()); 

    mainScreen = new JLayeredPane(); 

    label1 = new JLabel(); 
    label1.setIcon(new ImageIcon(new ImageIcon(getClass().getResource("imgs/hex." 
    + "png")).getImage().getScaledInstance(115, 100, Image.SCALE_SMOOTH))); 
    mainScreen.add(label1, 0); 
    this.add(mainScreen); 
    this.pack(); 
} 

} 

我正在做的分配,這將需要多個不同的擺動容器和組件(JPanel的,JLayeredPane的,一個JLabel,JButton的,等等)被放置內海誓山盟並最終調用JFrame中內「mainFrame」,但有了這個代碼,我只能得到一個空框架。迄今爲止唯一一次在中的JLabel形象出現,是當我直接添加它到JFrame,像這樣:嵌套擺動容器不顯示

//TbsgFrame.java 
package tbsg; 

class TbsgFrame extends JFrame { 

private TbsgEngine engine; 
private JLabel label1; 

public TbsgFrame(TbsgEngine eng) { 
    engine = eng; 
    setTitle("TBSG"); 
    setLocation(10, 10); 
    setPreferredSize(new Dimension(600, 600)); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setLayout(new BorderLayout()); 

    label1 = new JLabel(); 
    label1.setIcon(new ImageIcon(new ImageIcon(getClass().getResource("imgs/" 
    + "hex.png")).getImage().getScaledInstance(115, 100, Image.SCALE_SMOOTH))); 
    this.add(label1); 
    this.pack(); 
} 

} 

我怎麼能得到的JPanel(以及後來的其他部件)出現?任何幫助真的會被讚賞。

+0

Nest JComponents * does work *。我一直這樣做。我將快速瀏覽一下你的代碼,但是同時你需要執行** all ** [Event Dispatch Thread上的Swing代碼。](http://docs.oracle.com/javase/tutorial/ uiswing/concurrency/dispatch.html)從那個改變開始。 – markspace 2014-10-26 20:27:54

+0

JLaywredPane在默認情況下沒有LayoutManager,除非您提供一個LayoutManager,您需要設置添加到其中的組件的大小 – MadProgrammer 2014-10-26 20:40:04

回答

3

「默認情況下,分層窗格沒有佈局管理器。」 - How to Use Layered Panes

爲您的標籤設置邊界,它會出現。例如:

label1.setBounds(20, 20, 200, 100); 

請記住,您是分配的目的這樣做,並在實踐中你可能不會設置組件的邊界,除非你是故意使用絕對佈局。


編輯:
作爲MadProgrammer指出的那樣,你也可以設置分層窗格佈局管理器,在這種情況下,你不需要設置標籤界限。例如:

mainScreen.setLayout(new BorderLayout()); 
+0

或者將佈局管理器添加到分層窗格;) – MadProgrammer 2014-10-26 20:40:53

+0

哇,感謝您的快速回答,我擔心它會更復雜一些。 – joghurtgumi93 2014-10-26 20:43:28