2016-06-27 6 views
1

Wie kann ich Caret-Position in einer JTable setzen?SetCaretPosition in JTable

Ich weiß, JTextField hat setCaretPosition(n) Funktion. Aber ich kann auf JTextField in der JTable nicht zugreifen.

Ich möchte die Tabelle Text Caret Position gleiche Textlänge. Es ist möglich, ein Ereignis per Mausklick auszuführen, aber es sollte eine normale Position sein.

Mein Code:

public class TableTest extends javax.swing.JFrame 
{ 

    public TableTest() 
    { 
     javax.swing.JTable jTable1 = new javax.swing.JTable(); 

     jTable1.setModel(new javax.swing.table.DefaultTableModel(
       new Object[][] 
       { 
        { 
         "This is too long text!", "This is too long text!", 
        }, 
        { 
         "This is too long text!", "This is too long text!", 
        } 
       }, 
       new String[] 
       { 
        "Title 1", "Title 2", 
       } 
     )); 

     add(jTable1); 

     pack(); 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     setLocationRelativeTo(null); 
    } 
    public static void main(String args[]) 
    { 
     new TableTest().setVisible(true); 
    } 

} 

Diese Tabelle Zellen gezeigt werden: [! ..long text] [Auch das ist ...], aber es sollte sein

+1

für bessere Hilfe eher eine SSCCE/MCVE, kurz, runnable, kompilierbar mit hardcoded Wert für JTable/XxxTableModel in lokalen Variablen, sonst alles über reine Raten, Hinweis - Frage in dieser Form ist hier nicht beantwortbar – mKorbel

+0

Danke, Ich verbessere meine Frage. –

+1

@mKorbel: Vielen Dank für die kritische Überprüfung. Basierend auf der aktualisierten Frage habe ich unten einen anderen Ansatz vorgeschlagen. – trashgod

Antwort

3

werden Diese Tabelle Zellen gezeigt: [Dies ist auch ...], aber es sollte sein [..long Text!]

Dies ist der Renderer, die den Text in einer Zelle zeigt. Der Standard-Renderer ist ein JLabel und es wird ... angezeigt, wenn der Text abgeschnitten wird. Wenn Sie die ... am Anfang der Zelle möchten, müssen Sie einen benutzerdefinierten Renderer erstellen.

Überprüfen Sie die Left Dot Renderer für einen Renderer, der dies tut.

+0

Es funktioniert, vielen Dank. –

2

Die Aktion Standard "startEditing", vorgeschlagen here, wird von BasicTableUI zur Verfügung gestellt. In der Regel wird der gesamte Text ausgewählt, den Sie vermeiden möchten. Sie können setCaretPosition() in einem benutzerdefinierten Action aufrufen, der an Ihren bevorzugten Tastenanschlag gebunden ist. Im folgenden Beispiel wird der Name "myEditing" und der Schlüssel Space verwendet.

image

import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.KeyStroke; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.text.JTextComponent; 

/** 
* @see https://stackoverflow.com/a/38051001/230513 
*/ 
public class TableTest { 

    private void display() { 
     JFrame f = new JFrame("TableTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     DefaultTableModel model = new DefaultTableModel(
      new String[][]{ 
       {"This is too long text!", "This is too long text!",}, 
       {"This is too long text!", "This is too long text!",} 
      }, 
      new String[]{ 
       "Title 1", "Title 2",} 
     ) { 
      @Override 
      public Class<?> getColumnClass(int columnIndex) { 
       return String.class; 
      } 
     }; 
     JTable table = new JTable(model) { 

      @Override 
      public Dimension getPreferredScrollableViewportSize() { 
       return new Dimension(320, 160); 
      } 
     }; 
     table.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "myEditing"); 
     table.getActionMap().put("myEditing", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       table.editCellAt(table.getSelectedRow(), table.getSelectedColumn()); 
       Component editor = table.getEditorComponent(); 
       if (editor != null) { 
        editor.requestFocus(); 
        if (editor instanceof JTextComponent) { 
         JTextComponent jtc = (JTextComponent) editor; 
         EventQueue.invokeLater(new Runnable() { 

          @Override 
          public void run() { 
           jtc.setCaretPosition(jtc.getDocument().getLength()); 
          } 
         }); 
        } 
       } 
      } 
     }); 
     table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE); 
     f.add(new JScrollPane(table)); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new TableTest()::display); 
    } 
} 

Als Referenz wird ein ähnlicher Ansatz für ein Maus-Ereignis in diesen vorherigen version gezeigt.

+0

Ich möchte in der Standardposition nicht mit der Maus klicken. Ist es möglich? Alle Spalten- und Zeilenmarkierungen sollten Textlänge sein. –

+0

Wie [this] (http://stackoverflow.com/a/11838443/230513)? – trashgod

+0

Ich schrieb [das] (http://stackoverflow.com/a/11838443/230513) Code, aber nichts änderte. –