Почему я получаю исключение NullPointerException при попытке передать данные между таблицами и отобразить их с помощью Swing? - PullRequest
0 голосов
/ 12 июня 2019

В программе, над которой я работаю, я использую Swing для рендеринга таблицы в простом предварительном просмотре. Я решил сделать это, передавая значения из JTable в первом JFrame во второй JTable, затем визуализируя JTable как изображение и рисуя его на холсте Graphics2D. Я не получаю никаких ошибок, пока не попытаюсь нарисовать таблицу (Изображение), используя drawImage (image, x, y, наблюдатель). Использование разных методов drawImage привело к одной и той же проблеме. Я получаю это сообщение об ошибке (из которого я исключил строки, не связанные с моим собственным кодом):

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at printxpert.PrintComponent.createImage(PrintComponent.java:77)
        at printxpert.PrintComponent.drawPage(PrintComponent.java:51)
        at printxpert.PrintComponent.paintComponent(PrintComponent.java:31)

Вот код, на который ссылается эта ошибка:

public class PrintComponent extends JComponent implements Printable {
private static final Dimension PREFERRED_SIZE = new Dimension(300,300);
private Graphics2D g2D;

private Object tableData[][];
private String[] columns;
private JTable table;
private TablePanel getTable;
private Image tableImage;


public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    drawPage(g2);
}

public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
    if (page >= 1)
        return Printable.NO_SUCH_PAGE;
    Graphics2D g2 = (Graphics2D) g;
    g2.translate(pf.getImageableX(), pf.getImageableY());
    g2.draw(new Rectangle2D.Double(0, 0, pf.getImageableWidth(), pf.getImageableHeight()));

    drawPage(g2);
    return Printable.PAGE_EXISTS;
}

/* This method draws the page on the screen and on the printer graphics context.
@param g2 - the graphics context */
public void drawPage(Graphics2D g2) {
    FontRenderContext context = g2.getFontRenderContext();
    Font font = new Font("Serif", Font.PLAIN, 72);
    GeneralPath clipShape = new GeneralPath();
    tableImage = createImage(table);


    TextLayout layout = new TextLayout(">:3", font, context);
    AffineTransform transform = AffineTransform.getTranslateInstance(200, 100);
    Shape outline = layout.getOutline(transform);
    clipShape.append(outline, false);

    g2.draw(clipShape);
    g2.clip(clipShape);

    g2.drawImage(tableImage, 0, 0, null);

    final int NLINES = 50;
    Point2D p = new Point2D.Double(0,0);

    for (int i = 0; i < NLINES; i++) {
        double x = (2 * getWidth() * i) / NLINES;
        double y = (2* getHeight() * (NLINES -1 - i)) / NLINES;
        Point2D q = new Point2D.Double(x, y);
        g2.draw(new Line2D.Double(p, q));
    }
}

    // Draws image of a table from table data
public Image createImage(JTable table) {
    tableData = getTable.getTableData(); // gets jTable1 data from TableFrame
    String[] columns = {"A", "B", "C", "D"};
    table = new JTable(tableData, columns);
    JTableHeader tableHeaderComp = table.getTableHeader();
    int totalWidth = tableHeaderComp.getWidth() + table.getWidth();
    int totalHeight = tableHeaderComp.getHeight() + table.getHeight();
    tableImage = new BufferedImage(totalWidth, totalHeight,
    BufferedImage.TYPE_INT_RGB);
    Graphics2D g2D = (Graphics2D) tableImage.getGraphics();
    tableHeaderComp.paint(g2D);
    g2D.translate(0, tableHeaderComp.getHeight());
    table.paint(g2D);
    return tableImage;
}

public Dimension getPreferredSize() {
    return PREFERRED_SIZE;
}
}

Я понимаю, что исключение Null Pointer генерируется в ответ на неправильное объявление / создание переменной, но я не могу действительно выяснить проблему с моей стороны. Программа, с которой у меня проблемы, является проприетарной и содержит несколько тысяч строк кода, так что я, очевидно, не буду публиковать это здесь, но у меня do есть общедоступный репозиторий со всем «упрощенным» проектом доступно любому, кто будет достаточно любезен, чтобы просмотреть мой код и протянуть руку помощи.

Заранее спасибо!

Редактировать: Вот хранилище , которое я совершенно забыл связать.

...