2012-04-03 8 views
0

suspendiert Ich habe ein Problem mit JTable und JButton. Nach dem Drücken der Taste, ist in seiner letzten Position in der Tabelle ausgesetzt. Versuchen Sie, den folgenden Code auszuführen.Wie man ein JButton in JTable repariert? Denn nach dem Drücken der Taste ist in der letzten Position in der Tabelle

Firs Ich öffne Zeile "Open 4" und Close by Button "Close 4". Danach, wenn ich Zeile "Open 3" öffnen die Schaltfläche "4" ist immer noch da ...

Wie behebt man das?

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); 
      } 
     } 
+1

Die Editorimplementierung ist ungültig: Sie muss ihre Listener benachrichtigen, wenn sie beendet wird. Werfen Sie einen Blick auf die Quelle von DefaultCellEditor, um eine Vorstellung davon zu bekommen, wie es gemacht wird. Außerdem: a) niemals eine neue Bearbeitungs- oder Rendering-Komponente in getXXComponent erstellen b) das Modell nicht direkt im Editor ändern, das ist nicht seine Aufgabe c) Java-Namenskonventionen lernen und dabei bleiben – kleopatra

Antwort

0

Die Lösung ist Schaltfläche unter Verwendung beispielsweise in Jtable Behälter entfernen, bevor table.removeAll(); Taste ActionListener().

Sehr nützlich, um das Problem zu finden war: Component[] Komponenty = table.getComponents(); Sie können Array Komponenty drucken und Komponenten finden, die Sie vergessen zu löschen oder zu verbergen;

+0

Danke, dass du versucht hast, hilfreich zu sein :-) Leider ist die Antwort komplett falsch (in dem es sich um Symptome handelt anstatt die Krankheit zu heilen) – kleopatra