JFrame内に等間隔のメニューを作成しようとしています。不等間隔のメニューとは、メニュー項目の幅がそのメニューに入力するテキストによって異なることを意味します。現在、私のメニューは次のようになっています。
メニューをこんな感じにしたい
それをしてもいいですか ?そのためにレイアウトマネージャーを使用する必要がありますか?
JFrame内に等間隔のメニューを作成しようとしています。不等間隔のメニューとは、メニュー項目の幅がそのメニューに入力するテキストによって異なることを意味します。現在、私のメニューは次のようになっています。
メニューをこんな感じにしたい
それをしてもいいですか ?そのためにレイアウトマネージャーを使用する必要がありますか?
間隔を均等にするためにJToolBar
、を使用することもできます。GridLayout(1, 0)
そのためにレイアウトマネージャーを使用する必要がありますか?
短い答え:はい:-)
より長い答え:メニュー/バーは、一部のレイアウトマネージャーが期待どおりに機能しないという点で少し特別です(読んでください:私)。頭に浮かぶ最も単純なのは、1行のGridLayoutです。
// sanity check: does grid respect component alignment?
// manager does, but menu internal layout doesn't
JComponent content = new JPanel(new GridLayout(3, 3));
for (int i = 0; i < 9; i++) {
if (i % 2 == 0) {
JMenu menu = new JMenu("menu: " + i);
menu.setBorderPainted(true);
menu.setBorder(BorderFactory.createLineBorder(Color.GREEN));
menu.setHorizontalAlignment(JMenu.CENTER);
content.add(menu);
} else {
JLabel menu = new JLabel("label: " + i);
menu.setBorder(BorderFactory.createLineBorder(Color.GREEN));
menu.setHorizontalAlignment(JMenu.CENTER);
content.add(menu);
}
}
JXFrame frame = wrapInFrame(content, "menuBar with GridLayout");
JMenuBar bar = getMenuBar(frame);
// not surprisingly (after sanity check),
// horizontal align isn't respected in the menubar as well
bar.setLayout(new GridLayout(1, 0));
JMenu menu = new JMenu("some dummy");
menu.setBorderPainted(true);
menu.setBorder(BorderFactory.createLineBorder(Color.GREEN));
menu.setHorizontalAlignment(JMenu.CENTER);
bar.add(menu);
bar.add(new JMenu("other"));
show(frame, 500, 500);
健全性チェックは、JMenuがレイアウトの方法について独自のアイデアを持っていることを示しています。つまり、コンテンツは常に先頭に配置されます(正確な距離はLAFであり、topLevelMenuであるかどうかは関係ありません)。これは、内部でMenuItemLayoutHelperを使用して、BasicMenuItem.paintMenuItemにハードコーディングされています。
したがって、最も単純なマネージャーは、期待どおりにサイズを決定して配置しますが、個々のアイテムを中央に配置することはできません。
センタリングが必要な場合は、トリックを使用できます(ただし、[1]は推奨されません)。実装の詳細に基づいて、
各アイテムの前後に接着剤を追加できます。
JMenu menu = new JMenu("some dummy");
menu.setBorderPainted(true);
menu.setBorder(BorderFactory.createLineBorder(Color.GREEN));
menu.setHorizontalAlignment(JMenu.CENTER);
bar.add(Box.createHorizontalGlue());
bar.add(menu);
bar.add(Box.createHorizontalGlue());
bar.add(new JMenu("other"));
bar.add(Box.createHorizontalGlue());
これにより、メニューバーの幅全体に中央に配置され、均等に分散されているように見えます。(必要に応じて)欠点は、メニューのサイズが好みに合わせて設定されているため、バー全体が表示されないことです。
[1]同じ効果は、実装の詳細に依存することなく、fiMigLayoutのような強力で十分なマネージャーを使用してクリーンに実行できます。
bar.setLayout(new MigLayout("fill, insets 0", "[center]"));
各メニュー項目の希望するサイズを同じに設定します。
jMenu1.setPreferredSize(new java.awt.Dimension(80, 21));
jMenu2.setPreferredSize(new java.awt.Dimension(80, 21));
jMenu3.setPreferredSize(new java.awt.Dimension(80, 21));