JTableのHTML形式コピーをカスタマイズする
Total: 5134
, Today: 1
, Yesterday: 3
Posted by aterai at
Last-modified:
概要
JTable
のセルを選択してクリップボードにHTML
テキストをコピーするとき、そのセルのクラスに応じて生成するタグを変更します。
Screenshot
Advertisement
サンプルコード
class HtmlTableTransferHandler extends TransferHandler {
// @see javax/swing/plaf/basic/
// BasicTableUI.TableTransferHandler#createTransferable(JComponent)
@Override protected Transferable createTransferable(JComponent c) {
if (c instanceof JTable) {
JTable table = (JTable) c;
int[] rows;
int[] cols;
if (!table.getRowSelectionAllowed() && !table.getColumnSelectionAllowed()) {
return null;
}
if (table.getRowSelectionAllowed()) {
rows = table.getSelectedRows();
} else {
int rowCount = table.getRowCount();
rows = new int[rowCount];
for (int counter = 0; counter < rowCount; counter++) {
rows[counter] = counter;
}
}
if (table.getColumnSelectionAllowed()) {
cols = table.getSelectedColumns();
} else {
int colCount = table.getColumnCount();
cols = new int[colCount];
for (int counter = 0; counter < colCount; counter++) {
cols[counter] = counter;
}
}
if (cols == null || rows.length == 0 || cols.length == 0) {
return null;
}
StringBuffer plainBuf = new StringBuffer();
StringBuffer htmlBuf = new StringBuffer(64);
htmlBuf.append("<html>\n<body>\n<table border='1'>\n");
for (int row = 0; row < rows.length; row++) {
htmlBuf.append("<tr>\n");
for (int col = 0; col < cols.length; col++) {
Object obj = table.getValueAt(rows[row], cols[col]);
String val = Objects.toString(obj, "") + "\t";
// .replace("&", "&").replace("<", "<").replace(">", ">");
plainBuf.append(val);
if (obj instanceof Date) {
String v = Objects.toString((Date) obj, "");
htmlBuf.append(" <td><time>" + v + "</time></td>\n");
} else if (obj instanceof Color) {
htmlBuf.append(String.format(
" <td style='background-color:#%06X'> </td>%n",
((Color) obj).getRGB() & 0xFF_FF_FF));
} else {
htmlBuf.append(" <td>" + Objects.toString(obj, "") + "</td>\n");
}
}
// we want a newline at the end of each line and not a tab
plainBuf.deleteCharAt(plainBuf.length() - 1).append("\n");
htmlBuf.append("</tr>\n");
}
// remove the last newline
plainBuf.deleteCharAt(plainBuf.length() - 1);
htmlBuf.append("</table>\n</body>\n</html>");
return new BasicTransferable(plainBuf.toString(), htmlBuf.toString());
}
return null;
}
@Override public int getSourceActions(JComponent c) {
return TransferHandler.COPY;
}
}
View in GitHub: Java, Kotlin解説
- 上
JTable
:- デフォルトの
BasicTableUI.TableTransferHandler
を使用
- デフォルトの
- 下
JTable
:HtmlTableTransferHandler
を設定TransferHandler#createTransferable(JComponent)
をオーバーライドしてクリップボードに転送するtext/html
なテキストを独自に作成text/plain
はBasicTableUI.TableTransferHandler
のコピーをそのまま使用<table>
タグに属性border='1'
を追加
- セルのクラスに応じたタグを生成
Date
:<time>...</time>
で囲むColor
:<td>
にstyle='background-color:#%06x'>
で背景色を設定