[英]Java JTable header word wrap
我試圖讓表格上的標題有自動換行。 我已設法做到這一點,但第一個數據行正在擴展。 該表的代碼是:
public class GenerateTable extends JTable {
private JCheckBox boxSelect = new JCheckBox();
private JTableHeader hdGen;
public class LineWrapCellRenderer extends JTextArea implements TableCellRenderer {
private static final long serialVersionUID = 1L;
int rowHeight = 0; // current max row height for this scan
@Override
public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column)
{
/*
* row < 0 means header
*/
if(row >= 0) {
setWrapStyleWord(false);
return this;
}
setText((String) value);
setWrapStyleWord(true);
setLineWrap(true);
// current table column width in pixels
int colWidth = table.getColumnModel().getColumn(column).getWidth();
// set the text area width (height doesn't matter here)
setSize(new Dimension(colWidth, 1));
// get the text area preferred height and add the row margin
int height = getPreferredSize().height + table.getRowMargin();
// ensure the row height fits the cell with most lines, row = -1 for header
if (column == 2 || height > rowHeight) {
table.setRowHeight(row, height);
rowHeight = height;
}
return this;
}
}
LineWrapCellRenderer lwHeader = new LineWrapCellRenderer();
public GenerateTable(GenerateTableModel model) {
super(model);
this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
/*
* Select
*/
TableColumn colSelect = this.getColumnModel().getColumn(0);
colSelect.setCellEditor(new DefaultCellEditor(boxSelect));
colSelect.setPreferredWidth(60);
/*
* category
*/
this.getColumnModel().getColumn(1).setResizable(false);
this.getColumnModel().getColumn(1).setPreferredWidth(200);
/*
* Amount values
*/
for (int i=2;i<model.getColumnCount();i++) {
colSelect = this.getColumnModel().getColumn(i);
colSelect.setPreferredWidth(100);
colSelect.setResizable(false);
colSelect.setHeaderRenderer(lwHeader);
}
}
}
輸出是:
我在調試中遵循了代碼,並且沒有為數據行調用LineWrapCellRenderer。 如果我取出代碼,我得到一個普通的表,但沒有包裝在標題上。 這是一個公認的問題還是我錯過了什么?
任何幫助贊賞
您可以更輕松地實現多行標題。
與許多Swing組件一樣,您可以使用HTML代碼。 在HTML中指定<br>
元素以指示換行符/換行符的位置。
例如,如果您使用以下標頭值(列名稱):
String[] columnNames = {
"<html>First<br>column</html>",
"<html>Second<br>column</html>",
"<html>Third<br>column</html>"
};
然后標題將正確呈現為2行。 您甚至不需要創建/使用自定義標題渲染器,默認標題渲染器可以正確處理HTML代碼。
注意:標題高度將由第一列的高度決定。 因此,您必須為第一列使用2行HTML值。 如果第一列只有一個單詞,您可以另外添加一個空的第二行,如下所示: "<html>Select<br> </html>"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.