3

JComboBoxコンポーネントを。の中に入れると、奇妙な動作に遭遇しましたGroupLayout。コードを以下の最小限の例に減らしました。これは、JComboBoxによってレイアウトされたものだけを特徴としていGroupLayoutます。

観察された動作は次のとおりです。

  • フレームが展開されたコンボボックスリスト(ダミーエントリa、b、cを含む)よりも小さい場合、コンボボックスの小さな下向き矢印をクリックすると正しく開きます。
  • 展開されたコンボボックスリストよりも大きくなるようにフレームのサイズを変更すると、展開されたコンボボックスリストが開かれません。

私がすでに知ったこと:

  • JComboBoxの親ウィンドウが小さすぎる場合、javax.swing.PopupFactoryはHEAVY_WEIGHT_POPUPコンポーネントを作成します。
  • 親ウィンドウが十分に大きい場合、LIGHT_WEIGHT_POPUPが作成されます。
  • 私が試した他のレイアウトマネージャーは問題なく動作するため、この動作は間違いなくGroupLayoutまたはそのいくつかの副作用に関連しています。
  • GroupLayoutでaddGap()を使用すると、問題が少し変わります。つまり、JComboBoxが表示されないウィンドウサイズが変わります。

これはサンプルコードです-コメントは大歓迎です:

import java.awt.BorderLayout;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JRootPane;

public class DummyUI_cbdiagnosis extends javax.swing.JPanel {
    private javax.swing.JComboBox cbCategory;

    public DummyUI_cbdiagnosis() {
        initComponents();
    }

    private void initComponents() {
        cbCategory = new JComboBox();
        cbCategory.setModel(new javax.swing.DefaultComboBoxModel(new String[] {
                "a", "b", "c" }));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(
                javax.swing.GroupLayout.Alignment.LEADING).addGroup(
                layout.createSequentialGroup().addComponent(cbCategory,
                        javax.swing.GroupLayout.PREFERRED_SIZE,
                        javax.swing.GroupLayout.PREFERRED_SIZE,
                        javax.swing.GroupLayout.PREFERRED_SIZE)));
        layout.setVerticalGroup(layout.createParallelGroup(
                javax.swing.GroupLayout.Alignment.LEADING).addGroup(
                layout.createSequentialGroup().addComponent(cbCategory)
        ));
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JRootPane rootPane = frame.getRootPane();
        rootPane.setLayout(new BorderLayout());

        DummyUI_cbdiagnosis panel = new DummyUI_cbdiagnosis();
        rootPane.add(panel, BorderLayout.NORTH);

        frame.pack();
        frame.setVisible(true);
    }
}
4

1 に答える 1

6

RootPaneコンポーネントをそれ自体に追加することは絶対にしないでください。コンポーネントをに追加してcontentPaneください。

frame.add(panel);

また

frame.setContentPane(panel);

ARootPaneは、どこに配置するかを制御できます。

  • メニューバー。
  • コンテンツ。
  • ガラス板。
  • そして、最も重要な、軽量のポップアップ(inc。JComboBox)、ダイアログ、ドラッグアンドドロップなど。

RootPaneと呼ばれる特別なレイアウトマネージャーを使用します。RootLayoutに変更しないでくださいBorderLayout

于 2012-11-16T17:06:38.350 に答える