【问题标题】:Java: Difficulty with SwingJava:Swing 的难度
【发布时间】:2010-10-26 09:12:18
【问题描述】:

我正在尝试修改 GUI。它正在托管一个显示 JOGL 内容的 GLCanvas。

这里是设置它的代码:

private void setupWindow() {
    this.frame = new JFrame(WINDOW_TITLE);
    frame.setSize(width, height);
    frame.setVisible(true);

    frame.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });

    JMenuBar menuBar = new JMenuBar();
    JMenu menu = new JMenu("File");
    menuBar.add(menu);
    JMenuItem exitItem = new JMenuItem("Exit");
    exitItem.addActionListener(listener);
    menu.add(exitItem);
    frame.setJMenuBar(menuBar);
}

目前,画布占据了窗口中除菜单栏外的整个空间。我想为窗口中的其他控件腾出空间,例如按钮和列表框。我该怎么做?

我尝试插入以下内容,但没有成功:

private void setupWindow() {
    this.frame = new JFrame(WINDOW_TITLE);
    frame.setSize(width, height);

    // ** inserted the following:
    JPanel canvasPanel = new JPanel(new BorderLayout());
    canvasPanel.add(canvas);
    canvasPanel.setSize(30, 40);
    canvasPanel.setVisible(true);
    // **

    frame.add(canvasPanel);
    frame.setVisible(true);

    frame.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });

    JMenuBar menuBar = new JMenuBar();
    JMenu menu = new JMenu("File");
    menuBar.add(menu);
    JMenuItem exitItem = new JMenuItem("Exit");
    exitItem.addActionListener(listener);
    menu.add(exitItem);
    frame.setJMenuBar(menuBar);
}

这根本不会修改窗口的外观。

我应该在这里做什么?我对 Java GUI 不太熟悉。

更新:将构造函数的参数从 BorderLayout 更改为 FlowLayout 会导致 GLCanvas 消失。

【问题讨论】:

  • 用 frame.setDefaultCloseOperation(EXIT_ON_CLOSE) 替换你的窗口监听器

标签: java user-interface swing jogl


【解决方案1】:

根据 Anon 的回答,您确实需要更好地了解布局管理器。你的问题太开放了。

如果这有帮助:

    JPanel canvasPanel = new JPanel(new BorderLayout());
    frame.add(canvasPanel, BorderLayout.CENTER);

    canvasPanel.add(canvas);


    Box leftBtnsBox = Box.createVerticalBox();
    frame.add(leftBtns, BorderLayout.WEST);

    leftBtns.add(new JButton("Button 1"));
    leftBtns.add(new JButton("Button 2"));

此代码明确设置了 BordeLayout,但我认为面板(和内容面板)的默认布局管理器是 BorderLayout。此代码会将两个按钮放在垂直排列的画布面板的左上方。因为您正在使用这些布局管理器,所以您的第二个代码示例的 setSize 无效。

【讨论】:

  • 1) 我认为最好明确设置布局,因为 AFAIR Sun 在 1.4 左右的某个时候将顶级容器的默认布局从 FlowLayout 更改为 BorderLayout。 2)目前JPanels的默认布局是FlowLayout。 3) 除了为 JButtons 使用 Box 之外,OP 还可以考虑使用 JToolBar。
【解决方案2】:

我建议向布局管理员查看 this guide - 它会为您提供足够的信息来了解您应该尝试什么。

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 2010-09-15
    • 1970-01-01
    • 2011-02-24
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多