Swing/TwoRowsCellRenderer のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TwoRowsCellRenderer へ行く。
- 1 (2010-12-20 (月) 15:44:39)
- 2 (2012-12-25 (火) 11:18:38)
- 3 (2013-10-25 (金) 20:29:41)
- 4 (2014-06-12 (木) 21:41:49)
- 5 (2014-11-01 (土) 00:42:27)
- 6 (2015-10-22 (木) 00:34:07)
- 7 (2015-10-26 (月) 19:51:41)
- 8 (2017-04-19 (水) 15:46:54)
- 9 (2017-11-02 (木) 15:26:29)
- 10 (2019-05-22 (水) 19:35:38)
- 11 (2019-05-24 (金) 18:22:59)
- 12 (2019-07-24 (水) 18:57:43)
- 13 (2021-03-26 (金) 11:08:02)
TITLE:JTableのセル内に二行だけ表示
Posted by terai at 2010-12-20
JTableのセル内に二行だけ表示
JTableのセル内に文字列をニ行分だけ表示し、あふれる場合は"..."で省略します。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
JTable table = new JTable(model);
table.setAutoCreateRowSorter(true);
table.setRowHeight(table.getRowHeight() * 2);
table.setDefaultRenderer(String.class, new TwoRowsCellRenderer());
class TwoRowsCellRenderer extends JPanel implements TableCellRenderer {
JLabel top = new JLabel();
JLabel bottom = new JLabel();
public TwoRowsCellRenderer() {
super(new GridLayout(2,1,0,0));
add(top);
add(bottom);
}
@Override public Component getTableCellRendererComponent(JTable table,
Object value,boolean isSelected,boolean hasFocus,int row,int column) {
if (isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
} else {
setForeground(table.getForeground());
setBackground(table.getBackground());
}
setFont(table.getFont());
FontMetrics fm = table.getFontMetrics(table.getFont());
String text = (value==null) ? "" : value.toString();
String first = text;
String second = "";
int columnWidth = table.getColumnModel().getColumn(column).getWidth();
int textWidth = 0;
for(int i=0; i<text.length(); i++) {
textWidth += fm.charWidth(text.charAt(i));
if(textWidth>columnWidth) {
first = text.substring(0,i-1);
second = text.substring(i-1);
break;
}
}
top.setText(first);
bottom.setText(second);
return this;
}
}
解説
JLabelを上下に配置したJPanelを使って、TableCellRenderer を作成しています。"..."での省略は、二行目のJLabelのデフォルト動作です。