线程“AWT-EventQueue-0”中的exceptionjava.lang.ClassCastException:javax.swing.JTable

我有一个代码 ,在运行时生成一个表格,其中包含一组可以选中或取消选中的复选框

当我单击Check All选项卡时,我可以选中/取消选中下面的所有其他复选框,但当我单独选中以下复选框之一时,我收到此错误:

 >线程“AWT-EventQueue-0”中的exceptionjava.lang.ClassCastException:javax.swing.JTable
    在com.tps.charts.CheckBoxHeader.handleClickEvent(JTableHeaderCheckBox.java:152)
    在com.tps.charts.CheckBoxHeader.mouseClicked(JTableHeaderCheckBox.java:168)
    在java.awt.AWTEventMulticaster.mouseClicked(未知来源)
    在java.awt.AWTEventMulticaster.mouseClicked(未知来源)
    在java.awt.AWTEventMulticaster.mouseClicked(未知来源)
    在java.awt.AWTEventMulticaster.mouseClicked(未知来源)
    在java.awt.AWTEventMulticaster.mouseClicked(未知来源)mousePressed ......
    在java.awt.AWTEventMulticaster.mouseClicked(未知来源)
    在java.awt.AWTEventMulticaster.mouseClicked(未知来源)
    在java.awt.AWTEventMulticaster.mouseClicked(未知来源)
     at java.awt.Component.processMouseEvent(Unknown Source)
    在javax.swing.JComponent.processMouseEvent(未知来源)
    在java.awt.Component.processEvent(未知来源)
     at java.awt.Container.processEvent(Unknown Source)
     at java.awt.Component.dispatchEventImpl(Unknown Source)
     at java.awt.Container.dispatchEventImpl(Unknown Source)
     at java.awt.Component.dispatchEvent(Unknown Source)
     at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
     at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
     at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
     at java.awt.Container.dispatchEventImpl(Unknown Source)
     at java.awt.Window.dispatchEventImpl(Unknown Source)
     at java.awt.Component.dispatchEvent(Unknown Source)
     at java.awt.EventQueue.dispatchEvent(Unknown Source)
     at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
     at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
     at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
     at java.awt.EventDispatchThread.run(Unknown Source)

代码 :

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; public class JTableHeaderCheckBox { private Object colNames[] = {"", "String", "String"}; private Object[][] data = {}; private DefaultTableModel dtm; private JTable table; private TableColumn tc; public void buildGUI() { dtm = new DefaultTableModel(data, colNames); table = new JTable(dtm); for (int x = 0; x < 5; x++) { dtm.addRow(new Object[]{false, "Row " + (x + 1) + " Col 2", "Row " + (x + 1) + " Col 3"}); } JScrollPane sp = new JScrollPane(table); tc = table.getColumnModel().getColumn(0); tc.setCellEditor(table.getDefaultEditor(Boolean.class)); tc.setCellRenderer(table.getDefaultRenderer(Boolean.class)); tc.setHeaderRenderer(new CheckBoxHeader(new MyItemListener())); JFrame f = new JFrame(); f.getContentPane().add(sp); f.pack(); f.setLocationRelativeTo(null); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } private class MyItemListener implements ItemListener { @Override public void itemStateChanged(ItemEvent e) { System.out.println("ItemStateChanged"); Object source = e.getSource(); if (source instanceof AbstractButton == false) { return; } boolean checked = e.getStateChange() == ItemEvent.SELECTED; for (int x = 0, y = table.getRowCount(); x < y; x++) { table.setValueAt(checked, x, 0); } } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new JTableHeaderCheckBox().buildGUI(); } }); } } class CheckBoxHeader extends JCheckBox implements TableCellRenderer, MouseListener { private static final long serialVersionUID = 1L; private CheckBoxHeader rendererComponent; private int column; private boolean mousePressed = false; public CheckBoxHeader(ItemListener itemListener) { rendererComponent = this; rendererComponent.addItemListener(itemListener); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (table != null) { JTableHeader header = table.getTableHeader(); table.addMouseListener(rendererComponent); if (header != null) { rendererComponent.setForeground(header.getForeground()); rendererComponent.setBackground(header.getBackground()); rendererComponent.setFont(header.getFont()); header.addMouseListener(rendererComponent); } } setColumn(column); rendererComponent.setText("Check All"); setBorder(UIManager.getBorder("TableHeader.cellBorder")); return rendererComponent; } protected void setColumn(int column) { this.column = column; } public int getColumn() { return column; } protected void handleClickEvent(MouseEvent e) { if (mousePressed) { mousePressed = false; JTableHeader header = (JTableHeader) (e.getSource()); JTable tableView = header.getTable(); TableColumnModel columnModel = tableView.getColumnModel(); int viewColumn = columnModel.getColumnIndexAtX(e.getX()); column = tableView.convertColumnIndexToModel(viewColumn); if (viewColumn == this.column && e.getClickCount() == 1 && column != -1) { System.out.println(" doClick()......"); doClick(); } } } @Override public void mouseClicked(MouseEvent e) { System.out.println(" mouseClicked()......"); handleClickEvent(e); /* problem occurs from this line */ ((JTableHeader) e.getSource()).repaint(); } @Override public void mousePressed(MouseEvent e) { //System.out.println("mousePressed(MouseEvent e)......."); mousePressed = true; } @Override public void mouseReleased(MouseEvent e) { //System.out.println(" mouseReleased()......"); } @Override public void mouseEntered(MouseEvent e) { //System.out.println(" mouseEntered()......"); } @Override public void mouseExited(MouseEvent e) { //System.out.println("mouseExited()......"); } } 

有例外

 Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JTable cannot be cast to javax.swing.table.JTableHeader 

在第152行: JTableHeader header = (JTableHeader)(e.getSource()); 你假设事件在表头上。 您需要检查事件源的类,以查看它是否在标题或单个复选框上。

您正在将事件的源转换为JTableHeader

 JTableHeader header = (JTableHeader) (e.getSource()); 

单击一个单元格时,源是JTable 。 我会为标题和单元格选择提供两个不同的侦听器,或者您可以通过在鼠标单击侦听器中检查event.getSource() instanceof ...来进行黑客攻击。