JTreeのノードタイトルを複数行表示する
Total: 6008
, Today: 3
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JTree
の各ノードで改行を使用し、タイトルを複数行表示します。
Screenshot
Advertisement
サンプルコード
class MultiLineCellRenderer extends JPanel implements TreeCellRenderer {
private DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
private final JLabel icon = new JLabel();
private final JTextArea text = new CellTextArea2();
public MultiLineCellRenderer() {
super(new BorderLayout(0, 0));
text.setOpaque(true);
text.setFont(icon.getFont());
text.setBorder(BorderFactory.createEmptyBorder());
icon.setOpaque(true);
icon.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 2));
icon.setVerticalAlignment(SwingConstants.TOP);
setOpaque(false);
setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
add(icon, BorderLayout.WEST);
add(text);
}
@Override public Component getTreeCellRendererComponent(
JTree tree, Object value, boolean isSelected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
JLabel l = (JLabel) renderer.getTreeCellRendererComponent(
tree, value, isSelected, expanded, leaf, row, hasFocus);
Color bColor, fColor;
if (isSelected) {
bColor = renderer.getBackgroundSelectionColor();
fColor = renderer.getTextSelectionColor();
} else {
bColor = renderer.getBackgroundNonSelectionColor();
fColor = renderer.getTextNonSelectionColor();
if (bColor == null) bColor = renderer.getBackground();
if (fColor == null) fColor = renderer.getForeground();
}
text.setFont(l.getFont());
text.setText(l.getText());
text.setForeground(fColor);
text.setBackground(bColor);
icon.setIcon(l.getIcon());
icon.setBackground(bColor);
return this;
}
@Override public void updateUI() {
super.updateUI();
renderer = new DefaultTreeCellRenderer();
}
}
class CellTextArea2 extends JTextArea {
@Override public Dimension getPreferredSize() {
Dimension d = new Dimension(10, 10);
Insets i = getInsets();
d.width = Math.max(
d.width, getColumns() * getColumnWidth() + i.left + i.right);
d.height = Math.max(
d.height, getRows() * getRowHeight() + i.top + i.bottom);
return d;
}
@Override public void setText(String str) {
super.setText(str);
FontMetrics fm = getFontMetrics(getFont());
Document doc = getDocument();
Element root = doc.getDefaultRootElement();
int lineCount = root.getElementCount();
int maxWidth = 10;
try {
for (int i = 0; i < lineCount; i++) {
Element e = root.getElement(i);
int rangeStart = e.getStartOffset();
int rangeEnd = e.getEndOffset();
String line = doc.getText(rangeStart, rangeEnd - rangeStart);
int width = fm.stringWidth(line);
if (maxWidth < width) {
maxWidth = width;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
setRows(lineCount);
setColumns(1 + maxWidth / getColumnWidth());
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JTree#setRowHeight(0)
を実行してJTree
のデフォルトの行の高さを0
にすることでセルレンダラーが行の高さを決めるように設定し、以下の2
つの方法で改行を行っています。
Html
Html
の<br>
タグを使用して改行parent.add(new DefaultMutableTreeNode("<html>blue<br>blue, blue"));
TextAreaRenderer
JTextArea
をノードタイトルの表示に使用するTreeCellRenderer
を作成して\n
で改行parent.add(new DefaultMutableTreeNode("blue\nblue, blue"));
JTree#getRowHeight()
の初期値はLookAndFeel
で異なり、例えばWindowsLookAndFeel
の場合0
以下ではない