Swing/TwoRowsCellRenderer のバックアップの現在との差分(No.1)
TITLE:JTableのセル内に二行だけ表示
Posted by terai at 2010-12-20
JTableのセル内に二行だけ表示
JTableのセル内に文字列をニ行分だけ表示し、あふれる場合は"..."で省略します。- category: swing folder: TwoRowsCellRenderer title: JTableのセル内に二行だけ表示 tags: [JTable, TableCellRenderer, JLabel, JPanel] author: aterai pubdate: 2010-12-20T15:44:39+09:00 description: JTableのセル内に文字列を二行分だけ表示し、あふれる場合は...で省略します。 image:
概要
JTable
のセル内に文字列を二行分だけ表示し、あふれる場合は...
で省略します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
#screenshot
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
JTable table = new JTable(model);
table.setAutoCreateRowSorter(true);
table.setRowHeight(table.getRowHeight() * 2);
table.setDefaultRenderer(String.class, new TwoRowsCellRenderer());
#spandel
#spanend
class TwoRowsCellRenderer extends JPanel implements TableCellRenderer {
JLabel top = new JLabel();
JLabel bottom = new JLabel();
private final JLabel top = new JLabel();
private final JLabel bottom = new JLabel();
#spanadd
#spanend
public TwoRowsCellRenderer() {
super(new GridLayout(2,1,0,0));
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) {
#spanadd
#spanend
@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++) {
String text = Objects.toString(value, "");
String first = text;
String second = "";
// int columnWidth = table.getColumnModel().getColumn(column).getWidth();
int columnWidth = table.getCellRect(0, column, false).width;
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);
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のデフォルト動作です。解説
JLabel
を上下に配置したJPanel
を使って、TableCellRenderer
を作成しています。...
での省略は、セル内2
行目で使用しているJLabel
のデフォルト動作です。
参考リンク
- JLabelの文字列を折り返し
- 補助文字(サロゲートペアなど)を含む文字列を扱う場合は、
String#charAt(int)
ではなくString#codePointAt(int)
やCharacter.charCount(codePoint)
などを使用する必要がある- Java による Unicode サロゲートプログラミング
#spanend #spanadd int i = 0; #spanend #spanadd while (i < text.length()) { #spanend int cp = text.codePointAt(i); textWidth += fm.charWidth(cp); if (textWidth > columnWidth) { first = text.substring(0, i); second = text.substring(i); break; } i += Character.charCount(cp); #spanadd } #spanend #spanadd
- Java による Unicode サロゲートプログラミング