2016-06-27 13 views
1

Как установить положение каретки в JTable?SetCaretPosition в JTable

Я знаю, что JTextField имеет setCaretPosition(n) функция. Но я не могу получить доступ к JTextField в JTable.

Я хотел бы, чтобы текст в тексте таблицы был равномерной длины текста. Событие mouseclick возможно, но оно должно быть нормальным.

Мой код:

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

} 

Эта таблица клетки показаны: [! ..long текст] [Это тоже ...], но оно должно быть

+1

для лучшей помощи скорее опубликовать SSCCE/MCVE, короткий, работоспособный, компилируются с закодированным значением для JTable/XxxTableModel в локальном переменных, в противном случае все о чисто догадке, намек - вопрос в этой форме не отвечает здесь – mKorbel

+0

Спасибо, Я улучшаю свой вопрос. –

+1

@mKorbel: Спасибо за критический обзор. Основываясь на обновленном вопросе, я предложил другой подход ниже. – trashgod

ответ

3

Эта таблица клетки показаны: [Это тоже ...], но оно должно быть [..long текст]

Это Отображатель, который отображает текст в ячейке. Средство рендеринга по умолчанию - JLabel, и оно будет отображать ..., когда текст будет усечен. Если вы хотите ... в начале ячейки, вам необходимо создать собственный рендерер.

Отметьте Left Dot Renderer для средства визуализации, которое делает это.

+0

Это работает, спасибо большое. –

2

по умолчанию "startEditing" действие, предложил here, предоставляется BasicTableUI. Он обычно выбирает весь текст, которого вы хотите избежать. Вы можете вызвать setCaretPosition() в обычном Action, привязанного к вашему предпочтительному нажатию клавиши. В приведенном ниже примере используется имя "myEditing" и Пробел ключ.

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

Для справки, аналогичный подход для события мыши показано в этом предыдущем version.

+0

Я хотел бы по умолчанию не щелкнуть мышью. Является ли это возможным? Вся каретка столбца и строки должна быть длиной текста. –

+0

Как [это] (http://stackoverflow.com/a/11838443/230513)? – trashgod

+0

Я написал [это] (http://stackoverflow.com/a/11838443/230513) код, но ничего не изменилось. –