Java 如何修复JTable中的JButton?因为按下按钮后,按钮将暂停在表中的最后位置

Java 如何修复JTable中的JButton?因为按下按钮后,按钮将暂停在表中的最后位置,java,swing,jtable,jbutton,tablecelleditor,Java,Swing,Jtable,Jbutton,Tablecelleditor,我对JTable和JButton有问题。 按下按钮后,将暂停在表中的最后位置。 尝试运行下面的代码 首先,我打开行“打开4”并通过按钮“关闭4”关闭。 之后,如果我打开行“打开3”,按钮“4”仍然存在 如何解决这个问题 import java.awt.Component; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListen

我对
JTable
JButton
有问题。 按下按钮后,将暂停在表中的最后位置。 尝试运行下面的代码

首先,我打开行“打开4”并通过按钮“关闭4”关闭。 之后,如果我打开行“打开3”,按钮“4”仍然存在

如何解决这个问题

    import java.awt.Component;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.EventObject;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.ListSelectionModel;
    import javax.swing.event.*;
    import javax.swing.table.*;

    class MyRenderer implements TableCellRenderer {
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasValue, int row, int column) {
            DefaultTableModel model =((DefaultTableModel)table.getModel());
            if (model.getValueAt(row,0)!=null && column==0) { 
                String DATA= "Close "+(model.getValueAt(row,0)).toString();
                JButton b = new JButton(DATA);
                return b;
                }
            else return null;
            }
        }

    class MyEditor implements TableCellEditor {
        public Component getTableCellEditorComponent(final JTable table, Object value,
                                             boolean isSelected, final int row, int column){
            final DefaultTableModel model =((DefaultTableModel)table.getModel());    
            if (model.getValueAt(row,0)!=null && column==0 ){
                String text =model.getValueAt(row,0).toString();
                final JButton b = new JButton(text);
                ActionListener AKCJA = new ActionListener(){
                    public void actionPerformed(ActionEvent e) {
                        if(model.getValueAt(row+1,0)==null)
                            while(model.getValueAt(row+1,0)==null)
                                ((DefaultTableModel)table.getModel()).removeRow(row+1);                        
                        }
                    };
                    b.addActionListener(AKCJA);
                    return b;
                    } 
            else  return null;            
            } 
        public void removeCellEditorListener(CellEditorListener cl) { }
        public void addCellEditorListener(CellEditorListener cl) { }
        public boolean shouldSelectCell(EventObject ev) { return true; }
        public boolean isCellEditable(EventObject ev) {return true;}
        public Object getCellEditorValue() { return null;}
        public boolean stopCellEditing() { return true;}
        public void cancelCellEditing() { }
        }

    @SuppressWarnings("serial")
    class MyJpanel extends JPanel{
        public MyJpanel(){
            super(new GridLayout(1,0));
            final DefaultTableModel model = new DefaultTableModel();          
            model.addColumn("Col1");
            model.addColumn("Col2");          

            for(int kk=0;kk<8;kk++)
                model.addRow(new Object[]{kk, "Open "+kk});

            final JTable table = new JTable(model);   
            TableColumn td = table.getColumnModel().getColumn(0);
            MyRenderer mojRenderer = new MyRenderer();
            td.setCellRenderer(mojRenderer);
            MyEditor mojEditor = new MyEditor();
            td.setCellEditor(mojEditor);

            table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            table.getSelectionModel().addListSelectionListener(
                    new ListSelectionListener() {
                        public void valueChanged(ListSelectionEvent event) {
                            int viewRow = table.getSelectedRow();
                            if(event.getValueIsAdjusting())
                                 if((model.getValueAt(viewRow,0))!=null)
                                     for(int i=0;i<2;i++)
                                         model.insertRow(viewRow+i+1,new Object[]{null, "b"});               
                            }
                        }         
                    );
            add(table );
            }
        }

    public class Test{
        public static void main(String[] args)
        {
            final JFrame ramka=new JFrame("xxx");
            ramka.getContentPane().add(new MyJpanel());
            ramka.setSize(500,200);
            ramka.setVisible(true);
            ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        }
导入java.awt.Component;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.EventObject;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JTable;
导入javax.swing.ListSelectionModel;
导入javax.swing.event.*;
导入javax.swing.table.*;
类MyRenderer实现TableCellRenderer{
公共组件GetTableCellRenderComponent(JTable表、对象值、,
布尔值(已选择、布尔值、整数行、整数列){
DefaultTableModel=((DefaultTableModel)table.getModel());
如果(model.getValueAt(row,0)!=null&&column==0){
String DATA=“Close”+(model.getValueAt(行,0)).toString();
JButton b=新JButton(数据);
返回b;
}
否则返回null;
}
}
类MyEditor实现TableCellEditor{
公共组件getTableCellEditorComponent(最终JTable表、对象值、,
布尔值(选定,最终整数行,整数列){
最终的DefaultTableModel=((DefaultTableModel)table.getModel());
if(model.getValueAt(行,0)!=null&&column==0){
String text=model.getValueAt(行,0.toString();
最终JButton b=新JButton(文本);
ActionListener AKCJA=新建ActionListener(){
已执行的公共无效操作(操作事件e){
if(model.getValueAt(行+1,0)==null)
while(model.getValueAt(行+1,0)==null)
((DefaultTableModel)table.getModel()).removeRow(行+1);
}
};
b、 addActionListener(AKCJA);
返回b;
} 
否则返回null;
} 
public void removeCellEditorListener(CellEditorListener cl){}
public void addCellEditorListener(CellEditorListener cl){}
公共布尔值shouldSelectCell(EventObject ev){return true;}
公共布尔值isCellEditable(EventObject ev){return true;}
公共对象getCellEditorValue(){return null;}
公共布尔stopCellEditing(){return true;}
public void cancellediting(){}
}
@抑制警告(“串行”)
类MyJpanel扩展了JPanel{
公共MyJpanel(){
超级(新网格布局(1,0));
最终DefaultTableModel=新DefaultTableModel();
模型。添加列(“Col1”);
模型。添加列(“Col2”);

对于(int kk=0;kk解决方案是使用例如
table.removeAll();
before button
ActionListener()
Jtable
容器中删除按钮

找到问题非常有用的方法是:
Component[]Komponenty=table.getComponents()

您可以打印Array Komponety并找到忘记删除或隐藏的组件;

感谢您的帮助:-)不幸的是,答案完全错误(因为它是根据症状进行修改,而不是治疗疾病)编辑器实现无效:它必须在终止时通知其侦听器。请查看DefaultCellEditor的源代码,了解如何执行此操作。此外:a)永远不要在getXXComponent中创建新的编辑或呈现组件b)不要直接更改编辑器中的模型,这不是它的工作c)学习java命名约定坚持下去