TitledBorderの背景色を設定する
Total: 1297
, Today: 1
, Yesterday: 4
Posted by aterai at
Last-modified:
概要
TitledBorder
を背景色を変更する方法をテストします。
Screenshot
Advertisement
サンプルコード
JPanel p1 = new JPanel() {
@Override protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setPaint(getBackground());
g2.fill(SwingUtilities.calculateInnerArea(this, null));
g2.dispose();
super.paintComponent(g);
}
};
p1.setBackground(Color.WHITE);
p1.setOpaque(false);
p1.setBorder(BorderFactory.createTitledBorder(title));
View in GitHub: Java, Kotlin解説
Default TitledBorder
- デフォルトでは
TitledBorder
で使用されるJLabel
はisOpaque() == true
なのでTitledBorder
を設定したJPanel
ではなくその親JPanel
の背景色が表示される
- デフォルトでは
Transparent TitledBorder
TitledBorder
を設定したJPanel
のpaintComponent(...)
メソッドをオーバーライドし、SwingUtilities.calculateInnerArea(...)
でBorder
を除いた領域を白で塗りつぶすよう設定- java - How to set background within the titled border? - Stack Overflow
Paint TitledBorder background
- 上記の
Transparent TitledBorder
とは逆にBorder
を描画する領域のみTitledBorder
を設定したJPanel
の背景を白で塗りつぶすよう設定JPanel p2 = new JPanel() { @Override protected void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g.create(); g2.setPaint(getBackground()); Area area = new Area(new Rectangle(getSize())); area.subtract(new Area(SwingUtilities.calculateInnerArea(this, null))); g2.fill(area); g2.dispose(); super.paintComponent(g); } };
- 上記の
Override paintBorder
TitledBorder#paintBorder(...)
をオーバーライドしてTitledBorder
の上辺のみ背景を白で塗りつぶすよう設定TitledBorder#isBorderOpaque(...)
はオーバーライドしても効果がない
OverlayLayout + JLabel
TitledBorder
のタイトルは空にして背景色を白に設定したJLabel
をOverlayLayout
で左上に配置BorderFactory.createTitledBorder("<html><span style='background:white'>html TitledBorder")
のようにhtml
タグを使用してタイトルの背景色のみ変更する方法もある- Borderの右下にJComponentを配置
- BorderにJComponentを配置
JLabel label = new JLabel(title, SwingConstants.LEADING); label.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 4)); label.setOpaque(true); label.setBackground(Color.WHITE); label.setAlignmentX(Component.LEFT_ALIGNMENT); label.setAlignmentY(Component.TOP_ALIGNMENT); Box box = Box.createHorizontalBox(); box.add(Box.createHorizontalStrut(8)); box.add(label); box.setAlignmentX(Component.LEFT_ALIGNMENT); box.setAlignmentY(Component.TOP_ALIGNMENT); int height = label.getPreferredSize().height / 2; Color color = new Color(0x0, true); Border b1 = BorderFactory.createMatteBorder(height, 2, 2, 2, color); Border b2 = BorderFactory.createTitledBorder(""); p.setBorder(BorderFactory.createCompoundBorder(b1, b2)); p.setAlignmentX(Component.LEFT_ALIGNMENT); p.setAlignmentY(Component.TOP_ALIGNMENT); JPanel panel = new JPanel(); panel.setLayout(new OverlayLayout(panel)); panel.add(box); panel.add(p);
参考リンク
- java - How to set background within the titled border? - Stack Overflow
- Borderの右下にJComponentを配置
- BorderにJComponentを配置
- TitledBorderのタイトルにアイコンを表示する
- TitledBorderにタイトル文字列までの内余白を設定する
- [JDK-8213531] Test javax/swing/border/TestTitledBorderLeak.java fails - Java Bug System