• category: swing folder: OptionPaneSeparatorPadding title: JOptionPaneのメッセージエリアとボタンエリアの間の内余白を変更する tags: [JOptionPane, NimbusLookAndFeel] author: aterai pubdate: 2024-12-16T01:54:36+09:00 description: NimbusLookAndFeelのJOptionPaneでそのメッセージエリアとボタンエリアの間の内余白や全体の外余白を変更します。 image: https://drive.google.com/uc?id=1EIQNyh8JYazie0dhndQG2Qc-oZyfFzZH

概要

NimbusLookAndFeelのJOptionPaneでそのメッセージエリアとボタンエリアの間の内余白や全体の外余白を変更します。

サンプルコード

JOptionPane op = makeOptionPane();
JButton button = new JButton("separatorPadding");
button.addActionListener(e -> {
  UIDefaults d = new UIDefaults();
  int p = padding.getNumber().intValue();
  d.put("OptionPane.separatorPadding", p);
  int m = margin.getNumber().intValue();
  d.put("OptionPane.contentMargins", new InsetsUIResource(m, m, m, m));
  op.putClientProperty("Nimbus.Overrides", d);
  op.putClientProperty("Nimbus.Overrides.InheritDefaults", Boolean.TRUE);
  SwingUtilities.updateComponentTreeUI(op);
  String t1 = "separatorPadding: " + p;
  String t2 = "contentMargins: " + m;
  JDialog dialog = op.createDialog(getRootPane(), t1 + " / " + t2);
  dialog.setVisible(true);
});
View in GitHub: Java, Kotlin

解説

  • OptionPane.separatorPadding
    • JOptionPaneのメッセージエリアとボタンエリアの間の内余白を設定
    • NimbusLookAndFeel(SynthLookAndFeel)でのみ有効
    • 以下のようにBox.createVerticalStrut(UIManager.getInt("OptionPane.separatorPadding"))で不可視の高さ固定コンポーネントが作成される
    • 名前がsetName("OptionPane.separator")JSeparatorもこのVerticalStrutの上に挿入される?
    • JOptionPaneのアイコンとメッセージエリアの間に同名setName("OptionPane.separator")JPanelが挿入されるがその幅は固定new Dimension(15, 1)OptionPane.separatorPaddingの設定とは無関係
// javax/swing/plaf/synth/SynthOptionPaneUI.java
@Override protected void installComponents() {
  optionPane.add(createMessageArea());
  Container separator = createSeparator();
  if (separator != null) {
    optionPane.add(separator);
    SynthContext context = getContext(optionPane, ENABLED);
    optionPane.add(Box.createVerticalStrut(context.getStyle().
      getInt(context, "OptionPane.separatorPadding", 6)));
  }
  optionPane.add(createButtonArea());
  optionPane.applyComponentOrientation(optionPane.getComponentOrientation());
}
  • OptionPane.contentMargins
    • JOptionPane本体の外余白を設定
    • NimbusLookAndFeel(SynthLookAndFeel)でのみ有効、その他のLookAndFeelではJOptionPane#setBorder(BorderFactory.createEmptyBorder(...))などで変更?
    • NimbusDefaultsで設定されているOptionPane:\"OptionPane.separator\".contentMarginsは変更しても効果がない?
      • 同名のコンポーネントが2つ存在するから?
    • 同じくOptionPane:\"OptionPane.messageArea\".contentMarginsOptionPane:\"OptionPane.messageArea\":\"OptionPane.label\".contentMarginsを変更しても初期値から変更不可能?

参考リンク

コメント