为了实现表格的多行和多列,我用tablecellrenderer把一个jTable的单元格(cell)改成加在JScrollPane里的cellTable,然后用了celleditor来实现对cellTable的访问。
但是遇到的问题是--在点击这个cellTable后,再点击jTable的其他单元,这个cellTable就消失了!而且出现下列的异常:Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding container's parent to itself
at java.awt.Container.addImpl(Container.java:1005)
at java.awt.Container.add(Container.java:351)
at javax.swing.JTable.editCellAt(JTable.java:2643)
at javax.swing.plaf.basic.BasicTableUI$Handler.adjustFocusAndSelection(BasicTableUI.java:922)
at javax.swing.plaf.basic.BasicTableUI$Handler.mousePressed(BasicTableUI.java:889)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:222)
at java.awt.Component.processMouseEvent(Component.java:5485)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
at java.awt.Component.processEvent(Component.java:5253)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3955)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3889)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1774)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)下面是我写的RENDERER和EDITOR://这个是重写的RENDERER,经测试没有问题import java.awt.Component;
import java.awt.Font;import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;public class JTableHeadCellRenderer extends JScrollPane implements TableCellRenderer { private Font tableFont = new Font("SansSerif", Font.PLAIN, 14);
public JTableHeadCellRenderer() {
setOpaque(true);
setForeground(UIManager.getColor("TableHeader.foreground"));
setBackground(UIManager.getColor("TableHeader.background"));
setBorder(javax.swing.BorderFactory.createEmptyBorder(0,0,0,0));
} public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
} else{
setForeground(table.getForeground());
setBackground(table.getBackground());
}
if (value != null){
JTable t = (JTable)value;
t.setForeground(UIManager.getColor("TableHeader.foreground"));
t.setBackground(UIManager.getColor("TableHeader.background"));
t.setBorder(javax.swing.BorderFactory.createEmptyBorder(0,0,0,0));
t.setEnabled(false);
//t.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
t.setFont(tableFont);
setViewportView(t);
}
return this;
}
}//下面是重写的EDITOR
import java.awt.Component;import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JTable;public class JScrollPaneEditor extends DefaultCellEditor { private JTable table;
public JScrollPaneEditor(JCheckBox checkBox) {
super(checkBox);
} public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
if (value != null){
table = (JTable) value;
}
return table;
} public Object getCellEditorValue() {
return table;
}
}经过分步测试,问题完全出在重写的CELLEDITOR上,但却找不到解决的办法,急请大家赐教!
但是遇到的问题是--在点击这个cellTable后,再点击jTable的其他单元,这个cellTable就消失了!而且出现下列的异常:Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding container's parent to itself
at java.awt.Container.addImpl(Container.java:1005)
at java.awt.Container.add(Container.java:351)
at javax.swing.JTable.editCellAt(JTable.java:2643)
at javax.swing.plaf.basic.BasicTableUI$Handler.adjustFocusAndSelection(BasicTableUI.java:922)
at javax.swing.plaf.basic.BasicTableUI$Handler.mousePressed(BasicTableUI.java:889)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:222)
at java.awt.Component.processMouseEvent(Component.java:5485)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
at java.awt.Component.processEvent(Component.java:5253)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3955)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3889)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1774)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)下面是我写的RENDERER和EDITOR://这个是重写的RENDERER,经测试没有问题import java.awt.Component;
import java.awt.Font;import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;public class JTableHeadCellRenderer extends JScrollPane implements TableCellRenderer { private Font tableFont = new Font("SansSerif", Font.PLAIN, 14);
public JTableHeadCellRenderer() {
setOpaque(true);
setForeground(UIManager.getColor("TableHeader.foreground"));
setBackground(UIManager.getColor("TableHeader.background"));
setBorder(javax.swing.BorderFactory.createEmptyBorder(0,0,0,0));
} public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
} else{
setForeground(table.getForeground());
setBackground(table.getBackground());
}
if (value != null){
JTable t = (JTable)value;
t.setForeground(UIManager.getColor("TableHeader.foreground"));
t.setBackground(UIManager.getColor("TableHeader.background"));
t.setBorder(javax.swing.BorderFactory.createEmptyBorder(0,0,0,0));
t.setEnabled(false);
//t.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
t.setFont(tableFont);
setViewportView(t);
}
return this;
}
}//下面是重写的EDITOR
import java.awt.Component;import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JTable;public class JScrollPaneEditor extends DefaultCellEditor { private JTable table;
public JScrollPaneEditor(JCheckBox checkBox) {
super(checkBox);
} public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
if (value != null){
table = (JTable) value;
}
return table;
} public Object getCellEditorValue() {
return table;
}
}经过分步测试,问题完全出在重写的CELLEDITOR上,但却找不到解决的办法,急请大家赐教!
dm.setDataVector(new Object[][]{{getNameTable(),"",""}}, new Object[]{"name","Adress", "Company"});
JTable jTable = new JTable(dm);
jTable.setRowHeight(200);
jTable.setShowGrid(false);
jTable.getColumn("name").setCellRenderer(new JTableHeadCellRenderer());
jTable.getColumn("name").setCellEditor(new JScrollPaneEditor(new JCheckBox()));getNameTable()得到的是一个12X3的表格,在这里它被加载到jTable第一列第一行的单元格.我知道问题出在JScrollPaneEditor的public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)方法的重写上,但就是不知道该怎么改.
还请大家帮忙看看
boolean isSelected, int row, int column) {
if (value != null){
if (isSelected)
this.table = (JTable) value;
}
return this.table;
}
问题解决了!:D
是自己犯浑,居然忘了这个方法里有重名的参数,导致每次加载的都是自己本身,所以出错.看来还是要好好学啊.
多谢顶贴的两位朋友.
再看看,如果这个程序没问题了我就散分^^
出了异常首先看异常信息,是很有用的。