Zul*_*lfe 0 java swing jtable paint line
我正在尝试使用我制作的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);
}
}
Run Code Online (Sandbox Code Playgroud)
我用以下方法调用方法:
private Painter paint = new Painter();
paint.paintSudokuLines(table.getGraphics());
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会这样,所以我需要一些解释.
永远不要使用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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这只是一个概念证明.您可能需要使用复合边框来偏移单元格属性(因此所有单元格周围至少有一个2像素边框和/或减小边框宽度;))
另外,请查看如何使用表格以获取更多详细信息
| 归档时间: |
|
| 查看次数: |
420 次 |
| 最近记录: |