2012-08-07 56 views
1

我已經定義單元格編輯器在我的表:在JTable中單元格開始編輯在以下方式獲得的兩列焦點

Java代碼:

JComboBox combo = new JComboBox(); 
//code to add items to the combo box goes here. 

JTextField textField = new JTextField(); 
textField.setHorizontalAlignment(JTextField.RIGHT); 

TableColumn column = myJTable.getColumnModel().getColumn(0); 
column.setCellEditor(new DefaultCellEditor(combo)); 

column = myJTable.getColumnModel().getColumn(1); 
column.setCellEditor(new DefaultCellEditor(textField)); 

我現在面臨的問題是當焦點移動到表格單元格時,單元格不會自動編輯。所以,當焦點移動到第2列(有一個文本字段作爲編輯器)時,插入符號不會出現,除非該單元格被雙擊或用戶開始鍵入。第1列(以組合框作爲編輯器)的情況類似,因爲除非單擊單元格,否則組合框不會出現。這些行爲是反直覺的和不受歡迎的與鍵盤操作的用戶。:(

請這到底是怎麼解決的建議指針。提前

感謝。

+1

您也可以使用'JComboBox'作爲單元格渲染器。您還可以使用[DefaultCellEditor.setClickCountToStart](http://docs.oracle.com/javase/6/docs/api/javax/swing/DefaultCellEditor.html#setClickCountToStart%28int%29)覆蓋默認的雙擊行爲。 – tenorsax 2012-08-07 02:07:35

回答

2
  1. example覆蓋editCellAt()JTableDefaultCellEditor使用JTextField

  2. 可以綁定空間鍵爲JTable定義的startEditing動作:

    table.getInputMap().put(
        KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "startEditing"); 
    
+0

很好的例子,+1 – tenorsax 2012-08-07 02:34:16

2

如上評論,你可以使用JComboBox中既作爲渲染器和編輯器。以下是一個非常基本的例子。它還顯示DefaultCellEditor.setClickCountToStart()的用法。

import java.awt.Component; 
import javax.swing.DefaultCellEditor; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumn; 

public class ComboBoxEditorDemo { 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame("ComboBoxEditorDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JTable table = new JTable(
       new Object[][] { { "1", "2" }, { "1", "2" } }, 
       new Object[] {"Col1", "Col2" }); 

     table.setRowHeight(24); 

     TableColumn column = table.getColumnModel().getColumn(1); 
     column.setCellRenderer(new MyComboBoxRenderer(new String[] { "1", "2", "3" })); 
     column.setCellEditor(new MyComboBoxEditor(new String[] { "1", "2", "3" })); 

     DefaultCellEditor editor = new DefaultCellEditor(new JTextField()); 
     editor.setClickCountToStart(1); 
     column = table.getColumnModel().getColumn(0); 
     column.setCellEditor(editor); 

     JScrollPane scrollPane = new JScrollPane(table); 
     frame.add(scrollPane); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    static class MyComboBoxRenderer extends JComboBox implements 
      TableCellRenderer { 
     public MyComboBoxRenderer(String[] items) { 
      super(items); 
     } 

     public Component getTableCellRendererComponent(JTable table, 
       Object value, boolean isSelected, boolean hasFocus, int row, 
       int column) { 
      if (isSelected) { 
       setForeground(table.getSelectionForeground()); 
       super.setBackground(table.getSelectionBackground()); 
      } else { 
       setForeground(table.getForeground()); 
       setBackground(table.getBackground()); 
      } 

      setSelectedItem(value); 
      return this; 
     } 
    } 

    static class MyComboBoxEditor extends DefaultCellEditor { 
     public MyComboBoxEditor(String[] items) { 
      super(new JComboBox(items)); 
     } 
    } 
} 
相關問題