JOptionPaneの背景色を変更する
Total: 2385
, Today: 3
, Yesterday: 3
Posted by aterai at
Last-modified:
概要
JOptionPane
で使用されている子JPanel
をすべて透明化して背景色を指定した色に変更します。
Screenshot
Advertisement
サンプルコード
UIManager.put("OptionPane.background", Color.LIGHT_GRAY);
String txt = "<html>JOptionPane:<br><li>messageArea<li>realBody<li>separator<li>body<li>buttonArea";
String title = "Title";
int type = JOptionPane.WARNING_MESSAGE;
JLabel label = new JLabel(txt);
label.addHierarchyListener(e -> {
Component c = e.getComponent();
if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0 && c.isShowing()) {
stream(SwingUtilities.getAncestorOfClass(JOptionPane.class, c))
.filter(JPanel.class::isInstance)
.map(JPanel.class::cast) // TEST: .peek(cc -> System.out.println(cc.getName()))
.forEach(p -> p.setOpaque(false));
}
});
JButton b2 = new JButton("background");
b2.addActionListener(e -> JOptionPane.showMessageDialog(b2.getRootPane(), label, title, type));
View in GitHub: Java, Kotlin解説
default
UIManager.put("OptionPane.background", Color.LIGHT_GRAY)
でJOptionPane
の背景色を変更JOptionPane
で使用されている子JPanel
が不透明のためフチ色のみ変更される
background
UIManager.put("OptionPane.background", Color.LIGHT_GRAY)
でJOptionPane
の背景色を変更- メッセージ用コンポーネントに
HierarchyListener
を追加してJOptionPane
のオープンイベントを取得 JOptionPane
が表示状態になったらその子JPanel
を検索し、すべてsetOpaque(false)
で透明化- デフォルトの
JOptionPane
は以下の名前の5
つのJPanel
で構成されているOptionPane.messageArea
OptionPane.realBody
OptionPane.separator
OptionPane.body
OptionPane.buttonArea
override
JOptionPane.paintComponent(...)
をオーバーライドして背景を任意のTexture
に変更JOptionPane
の子JPanel
を検索し、すべてsetOpaque(false)
で透明化