4

現在、次の GUI を使用して小さなユーティリティを開発しています。

サンプル GUI

現在、すべてを配置する BorderLayout レイアウトのコンテナー (JPanel) があります。i には、BorderLayout.NORTH と BorderLayout.SOUTH にそれぞれ配置された別の 2 つの JPanel があり、それぞれに GridLayout (2 列 x 1 行) があります。テーブルは、その中央に配置されたメイン コンテナにあります。

これが最善のアプローチだと思いますか?コンポーネントとフレームの境界線の間のスペースを処理するのに苦労しています。

今、私はこのコードを持っています:

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があります

ここに画像の説明を入力

モックアップのように、コンポーネントを境界線から均等に離して配置します。

4

4 に答える 4

4

これを実現するために使用できる2つのこと:

  1. 使用するBorderFactory.createEmptyBorder(int, int, int, int)
  2. の4引数コンストラクターを使用しますGridLayout

同じ機能をもたらすことができる他のLayoutManagerがあります(GridBagLayout、またはネストされたものを使用するなどBorderLayout)が、現在のものに慣れている場合LayoutManagerは、それらに変更する必要はありません。あなたがした方法も受け入れられます。

ここに画像の説明を入力してください

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);
            }
        });
    }
}
于 2013-03-12T14:36:40.673 に答える
4

過去に、MigLayoutを使用するとすべての問題が解決することがわかりました

于 2013-03-12T14:18:58.383 に答える
3

GUIを配置する方法は次のとおりです。これは1つの方法にすぎません。それが唯一の方法ではありません。

  • JTable内部に入りJScrollPaneます。

  • Button2ボタンのButton3内側JPanelFlowLayout

  • LabelButton1ラベルの内側JPanelFlowLayout

  • ファイル、レポート、およびヘルプはJMenuItemにありJMenuBarます。

  • メインJPanelにはBoxLayoutY_AXIS方向のがあります。

  • ラベル、、、JPanelおよびJScrollPaneボタンJPanelをメインに追加しますJPanel

于 2013-03-12T14:36:23.307 に答える
2

GUI を作成する最善の方法は、自分や他の人が理解できる方法でコーディングすることです。このGuide to Layout Managers をご覧ください。コンポーネントごとに異なるレイアウト マネージャーを使用できます。これは、正しい間隔を設定するのに役立ちます。

問題がコンポーネントの周囲の間隔だけである場合は、そのInsetsを設定します。

于 2013-03-12T14:20:24.163 に答える