5

BorderLayoutを動作させることができません。キャンセルボタンを一番下に配置したいのですが、機能しません。コード:

import java.awt.BorderLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonModel;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

class Test {
    public static JFrame owner;
    public static void main(String[] args) {
        final JDialog frame = new JDialog(owner, "Test");
        frame.setLayout(new BorderLayout());
        frame.setSize(500, 300);
        final JPanel panel = new JPanel();
        final ButtonGroup group = new ButtonGroup();
        String[] options = {"1", "2", "3"};
        for (String text : options) {
            JRadioButton option = new JRadioButton(text);
            option.setActionCommand(text);
            group.add(option);
            panel.add(option);
        }
        JButton okButton = new JButton("OK");
        okButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ButtonModel selectedModel = group.getSelection();
                if (selectedModel != null) {
                    System.err.println(selectedModel.getActionCommand());
                }
            }
        });
        panel.add(okButton);
        JButton cancelButton = new JButton("Cancel");
        cancelButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.setVisible(false);
                frame.dispose();
            }
        });
        panel.add(cancelButton, BorderLayout.SOUTH);
        frame.add(panel);
        frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }
}
4

3 に答える 3

9

BorderLayout.SOUTH定数を使用してcancelButtonをパネルに追加します。

  panel.add(cancelButton, BorderLayout.SOUTH);

しかし、どこでパネルのレイアウトをBorderLayoutに設定しますか?このコンテナのレイアウトを設定することはないため、JPanelのデフォルトのレイアウトであるFlowLayoutが使用されます。

解決策:パネルJPanelのレイアウトをBorderLayoutに設定して、BorderLayoutの動作を取得します。

これを解決すると、別の問題が発生します。

  for (String text : options) {
     JRadioButton option = new JRadioButton(text);
     option.setActionCommand(text);
     group.add(option);
     panel.add(option);
  }

レイアウトに関係なく、同じパネルJPanelにJRadioButtonを追加しています。JRadioButtonを独自のJPanelに追加したいと思います。おそらく、必要な方向に応じてGridLayout(1, 0)またはを使用するJPanelに追加し、次にこのJPanelをパネル(おそらくBorderLayout.CENTERの位置)に追加したいと思います。GridLayout(0, 1)

また、レイアウトに関係なくパネルに追加するという点で、okButtonにも同様の問題があります。

于 2011-07-30T15:24:21.323 に答える
6

あなたは変更を試みることができます

panel.add(cancelButton, BorderLayout.SOUTH);

frame.add(cancelButton, BorderLayout.SOUTH);

結果:

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

于 2011-07-30T15:28:56.870 に答える
3

Hovercraft Full Of Eelsが言うように、デフォルトJPanelの動作は、であり、これは最も単純なものであり、ここでFlowLayout説明されています。コンストラクター内で指定することにより、必要なマネージャーに簡単に変更できます。

panel = new JPanel(new BorderLayout())
于 2011-07-30T15:28:24.417 に答える