Как получить размер JTable после изменения данных - PullRequest
0 голосов
/ 07 декабря 2018

Я работал над проектом, чтобы извлечь данные из 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)

Честно говоря, у меня закончились попытки, установка высоты / ширины вручную создает только сплошное черное изображение.

...