2010-01-11 4 views
0

Я сделал макет в моем графическом интерфейсе, но он не работал, все компоненты просто появляются один за другим.Менеджер макета не работает

Вот мои коды:

import javax.swing.*; 
public class main extends JFrame { 
public main() { 
    try { 

     add(new FYP_Tx.GUI()); 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(800, 600); 
     setLocationRelativeTo(null); 
     setTitle("FYP Video Platform"); 
     setResizable(true); 
     setVisible(true); 

    } catch (Exception e) { 
     System.out.println("Exception: " + e.toString()); 
    } 
} 

public static void main(String[] args) { 
    new main(); 
} 
} 



public class GUI extends JPanel implements Runnable, ActionListener, ItemListener { 

private JButton btnStart, btnStop, btnPause, btnFile; 
private JLabel lblDisplay, lblSNR, lblStatus, lblConfig; 
private JCheckBox chkLoop, chkNeg; 
private Thread animator; 
private JFileChooser fileChooser; 
private JList lstML; 
private JTextField txtSNR; 
private boolean pauseAnimator, loop; 
Matlab_options matlab = new Matlab_options(); 

public GUI() { 
    GroupLayout guiLayout = new GroupLayout(this); 

    lblDisplay = new JLabel(); 
    lblStatus = new JLabel(); 
    lblConfig = new JLabel(); 
    lblSNR = new JLabel("SNR: "); 
    btnStart = new JButton("Start"); 
    btnStop = new JButton("Stop"); 
    btnPause = new JButton("Pause"); 
    btnFile = new JButton("Open File"); 
    chkLoop = new JCheckBox("Loop"); 
    chkNeg = new JCheckBox("Negative SNR"); 
    txtSNR = new JTextField(3); 
    txtSNR.setText("10"); 
    lblDisplay.setDoubleBuffered(true); 

    btnStart.setEnabled(false); 
    btnStop.setEnabled(false); 
    btnPause.setEnabled(false); 

    btnStart.setActionCommand("start"); 
    btnStop.setActionCommand("stop"); 
    btnPause.setActionCommand("pause"); 
    btnFile.setActionCommand("file"); 

    guiLayout.setAutoCreateContainerGaps(true); 
    guiLayout.setAutoCreateGaps(true); 
    GroupLayout.SequentialGroup hGroup = guiLayout.createSequentialGroup(); 
    GroupLayout.SequentialGroup vGroup = guiLayout.createSequentialGroup(); 

    hGroup.addGroup(guiLayout.createParallelGroup().addComponent(lblDisplay)); 
    hGroup.addGroup(guiLayout.createParallelGroup().addComponent(btnStart).addComponent(btnStop).addComponent(btnPause).addComponent(chkLoop)); 
    hGroup.addGroup(guiLayout.createParallelGroup().addComponent(btnFile).addComponent(chkLoop)); 
    guiLayout.setHorizontalGroup(hGroup); 

    vGroup.addGroup(guiLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(lblDisplay).addComponent(btnStart).addComponent(btnFile)); 
    vGroup.addGroup(guiLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(btnStop).addComponent(chkLoop)); 
    guiLayout.setVerticalGroup(vGroup); 

    btnStart.addActionListener(this); 
    btnStop.addActionListener(this); 
    btnPause.addActionListener(this); 
    btnFile.addActionListener(this); 
    chkLoop.addItemListener(this); 
    chkNeg.addItemListener(this); 
} 

public void addNotify() { 
    super.addNotify(); 
    loop = false; 
    lblDisplay.setSize(400, 400); 
    lblDisplay.setVisible(true); 
    animator = new Thread(this); 
} 

public void paint(Graphics g) { 
    super.paint(g); 
    Toolkit.getDefaultToolkit().sync(); 
    g.dispose(); 
} 

`

+1

GroupLayout был разработан для GUI строительных инструментов, лично я бы код вручную, используя другой менеджер компоновки, такие как GridBagLayout или BoxLayout – pstanton

+0

BoxLayout не будет обрабатывать этот материал без каких-либо серьезных вложенных компонентов. Я мог бы использовать GridBagLayout, но я могу понять, что это запугивает многих людей. –

+0

да, это все личные предпочтения, но я нахожу ручную кодировку GroupLayout более устрашающей! – pstanton

ответ

3

Вы не должны установить LayoutManager для JPanel?

public GUI() { 
     GroupLayout guiLayout = new GroupLayout(this); 
     this.setLayout(guiLayout); 
...... 
    } 
+0

Я не могу в это поверить, просто одна строка ... Знаете, я пробовал так много до публикации здесь. Спасибо за помощь. –

+0

@HH: В будущем, вместо 'new main()', рассмотрим возможность построения вашего Swing GUI в потоке отправки событий: http://java.sun.com/docs/books/tutorial/uiswing/concurrency/initial. html – trashgod

+0

Я смущен, что пропустил это и предложил гораздо более сложное решение. Удаление ... –

Смежные вопросы