2011-01-06 6 views
10

편집 할 수있는 JTables의 편집기에서 편집을 시작할 때 셀의 모든 텍스트를 선택하고 싶습니다. TableCellEditor.getTableCellEditorComponent 메서드에서 반환되는 구성 요소에서 JTextComponent.selectAll()을 호출하는 두 가지 방법을 시도했습니다. 내가 시도한 것들 중 아무 것도 일하지 않았다.편집 할 때 JTable 셀의 모든 텍스트를 선택하는 방법

최근 시도에서 selectAll 메서드를 호출하는 사용자 지정 TableCellEditor를 사용하도록 Swing 자습서에서 SimpleTableDemo 클래스를 변경했습니다. 디버거에서 selectAll() 메서드를 호출하는 것을 볼 수 있지만 셀의 텍스트를 선택하지 않고 테이블을 여전히 편집 모드로 전환합니다 (또는 선택 영역이 표시되기 전에 선택 취소되어있을 수 있습니다). 그 코드는 아래와 같습니다. 아무도 내가 잘못 가고 있다고 말할 수 있습니까?

 
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

답변

8

Table Select All Editor이 적합합니다. 사용자 정의 편집기를 계속 작성할 필요가 없도록하는 것이 바람직한 솔루션입니다. 즉, 정수를 포함하는 열은 정수만 허용해야합니다. 현재 코드

코드가 부분적으로 작동합니다. F2 키를 사용하여 편집을 시작하면 텍스트가 선택됩니다. 그러나 마우스를 사용하여 셀을 두 번 클릭하면 두 번째 마우스 이벤트가 편집기로 전달되므로 클릭 한 위치에 캐럿을 배치 할 수 있으므로 선택 항목이 제거됩니다. 이에 대한 해결책은 다음과 같습니다.

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

감사합니다. 나는 그 선택이 끝난 것을 볼 수 있었고, 아마도 그 후 아마도 제거되었을 것이라고 나는 생각했다. awt 쓰레드에 다른 runnable을 두어 마지막으로 실행될 것이라고 생각하지 않았습니다. 귀하의 RXTable에서 잠깐 살펴 보았는데 흥미로운 것 같습니다. 필자의 목표는 자주 사용하기를 기대하는 일부 속성을 기본 테이블 클래스에 제공하는 것이며, 아마도 RXTable과 매우 흡사하게 될 것입니다. 다시 한번 감사드립니다. – user564874

+0

좋은 답변입니다. selectAll이 작동하지 않는 이유를 파악하는 데 어려움을 겪고있었습니다. 핵심은 마지막 마우스 클릭이 텍스트 편집기로 이동 한 다음 마지막 마우스 클릭이 처리 된 후 selectAll()이 호출되는지 확인하는 것입니다. –

+0

답장을 보내 주셔서 감사합니다. 나 자신을 구현하는 데 많은 어려움이 있었다. – flash

-1

JTable은 셀에 많은 구성 요소를 포함 할 수 있습니다. 편집 할 때 일반적으로 JTextField입니다. 먼저 필드를 가져 와서 선택해야합니다. 당신은 당신의 모달을 통해 텍스트의 길이를 얻을 수 있습니다. 이 코드는 시작해야하며 List 선택 핸들러에 배치해야 할 수 있습니다. 즉.

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

특히 text.length()를 찾아야합니다. 아마도 뭔가 같은 :이 코드를 테스트하지 않았습니다

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

부인.

+0

응답 해 주셔서 감사합니다. 나는 당신의 코드를 테스트하지도 않았다 - 나는 Camickr의 제안을 먼저 시도해 보았다. 이미 JTextField에 대한 참조가 있지만 선택 항목이 지워지고 있습니다. 마지막으로 실행되는 runnable에 selectAll() 호출을 두는 것이 문제를 해결 한 방법입니다. 응답에 다시 한 번 감사드립니다. – 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

영어로도 설명 할 수 있습니까? –

관련 문제