2014-10-26 3 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», но с этим кодом я получаю пустой кадр. До сих пор единственный раз, когда изображение в JLabels оказалось, был, когда я добавил его непосредственно к 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 * делает работа *. Я делаю это все время. Я быстро просмотрю ваш код, но в то же время вам нужно выполнить ** все ** [код Swing в теме Dispatch Thread.] (Http://docs.oracle.com/javase/tutorial/ uiswing/concurrency/dispatch.html) Начните с этого изменения. – markspace

+0

JLaywredPane по умолчанию не имеет LayoutManager, если вы его не задали, вам нужно установить размер компонентов, которые вы добавляете к нему. – MadProgrammer

ответ

3

«По умолчанию многоуровневая панель не имеет менеджера компоновки». - How to Use Layered Panes

Установите рамки для своей этикетки, и она появится. Например:

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

Имейте в виду, что вы делаете это для целей назначения, и что на практике вы, вероятно, не было бы установить границы компонента, если вы не используете абсолютное расположение на цели.


Edit:
Как MadProgrammer отметил, вы можете также установить менеджер компоновки для слоистой панели, в этом случае вам не нужно устанавливать границы этикетки. Например:

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

Или добавить менеджера компоновки в многоуровневую панель;) – MadProgrammer

+0

Wow, спасибо за быстрый ответ, я беспокоился, что это будет что-то более сложное. – joghurtgumi93