【问题标题】:Layout manager won't work布局管理器不起作用
【发布时间】:2010-01-11 01:51:06
【问题描述】:

我在我的 GUI 中做了一个布局,但它不起作用,所有组件只是一个接一个地出现。

这是我的代码:

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();
}

`

【问题讨论】:

  • GroupLayout 是为 GUI 构建工具而设计的,我个人会使用不同的布局管理器(例如 GridBagLayout 或 BoxLayout)手动编写代码
  • BoxLayout 不会在没有一些严重的嵌套组件的情况下处理这些东西。我可能会使用 GridBagLayout,但我可以理解它会吓倒很多人。
  • 是的,这都是个人喜好,但我发现手工编码 GroupLayout 更令人生畏!
  • 看看 splungebob 对 GridBagLayout 的 here 有什么看法

标签: java swing grouplayout


【解决方案1】:

你不需要为 JPanel 设置 Layoutmanager 吗?

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

【讨论】:

  • 我不敢相信,只有一行......你知道,我在发帖之前已经尝试了很多方法。感谢您的帮助。
  • @HH:为了将来参考,而不是 new main(),考虑在事件调度线程上构建您的 Swing GUI:java.sun.com/docs/books/tutorial/uiswing/concurrency/…
  • 我很遗憾错过了这一点,并提供了一个更复杂的解决方案。正在删除...
  • @Carl:IIRC,这是一个有趣的选择。我会投票支持取消删除和编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 2018-06-12
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多