gpt4 book ai didi

java - JTable 为图形返回 null?

转载 作者:行者123 更新时间:2023-12-01 16:59:23 26 4
gpt4 key购买 nike

我正在尝试使用我制作的 Painter 对象在 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());

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

最佳答案

永远不要使用getGraphics,它可以返回null(正如您所发现的),并且不是自定义绘画应该完成的方式。您永远不需要自己调用 paintComponent 。如果在打印时,您不会直接调用它,那么充其量,您会破坏绘制链并引入无穷无尽的额外问题和工件。

要更好地了解绘画的工作原理,请参阅 Painting in AWT and Swing .

现在,让我快速演示一下为什么您不应该像您尝试那样尝试在 JTable 顶部进行绘制...

Table

现在,不要误会我的意思,我确信通过一些非常聪明的推导工作,您可以计算行/列位置,以便能够正确绘制引用线,但这是很多额外的工作。

更好的解决方案可能是使用自定义TableCellRenderer...

Table

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 像素边框和/或减小边框宽度;))

此外,请查看 How to Use Tables了解更多详情

关于java - JTable 为图形返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28891982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com