2011-01-06 10 views
10

Ich möchte den Editor in meinen bearbeitbaren JTables haben, wenn Sie den gesamten Text in der Zelle auswählen, wenn Sie mit der Bearbeitung beginnen. Ich habe ein paar Dinge ausprobiert, die sich alle um den Aufruf von JTextComponent.selectAll() für die Komponente drehen, die von der TableCellEditor.getTableCellEditorComponent-Methode zurückgegeben wird. Keines der Dinge, die ich versuchte, funktionierte.So wählen Sie den gesamten Text in der JTable-Zelle beim Bearbeiten aus

Bei meinem letzten Versuch habe ich die SimpleTableDemo-Klasse aus dem Swing-Lernprogramm geändert, um einen benutzerdefinierten TableCellEditor zu verwenden, der die selectAll-Methode aufruft. Im Debugger kann ich sehen, dass die selectAll() -Methode aufgerufen wird, aber die Tabelle geht immer noch in den Bearbeitungsmodus, ohne den Text in der Zelle auszuwählen (oder die Auswahl wird vor der Anzeige gelöscht). Dieser Code ist unten. Kann mir jemand sagen, wo ich falsch liege?

 
import javax.swing.DefaultCellEditor; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.JTree; 
import javax.swing.table.TableColumn; 
import javax.swing.table.TableColumnModel; 
import javax.swing.text.JTextComponent; 

import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

public class SimpleTableDemo extends JPanel { 
    private boolean DEBUG = false; 

    public SimpleTableDemo() { 
     super(new GridLayout(1,0)); 

     String[] columnNames = {"First Name", 
           "Last Name", 
           "Sport", 
           "# of Years", 
           "Vegetarian"}; 

     Object[][] data = { 
    {"Kathy", "Smith", 
     "Snowboarding", new Integer(5), new Boolean(false)}, 
    {"John", "Doe", 
     "Rowing", new Integer(3), new Boolean(true)}, 
    {"Sue", "Black", 
     "Knitting", new Integer(2), new Boolean(false)}, 
    {"Jane", "White", 
     "Speed reading", new Integer(20), new Boolean(true)}, 
    {"Joe", "Brown", 
     "Pool", new Integer(10), new Boolean(false)} 
     }; 

     final JTable table = new SelectingTable(data, columnNames); 
     table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
     table.setFillsViewportHeight(true); 

     if (DEBUG) { 
      table.addMouseListener(new MouseAdapter() { 
       public void mouseClicked(MouseEvent e) { 
        printDebugData(table); 
       } 
      }); 
     } 

     //Create the scroll pane and add the table to it. 
     JScrollPane scrollPane = new JScrollPane(table); 

     //Add the scroll pane to this panel. 
     add(scrollPane); 
    } 

    private void printDebugData(JTable table) { 
     int numRows = table.getRowCount(); 
     int numCols = table.getColumnCount(); 
     javax.swing.table.TableModel model = table.getModel(); 

     System.out.println("Value of data: "); 
     for (int i=0; i

Antwort

8

Die Table Select All Editor sollte für Sie arbeiten. Dies ist die bevorzugte Lösung, damit Sie keine benutzerdefinierten Editoren erstellen müssen. Das heißt, die Spalten mit Ganzzahlen sollten nur ganze Zahlen akzeptieren. Mit Ihnen aktuellen Code

Ihr Code funktioniert teilweise. Wenn Sie die Bearbeitung mit der Taste F2 starten, wird der Text ausgewählt. Wenn Sie jedoch die Maus verwenden und auf die Zelle doppelklicken, wird das zweite Mausereignis an den Editor übergeben, sodass das Caret dort positioniert werden kann, wo Sie geklickt haben. Dadurch wird die Auswahl aufgehoben. Eine Lösung dafür ist:

final JTextComponent jtc = (JTextComponent)c; 
jtc.requestFocus(); 
//jtc.selectAll(); 
SwingUtilities.invokeLater(new Runnable() 
{ 
    public void run() 
    { 
     jtc.selectAll(); 
    } 
}); 
+0

Danke, Camickr! Ich konnte sehen, dass die Auswahl gemacht wurde, also dachte ich, dass sie wahrscheinlich später entfernt würde. Ich dachte nicht daran, einen weiteren Lauf auf den AWT-Thread zu setzen, damit er zuletzt ausgeführt wird. Ich schaute kurz auf dein RXTable, und das sieht interessant aus. Mein Ziel ist es, eine Basistabelle mit einigen Eigenschaften zu versehen, von denen ich erwarte, dass sie oft verwendet wird, und ich werde wahrscheinlich mit etwas sehr ähnlich wie RXTable enden. Danke noch einmal. – user564874

+0

Große Antwort. Es fiel mir schwer herauszufinden, warum Select All nicht funktioniert. Der Schlüssel ist zu wissen, dass der letzte Mausklick zum Texteditor geht und dann sicherstellt, dass selectAll() aufgerufen wird, nachdem der letzte Mausklick verarbeitet wurde. –

+0

Danke für diese Antwort! Hatte eine Menge Schwierigkeiten damit, es selbst zu implementieren. – flash

-1

JTables können viele verschiedene Komponenten in einer Zelle haben. Bei der Bearbeitung ist es normalerweise ein JTextField. Sie müssen zuerst das Feld und dann auswählen. Sie können die Länge des Textes ermitteln, indem Sie Ihr Modal bearbeiten. Dieser Code sollte Ihnen den Einstieg erleichtern. Sie sollten ihn in einen List-Auswahlhandler einfügen. dh.

ListSelectionModel rowSM = this.getSelectionModel(); 
rowSM.addListSelectionListener(new ListSelectionListener() { 
    public void valueChanged(ListSelectionEvent e){ 
     DefaultCellEditor ed = (DefaultCellEditor)this.getCellEditor(); 
     JTextField jf = (JTextField)ed.getComponent(); 
     jf.select(0, *text.length()*); 
     jf.requestFocusInWindow(); 
    } 
}); 

Vor allem müssen Sie die text.length() finden. Möglicherweise etwas wie:

this.getModel().getValueAt(this.getSelectedRow(), this.getSelectedColumn()).length(); 

Haftungsausschluss ich diesen Code nicht getestet haben.

+0

Danke für die Antwort. Ich habe deinen Code auch nicht getestet - ich habe zuerst Camickrs Vorschlag ausprobiert, und es hat funktioniert. Ich hatte bereits einen Hinweis auf das JTextField, aber meine Auswahl wurde gelöscht. Wenn Sie den Aufruf von selectAll() in eine ausführbare Datei einfügen, die zuletzt ausgeführt werden soll, wurde das Problem gelöst. Nochmals vielen Dank für die Antwort. – user564874

2
public class SelectAllCellEditor extends DefaultCellEditor 
{ 
    public SelectAllCellEditor(final JTextField textField) { 
     super(textField); 
     textField.addFocusListener(new FocusAdapter() 
     { 
      public void focusGained(final FocusEvent e) 
      { 
       textField.selectAll(); 
      } 
     }); 
    } 
} 
+2

Können Sie Ihren Fehler auch auf Englisch erklären? –

Verwandte Themen