如何在Java Swing中对此GUI进行编程

时间:2013-03-12 14:15:58

标签: java swing user-interface layout-manager

我目前正在使用以下GUI开发一个小实用程序:

Sample GUI

现在我有一个容器(JPanel),其BorderLayout布局可以保存所有内容。我有另外2个JPanels分别放在BorderLayout.NORTH和BorderLayout.SOUTH上,每个都有GridLayout(2列1行)。该表位于放置在CENTER的主容器上。

你认为这是最好的方法吗?我很难处理组件和框架边框之间的间距。

现在我有了这段代码:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

public class GUI extends JFrame {

    private JButton loadFileBtn = new JButton("Load File");
    private JButton generateReportBtn = new JButton("Generate Report");
    private JButton exitBtn = new JButton("Exit");
    private JLabel fileNameLbl = new JLabel("File Name Here");
    private JMenuBar menuBar = new JMenuBar();
    private JMenu fileMI = new JMenu("File");
    private JMenuItem openFileMenu = new JMenuItem("Open File");
    private JSeparator separator = new JSeparator();
    private JMenuItem exitMenu = new JMenuItem("Exit");
    private JMenu reportMI = new JMenu("Report");
    private JMenuItem generateReportMenu = new JMenuItem("Generate Report");
    private JMenu helpMI = new JMenu("Help");
    private JMenuItem aboutMenu = new JMenuItem("About");
    private JTable table = new JTable(5, 2);
    private JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
    private JPanel panel1 = new JPanel(new BorderLayout());
    private JPanel panel2 = new JPanel(new GridLayout(1, 2));
    private JPanel panel3 = new JPanel(new GridLayout(1, 2));

    public GUI() {

        super("Sample GUI");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(new Dimension(300, 300));
        setResizable(false);

        setLayout(new BorderLayout(10, 10));

        fileMI.add(openFileMenu);
        fileMI.add(separator);
        fileMI.add(exitMenu);

        reportMI.add(generateReportMenu);

        helpMI.add(aboutMenu);

        menuBar.add(fileMI);
        menuBar.add(reportMI);
        menuBar.add(helpMI);

        setJMenuBar(menuBar);

        panel1.add(table, BorderLayout.CENTER);

        panel2.add(fileNameLbl);
        panel2.add(loadFileBtn);

        panel3.add(generateReportBtn);
        panel3.add(exitBtn);

        mainPanel.add(panel2, BorderLayout.NORTH);
        mainPanel.add(panel1, BorderLayout.CENTER);
        mainPanel.add(panel3, BorderLayout.SOUTH);

        add(mainPanel);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                GUI app = new GUI();
                app.setVisible(true);
            }
        });
    }
}

您认为这样做的最佳方法是什么?

任何帮助将不胜感激。感谢。


更新:

现在,我有以下GUI

enter image description here

我希望组件能够均匀地远离边框,就像在模型中一样。

4 个答案:

答案 0 :(得分:4)

过去,我发现使用MigLayout解决了我的所有问题

答案 1 :(得分:4)

你可以用两件事来实现这个目标:

  1. 使用BorderFactory.createEmptyBorder(int, int, int, int)
  2. 使用GridLayout
  3. 的4-args构造函数

    还有其他LayoutManager可以带来相同的功能(如GridBagLayout,或使用嵌套的BorderLayout),但如果您对当前LayoutManager感到满意,则没有专横的需要改变那些。你做的方式也是可以接受的。

    enter image description here

    您可以考虑将表格包装在JScrollPane中以使其更好,如果需要,还可以使用标题和滚动条。

    小示例代码:

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JSeparator;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    
    public class GUI extends JFrame {
    
        private JButton loadFileBtn = new JButton("Load File");
        private JButton generateReportBtn = new JButton("Generate Report");
        private JButton exitBtn = new JButton("Exit");
        private JLabel fileNameLbl = new JLabel("File Name Here");
        private JMenuBar menuBar = new JMenuBar();
        private JMenu fileMI = new JMenu("File");
        private JMenuItem openFileMenu = new JMenuItem("Open File");
        private JSeparator separator = new JSeparator();
        private JMenuItem exitMenu = new JMenuItem("Exit");
        private JMenu reportMI = new JMenu("Report");
        private JMenuItem generateReportMenu = new JMenuItem("Generate Report");
        private JMenu helpMI = new JMenu("Help");
        private JMenuItem aboutMenu = new JMenuItem("About");
        private JTable table = new JTable(5, 2);
        private JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
        private JPanel panel1 = new JPanel(new BorderLayout());
        private JPanel panel2 = new JPanel(new GridLayout(1, 2, 10, 10));
        private JPanel panel3 = new JPanel(new GridLayout(1, 2, 10, 10));
    
        public GUI() {
    
            super("Sample GUI");
    
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(new Dimension(300, 300));
            setResizable(false);
    
            setLayout(new BorderLayout(10, 10));
    
            fileMI.add(openFileMenu);
            fileMI.add(separator);
            fileMI.add(exitMenu);
    
            reportMI.add(generateReportMenu);
    
            helpMI.add(aboutMenu);
    
            menuBar.add(fileMI);
            menuBar.add(reportMI);
            menuBar.add(helpMI);
    
            setJMenuBar(menuBar);
    
            panel1.add(table, BorderLayout.CENTER);
    
            panel2.add(fileNameLbl);
            panel2.add(loadFileBtn);
    
            panel3.add(generateReportBtn);
            panel3.add(exitBtn);
    
            mainPanel.add(panel2, BorderLayout.NORTH);
            mainPanel.add(panel1, BorderLayout.CENTER);
            mainPanel.add(panel3, BorderLayout.SOUTH);
            mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
            add(mainPanel);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    GUI app = new GUI();
                    app.setVisible(true);
                }
            });
        }
    }
    

答案 2 :(得分:3)

这是我如何安排你的GUI。这只是一种方式。这不是唯一的方法。

  • JTable位于JScrollPane内。

  • Button2Button3使用JPanel进入按钮FlowLayout

  • LabelButton1使用JPanel进入标签FlowLayout

  • JMenuItem上的文件,报告和帮助为JMenuBar

  • JPanelBoxLayout,方向为Y_AXIS。

  • 将标签JPanelJScrollPane和按钮JPanel添加到主JPanel

答案 3 :(得分:2)

最好的方法是创建一个GUI,以您和其他人理解的方式编写代码。看一下这个Guide to Layout Managers。您可以为不同的组件使用不同的布局管理器。这有助于您设置正确的间距。

如果您的问题只是组件周围的间距,请设置其Insets