Я работал над проектом, чтобы извлечь данные из API и поместить их в JTable.Когда JTable заполняется данными, я хотел бы, чтобы он сохранил изображение всего в таблице, включая заголовки.
Проблема в том, что данные, похоже, сохраняются только один раз.Если я манипулирую таблицей (т. Е. Использую другой JComponent для удаления строк) и пытаюсь сохранить изображение снова, это выдает ошибку, потому что высота / ширина не может быть установлена равной 0.
Вот [некоторые из] моихкод для добавления данных в таблицу:
missionTable = new JTable(info, headers);
for (int i = 0; i < missionTable.getColumnCount(); i++) {
missionTable.getColumnModel().getColumn(i).setCellRenderer(new RarityRenderer());
}
int maxSize = 0;
JTextArea label = null;
// Resize rows to fit table values
for (int i = 0; i < info.length; i++) {
maxSize = 0;
if (info[i] != null && info[i][2] != null && info[i][3] != null) {
label = new JTextArea(info[i][2]);
label.setBounds(0, 0, 95, 20);
if (label.getPreferredSize().height > maxSize)
maxSize = label.getPreferredSize().height;
label = new JTextArea(info[i][3]);
label.setBounds(0, 0, 320, 20);
label.setLineWrap(true);
label.setWrapStyleWord(true);
if (label.getPreferredSize().height > maxSize)
maxSize = label.getPreferredSize().height;
}
if (maxSize > 0)
missionTable.setRowHeight(i, maxSize > 40 ? 52 : 40);
}
label = null;
missionScrollPane.setViewportView(missionTable);
System.out.println("H:" + missionTable.getHeight() + " W:" + missionTable.getWidth());
saveTable(missionTable, "./test.jpg");// Line 904 from stacktrace
А вот метод saveTable (JTable, String):
public void saveTable(JTable table, String filename) {
try {
int ww = Math.max(table.getWidth(), table.getTableHeader().getWidth());
int hh = table.getHeight() + table.getTableHeader().getHeight();
BufferedImage bi = new BufferedImage(ww, hh, BufferedImage.TYPE_INT_RGB);// Line 980 from stacktrace
Graphics2D g2 = bi.createGraphics();
table.getTableHeader().paint(g2);
g2.translate(0, table.getTableHeader().getHeight());
table.paint(g2);
g2.dispose();
OutputStream out = new FileOutputStream(filename);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(bi);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Вместе с выводом + трассировка стека:
H:0 W:0
java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
at java.awt.image.BufferedImage.<init>(Unknown Source)
at stuff.game.ux.StormUI.saveComponentAsJPEG(StormUI.java:980)
at stuff.game.ux.StormUI.refreshCurrentTable(StormUI.java:904)
at stuff.game.ux.StormUI.changeFilter(StormUI.java:720)
at stuff.game.ux.StormUI$9.mouseClicked(StormUI.java:425)
at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Честно говоря, у меня закончились попытки, установка высоты / ширины вручную создает только сплошное черное изображение.