[英]JTable AutoCreateRowSorter causes Swing to Paint the table wrong
我在Java中创建了一个JTable,并使用AutoCreateRowSorter方法来帮助对表的列进行排序。
问题是,当我单击列标题对表进行排序时,它会错误地重新绘制表。 显示的第一个图像是打开后的外观。 第二张图片显示了单击一次后会发生什么。 请注意,数据与列标题重叠。
public class DataTable {
String[] colNames = {"Aircraft",
"Track ID",
"Runway",
"Operation Type",
"Number Daily of Operations"};
public DataTable(){}
public static void main(String[] args) {
DataTable tble = new DataTable();
JFrame window = new JFrame();
window.setBounds(0, 10, 1000,700);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().setLayout(new BorderLayout(0, 0));
window.setContentPane(tble.getfinalPane());
window.setVisible(true);
}
public JPanel getfinalPane(){
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints b = new GridBagConstraints();
b.gridx = 0;
b.gridy = 0;
b.fill = GridBagConstraints.BOTH;
b.anchor = GridBagConstraints.FIRST_LINE_END;
b.weighty = 500;
panel.add(getTable(),b);
return panel;
}
public JScrollPane getTable(){
Object[][] data = {{"Boeing 717",(long) 2459,"01L","Arrival",0.13},{"Boeing 727",(long) 2439,"01R","Arrival",0.12}};
JTable table = new JTable(data,colNames);
table.setFont(new Font("Serif",Font.BOLD,20));
table.getTableHeader().setFont(new Font("Serif",Font.BOLD,20));
table.getTableHeader().setBackground(new Color(0,0,0,100));
table.getTableHeader().setBorder(BorderFactory.createMatteBorder(3, 3, 3, 3, Color.BLACK));
table.getTableHeader().setForeground(Color.WHITE);
table.setRowHeight(table.getRowHeight()+table.getFont().getSize());
table.setBackground(new Color(214, 217, 223));
table.setAutoCreateRowSorter(true);
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
for(int i = 0; i < colNames.length; i++){
table.getColumnModel().getColumn(i).setCellRenderer(centerRenderer);
}
JScrollPane scroll = new JScrollPane(table);
scroll.setBackground(new Color(0,0,0,100));
table.setFillsViewportHeight(true);
return scroll;
}
}
我想知道如何解决此问题。 谢谢您的帮助。
Swing不知道如何将基于alpha的颜色作为背景色处理,它仅设计用于仅完全透明或完全不透明的组件。
您可以通过扩展组件,使其透明然后自己执行填充操作来伪造它
JScrollPane
public class TranslucentScrollPane extends JScrollPane {
public TranslucentScrollPane() {
setOpaque(false);
getViewport().setOpaque(false);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(getBackground());
g2d.fill(new Rectangle(0, 0, getWidth(), getHeight()));
super.paintComponent(g2d);
g2d.dispose();
}
}
JTableHeader
public class TranslucentTableHeader extends JTableHeader {
public TranslucentTableHeader() {
setOpaque(false);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(getBackground());
g2d.fill(new Rectangle(0, 0, getWidth(), getHeight()));
super.paintComponent(g2d);
g2d.dispose();
}
}
JTable
public class TranslucentTable extends JTable {
public TranslucentTable() {
setOpaque(false);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(getBackground());
g2d.fill(new Rectangle(0, 0, getWidth(), getHeight()));
getUI().paint(g2d, this);
g2d.dispose();
}
@Override
protected JTableHeader createDefaultTableHeader() {
JTableHeader header = new TranslucentTableHeader();
header.setColumnModel(getColumnModel());
return header;
}
}
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
String[] colNames = {"Aircraft",
"Track ID",
"Runway",
"Operation Type",
"Number Daily of Operations"};
Object[][] data = {{"Boeing 717",(long) 2459,"01L","Arrival",0.13},{"Boeing 727",(long) 2439,"01R","Arrival",0.12}};
JTable table = new TranslucentTable();
DefaultTableModel model = new DefaultTableModel(data, colNames);
table.setModel(model);
table.setFont(new Font("Serif", Font.BOLD, 20));
table.getTableHeader().setFont(new Font("Serif", Font.BOLD, 20));
table.getTableHeader().setBackground(new Color(0, 0, 0, 100));
table.getTableHeader().setBorder(BorderFactory.createMatteBorder(3, 3, 3, 3, Color.BLACK));
table.getTableHeader().setForeground(Color.WHITE);
table.setRowHeight(table.getRowHeight() + table.getFont().getSize());
table.setBackground(new Color(214, 217, 223));
table.setAutoCreateRowSorter(true);
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
for (int i = 0; i < colNames.length; i++) {
table.getColumnModel().getColumn(i).setCellRenderer(centerRenderer);
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setBackground(Color.RED);
TranslucentScrollPane scrollPane = new TranslucentScrollPane();
scrollPane.setBackground(new Color(0, 0, 0, 200));
scrollPane.setViewportView(table);
frame.add(scrollPane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.