【发布时间】:2017-03-24 22:44:41
【问题描述】:
我在 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;
}
}
我想知道如何解决这个问题。感谢您的帮助。
【问题讨论】:
-
new Color(0,0,0,100)是个问题,Swing 不支持像这样绘制半透明颜色,它只支持完全不透明或完全透明的组件。您可以通过扩展类来伪造它,使其透明,然后在调用paintComponent时填充背景