我正在尝试从表格创建缓冲图像,当我将表格添加到应用程序框架并设置大小时,我可以正确查看它,但是当我将其转换为图像时,我只能看到表格的第一行其余的在表格之外并且没有标题。
生成表的代码是
table = new JTable();
String[] table_header = null;
TextAreaRenderer textAreaRenderer = new TextAreaRenderer();
table_model = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
table.setModel(table_model);
table.setSize(300, 700);
JScrollPane pane = new JScrollPane(table);
createTableDataSet(input1, input2, varient, headertype);
TableColumnModel cmodel = table.getColumnModel();
table_header = obtainTableHeader(headertype);
for (int i = 0; i < table_header.length; i++) {
cmodel.getColumn(i).setCellRenderer(textAreaRenderer);
}
return table;
生成图像的代码是:
JTableHeader header =table.getTableHeader();
int w = Math.max(table.getWidth(), header.getWidth());
int h = table.getHeight() + header.getHeight();
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = bi.createGraphics();
header.paint(g2);
g2.translate(0, header.getHeight());
table.paint(g2);
g2.dispose();
try {
ImageIO.write(bi, "png", new File("year.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
The image of the table is
更新1:我可能已经找到问题的原因了。我使用以下代码片段来增加单元格的大小,以便将文本包装到单元格中。包括导致问题的代码
私有最终 DefaultTableCellRenderer 渲染器 = new DefaultTableCellRenderer();
// Column heights are placed in this Map
private final Map<JTable, Map<Object, Map<Object, Integer>>> tablecellSizes = new HashMap<JTable, Map<Object, Map<Object, Integer>>>();
/**
* Creates a text area renderer.
*/
public TextAreaRenderer() {
setLineWrap(true);
setWrapStyleWord(true);
}
/**
* Returns the component used for drawing the cell. This method is
* used to configure the renderer appropriately before drawing.
*
* @param table - JTable object
* @param value - the value of the cell to be rendered.
* @param isSelected - isSelected true if the cell is to be rendered with the selection highlighted;
* otherwise false.
* @param hasFocus - if true, render cell appropriately.
* @param row - The row index of the cell being drawn.
* @param column - The column index of the cell being drawn.
* @return - Returns the component used for drawing the cell.
*/
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
// set the Font, Color, etc.
renderer.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
setForeground(renderer.getForeground());
setBackground(renderer.getBackground());
setBorder(renderer.getBorder());
setFont(renderer.getFont());
setText(renderer.getText());
TableColumnModel columnModel = table.getColumnModel();
setSize(columnModel.getColumn(column).getWidth(), 0);
int height_wanted = (int) getPreferredSize().getHeight();
addSize(table, row, column, height_wanted);
height_wanted = findTotalMaximumRowSize(table, row);
if (height_wanted != table.getRowHeight(row)) {
table.setRowHeight(row, height_wanted);
}
return this;
}
/**
* @param table - JTable object
* @param row - The row index of the cell being drawn.
* @param column - The column index of the cell being drawn.
* @param height - Row cell height as int value
* This method will add size to cell based on row and column number
*/
private void addSize(JTable table, int row, int column, int height) {
Map<Object, Map<Object, Integer>> rowsMap = tablecellSizes.get(table);
if (rowsMap == null) {
tablecellSizes.put(table, rowsMap = new HashMap<Object, Map<Object, Integer>>());
}
Map<Object, Integer> rowheightsMap = rowsMap.get(row);
if (rowheightsMap == null) {
rowsMap.put(row, rowheightsMap = new HashMap<Object, Integer>());
}
rowheightsMap.put(column, height);
}
/**
* Look through all columns and get the renderer. If it is
* also a TextAreaRenderer, we look at the maximum height in
* its hash table for this row.
*
* @param table -JTable object
* @param row - The row index of the cell being drawn.
* @return row maximum height as integer value
*/
private int findTotalMaximumRowSize(JTable table, int row) {
int maximum_height = 0;
Enumeration<TableColumn> columns = table.getColumnModel().getColumns();
while (columns.hasMoreElements()) {
TableColumn tc = columns.nextElement();
TableCellRenderer cellRenderer = tc.getCellRenderer();
if (cellRenderer instanceof TextAreaRenderer) {
TextAreaRenderer tar = (TextAreaRenderer) cellRenderer;
maximum_height = Math.max(maximum_height,
tar.findMaximumRowSize(table, row));
}
}
return maximum_height;
}
/**
* This will find the maximum row size
*
* @param table - JTable object
* @param row - The row index of the cell being drawn.
* @return row maximum height as integer value
*/
private int findMaximumRowSize(JTable table, int row) {
Map<Object, Map<Object, Integer>> rows = tablecellSizes.get(table);
if (rows == null) return 0;
Map<Object, Integer> rowheights = rows.get(row);
if (rowheights == null) return 0;
int maximum_height = 0;
for (Map.Entry<Object, Integer> entry : rowheights.entrySet()) {
int cellHeight = entry.getValue();
maximum_height = Math.max(maximum_height, cellHeight);
}
return maximum_height;
}
这导致单元格无法正确显示。一旦我删除此代码,该表就会通过包含 kleopatra 的代码正确生成。但我遇到了单元格中自动换行的问题。
谢谢,
巴维亚
附:当在我的代码中使用 new JTable(row,fields) 创建表对象时,我使用了上面相同的代码来生成图像,序列化的哈希图被读取并插入到 table_model 中