Swing/VerticalTitledBorder のバックアップの現在との差分(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/VerticalTitledBorder へ行く。
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:TitledBorderのタイトルを縦(左側)に表示する #navi(../) #tags(Border) RIGHT:Posted by &author(aterai); at 2012-06-25 *TitledBorderのタイトルを縦(左側)に表示する [#h9a60703] ``TitledBorder``のタイトル文字列を縦(左側)に表示します。 --- category: swing folder: VerticalTitledBorder title: TitledBorderのタイトルを縦(左側)に表示する tags: [Border, TitledBorder, JLabel] author: aterai pubdate: 2012-06-25T18:19:01+09:00 description: TitledBorderのタイトル文字列を縦(左側)に表示します。 image: https://lh4.googleusercontent.com/-ndnU9h6kzPw/T-gQmrTVqdI/AAAAAAAABOQ/KwNEpVGLDa0/s800/VerticalTitledBorder.png --- * 概要 [#summary] `TitledBorder`のタイトル文字列を縦(左側)に表示します。 -&jnlp; -&jar; -&zip; #download(https://lh4.googleusercontent.com/-ndnU9h6kzPw/T-gQmrTVqdI/AAAAAAAABOQ/KwNEpVGLDa0/s800/VerticalTitledBorder.png) //#screenshot #ref(https://lh4.googleusercontent.com/-ndnU9h6kzPw/T-gQmrTVqdI/AAAAAAAABOQ/KwNEpVGLDa0/s800/VerticalTitledBorder.png) **サンプルコード [#hbd7cc79] * サンプルコード [#sourcecode] #code(link){{ class VerticalTitledBorder extends TitledBorder{ class VerticalTitledBorder extends TitledBorder { private final JLabel label; public VerticalTitledBorder(String title) { super(title); this.label = new JLabel(title); this.label.setOpaque(true); //this.label.putClientProperty(BasicHTML.propertyKey, null); // this.label.putClientProperty(BasicHTML.propertyKey, null); } @Override public void paintBorder( Component c, Graphics g, int x, int y, int width, int height) { Border border = getBorder(); String title = getTitle(); if((title != null) && !title.isEmpty() && border != null) { if ((title != null) && !title.isEmpty() && border != null) { int edge = (border instanceof TitledBorder) ? 0 : EDGE_SPACING; JLabel label = getLabel(c); Dimension size = label.getPreferredSize(); Insets insets = getBorderInsets(border, c, new Insets(0, 0, 0, 0)); int borderX = x + edge; int borderY = y + edge; int borderW = width - edge - edge; int borderH = height - edge - edge; int labelH = size.height; int labelW = height - insets.top - insets.bottom; //TEST: - (edge * 8); if(labelW > size.width) { int labelW = height - insets.top - insets.bottom; // TEST: - (edge * 8); if (labelW > size.width) { labelW = size.width; } int ileft = edge + insets.left/2 - labelH/2; if(ileft < edge) { int ileft = edge + insets.left / 2 - labelH / 2; if (ileft < edge) { borderX -= ileft; borderW += ileft; } border.paintBorder(c, g, borderX, borderY, borderW, borderH); Graphics2D g2 = (Graphics2D)g.create(); g2.translate(0, (height+labelW)/2); Graphics2D g2 = (Graphics2D) g.create(); g2.translate(0, (height + labelW) / 2); g2.rotate(Math.toRadians(-90)); //or: g2.transform(AffineTransform.getQuadrantRotateInstance(-1)); // or: g2.transform(AffineTransform.getQuadrantRotateInstance(-1)); label.setSize(labelW, labelH); label.paint(g2); g2.dispose(); }else{ } else { super.paintBorder(c, g, x, y, width, height); } } @Override public Insets getBorderInsets(Component c, Insets insets) { Border border = getBorder(); insets = getBorderInsets(border, c, insets); String title = getTitle(); if((title != null) && !title.isEmpty()) { if ((title != null) && !title.isEmpty()) { int edge = (border instanceof TitledBorder) ? 0 : EDGE_SPACING; JLabel label = getLabel(c); Dimension size = label.getPreferredSize(); if(insets.left < size.height) { if (insets.left < size.height) { insets.left = size.height - edge; } insets.top += edge + TEXT_SPACING; insets.left += edge + TEXT_SPACING; insets.right += edge + TEXT_SPACING; insets.bottom += edge + TEXT_SPACING; } return insets; } //Copied from TitledBorder // Copied from TitledBorder private Color getColor(Component c) { Color color = getTitleColor(); if(color != null) { if (color != null) { return color; } color = UIManager.getColor("TitledBorder.titleColor"); if(color != null) { if (color != null) { return color; } return (c != null) ? c.getForeground() : null; } private JLabel getLabel(Component c) { this.label.setText(getTitle()); this.label.setFont(getFont(c)); this.label.setForeground(getColor(c)); this.label.setComponentOrientation(c.getComponentOrientation()); this.label.setEnabled(c.isEnabled()); this.label.setBackground(c.getBackground()); //??? this.label.setBackground(c.getBackground()); // ??? return this.label; } private static Insets getBorderInsets( Border border, Component c, Insets insets) { if(border == null) { if (border == null) { insets.set(0, 0, 0, 0); }else if(border instanceof AbstractBorder) { } else if (border instanceof AbstractBorder) { AbstractBorder ab = (AbstractBorder) border; insets = ab.getBorderInsets(c, insets); }else{ } else { Insets i = border.getBorderInsets(c); insets.set(i.top, i.left, i.bottom, i.right); } return insets; } } }} **解説 [#m3f47dc6] * 解説 [#explanation] - 左 -- ``TitledBorder``のデフォルト(上) -- ``JDK1.7.0``では、文字列が``Border``の幅より長い場合、省略記号"..."で省略されるようになった -- `TitledBorder`のデフォルト(上) -- `Java 7`から文字列が`Border`の幅より長い場合`...`で省略されるようになった - 中 -- ``TitledBorder#paintBorder(...)``などをオーバーライドして、縦で左側に表示 -- `TitledBorder#paintBorder(...)`などをオーバーライドしてタイトルを左側中央に縦表示 - 右 -- ``TitledBorder``と``VerticalTitledBorder``の組み合わせ -- `TitledBorder`と`VerticalTitledBorder`の組み合わせ //**参考リンク **コメント [#ef8b3428] * 参考リンク [#reference] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/border/TitledBorder.html TitledBorder (Java Platform SE 8)] * コメント [#comment] #comment #comment