3

私はSwingが初めてですが、やろうとしていることを達成するのに苦労しています。次のような画面を作成したいと思います。

ここに画像の説明を入力

この種の画面に最適なレイアウトがわかりません。BorderLayout を使用してみましたが、うまくいきません。右下にボタンがありますが、中央のコンポーネントは非常に難しいことがわかりました. コンポーネントをパネルに追加する方法は知っていますが、苦労している領域はそれらを配置する方法です。BORDERLAYOUT を使用してパネルにテキスト フィールドを追加すると、必要のないパネル全体のスペースを占有してしまうことがあります。

AbsoluteLayout を使用してほとんど動作させることができましたが、画面を流動的にしたい場合、これは最良の選択肢ではないと思います。

setBounds(100, 100, 775, 599);
getContentPane().setLayout(new BorderLayout());
contentPanel.setBackground(SystemColor.control);
contentPanel.setForeground(Color.RED);
contentPanel.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
getContentPane().add(contentPanel, BorderLayout.CENTER);
contentPanel.setLayout(new BorderLayout(0, 0));
{
    JPanel topHeadersPanel = new JPanel();
    contentPanel.add(topHeadersPanel, BorderLayout.NORTH);
    topHeadersPanel.setLayout(new BorderLayout(0, 0));
    {
        JLabel lblSetSourceRecord = new JLabel("Source customer record:");
        lblSetSourceRecord.setFont(new Font("Tahoma", Font.BOLD, 12));
        topHeadersPanel.add(lblSetSourceRecord, BorderLayout.WEST);
    }
    {
        JLabel lblSetDestinationRecord = new JLabel("Destination customer record:");
        lblSetDestinationRecord.setFont(new Font("Tahoma", Font.BOLD, 12));
        topHeadersPanel.add(lblSetDestinationRecord, BorderLayout.EAST);
    }

    {
        JLabel lblSetDestinationRecord = new JLabel("Source customer:");
        lblSetDestinationRecord.setFont(new Font("Tahoma", Font.BOLD, 12));
        topHeadersPanel.add(lblSetDestinationRecord, BorderLayout.SOUTH);
    }
}
{
    JPanel buttonPane = new JPanel();
    buttonPane.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
    buttonPane.setLayout(new FlowLayout(FlowLayout.CENTER));
    getContentPane().add(buttonPane, BorderLayout.SOUTH);
    {
        JPanel panel = new JPanel();
        buttonPane.add(panel);
    }
    {
        JButton okButton = new JButton("OK");
        okButton.setActionCommand("OK");
        buttonPane.add(okButton);
        getRootPane().setDefaultButton(okButton);
    }
    {
        JButton cancelButton = new JButton("Cancel");
        cancelButton.setActionCommand("Cancel");
        buttonPane.add(cancelButton);
    }
4

3 に答える 3

5

GridLayout1 行 2 列の a 内の上部を作成してみて、それBorderLayoutを CENTER として a に追加し、ボタンを として追加しますBorderLayout.BOTTOM。上部には、左用と右用の 2 つのパネルを使用します。

そして、これを示すコードがいくつかあります(例を実際にコピー/貼り付けできませんでした):

public class MW extends JFrame {

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }

    private static void createAndShowUI() {
        MW x = new MW();

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new GridLayout(1, 2));

        JPanel leftPanel = new JPanel();
        JLabel srcLabel = new JLabel("Source record:");
        leftPanel.add(srcLabel);
        JPanel rightPanel = new JPanel();
        JLabel dstLabel = new JLabel("Destination record:");
        rightPanel.add(dstLabel);

        mainPanel.add(leftPanel);
        mainPanel.add(rightPanel);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
        JButton okButton = new JButton("OK");
        buttonPanel.add(okButton);
        JButton cancelButton = new JButton("Cancel");
        buttonPanel.add(cancelButton);

        x.setSize(400, 400);
        x.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        x.add(mainPanel, BorderLayout.CENTER);
        x.add(buttonPanel, BorderLayout.PAGE_END);
        x.setLocationRelativeTo(null);
        x.setVisible(true);
    }
}
于 2013-01-23T20:54:31.980 に答える
4

これを行うネストされたコンポーネントをボックス化したこの図を見てください

ここに画像の説明を入力

一番上のレベルでは、垂直のボックスに 2 つの茶色のセクションがあります。

次に、それらの上部には、グリッドまたは青色で示される水平ボックスがあります。

次に、それぞれに適切な間隔で黄色がかったボックス レイアウトがあります。

次にコンテナを配置し、それぞれに適切なレイアウトを使用すると、最終的なコンポーネントがコンテナ内に入ります。

これを簡単にするツールがいくつかあります。私はずっと前に NetBeans エディタを使用していました。次に、Eclipse の IBM WSAD/RAD バージョンでエディターを使用しました。今では、そのようなレイアウトを行う必要がある場合は、MyEclipse の Matisse エディターを使用しています。

編集

@DaDaDom が、茶色のレベルの外側に類似したものを提案していることに気付きました。彼は上部のボックスを中央に、ボタンのボックスを南に配置したボーダー レイアウトを好みます。それは本当にうまくいくでしょう。

于 2013-01-23T20:58:48.140 に答える