JTable中返回空的图形?(JTable returning null for Graphics?

2019-11-03 16:03发布

我想提请使用我做了一个画家的对象在我的JTable线,但由于某种原因table.getGraphics()返回null。

画家类:

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JTable;

public class Painter extends JTable {

    public Painter(){

    }

    public void paintSudokuLines(Graphics g){
        paintComponent(g);
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setStroke(new BasicStroke(3));
        g2.drawLine(0, 300, 400, 250);
    }
}

我打电话与方法:

private Painter paint = new Painter();
paint.paintSudokuLines(table.getGraphics());

我不知道为什么是这样的话,所以我需要一些解释。

Answer 1:

切勿使用getGraphics ,它可以返回null (如你发现),是风俗画不应该怎么做。 你永远不应该有一个需要调用paintComponent自己。 如果打印时,你不会直接调用它,在最好的,你会打破油漆链,没有引入的其他问题和文物结束。

为了更好地理解的国画作品怎么看在AWT和Swing绘画 。

现在,让我给你的,为什么你不应该试图和油漆过的顶部的快速演示JTable就像你试图做...

现在,不要误会我的意思,我敢肯定,有一些非常聪明的演绎作品,你可以计算行/列位置,以便能够正确绘制的指南,但是这是一个很多额外的工作。

更好的解决办法可能是使用自定义TableCellRenderer ...

import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
import javax.swing.border.MatteBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class SudokuTest {

    public static void main(String[] args) {
        new SudokuTest();
    }

    public SudokuTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(new SudokuTable()));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class SudokuTable extends JTable {

        public SudokuTable() {
            super(new DefaultTableModel(9, 9));
            setDefaultRenderer(Object.class, new SudokuCellRender());
        }

    }

    public class SudokuCellRender extends DefaultTableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

            int left = 0;
            int top = 0;
            int right = 0;
            int bottom = 0;

            if ((column % 3) == 0) {
                left = 2;
            } else if ((column % 3) == 2) {
                right = 2;
            }

            if ((row % 3) == 0) {
                top = 2;
            }
            if ((row % 3) == 2) {
                bottom = 2;
            }

            setBorder(new MatteBorder(top, left, bottom, right, Color.RED));

            return this;
        }

    }

}

现在,这只是一个概念证明。 您可能需要使用的化合物边界以抵消单元属性(因此所有小区具有至少一个2像素的边界周围和/或减少边框宽度;))

另外,看看如何使用表了解更多详情



文章来源: JTable returning null for Graphics?