2009-12-10 23 views
4

我處理的數字數據往往是按照0.01 * Value_of_variable向上或向下編輯的,所以與通常的文本單元相比,微調看起來是一個不錯的選擇。有沒有一種方便的方式在Swing JTable中使用微調器作爲編輯器?

我已經看過DefaultCellEditor,但它只會採取文本字段,組合框或複選框。

是否有方便的方法來使用微調?

+0

感謝鄉親。我想我可以創建一個自定義組件,我只是(錯誤地)認爲可能有不同的方式。 – Uri

回答

1

...並覆蓋getCellEditorValue()方法:

class SpinnerEditor extends DefaultCellEditor 
{ 
    private JSpinner spinner; 

    public SpinnerEditor() 
    { 
     super(new JTextField()); 
     spinner = new JSpinner(new SpinnerNumberModel(0, 0, 100, 5)); 
     spinner.setBorder(null); 
    } 

    public Component getTableCellEditorComponent(
     JTable table, Object value, boolean isSelected, int row, int column) 
    { 
     spinner.setValue(value); 
     return spinner; 
    } 

    public Object getCellEditorValue() 
    { 
     return spinner.getValue(); 
    } 
} 
+0

此解決方案的某些行爲可能不是適合許多用戶。當用戶在編輯器開始編輯之前輸入數字時,JTable將會聚焦JSpinner,而不是JSpinner中的編輯器。這意味着用戶剛輸入的文本不會在哪裏。將其與DefaultCellEditor的行爲方式進行對比:在當前值之後,新鍵入的鍵被插入到單元格中。 – Jason

+0

-1 cellEditor執行無效,因爲它不符合其通知合同 – kleopatra

2

只需擴展DefaultCellEditor並覆蓋getTableCellEditorComponent()方法返回JSpinner

+0

+1 @Uri - 另請參閱「使用其他編輯器」http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#editrender – ssakl

4

下面是解決我的camickr的答案評論這個問題的例子。這是一個完整和可編輯的例子。採取你所需要的,拋棄你不需要的東西。

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class JSpinnerInTables { 
    static String[] columnNames = { 
     "Name","Value" 
    }; 
    static Object[][] data = { 
     {"one",1.0}, 
     {"two",2.0} 
    }; 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     JTable table = new JTable(data,columnNames); 
     //table.setSurrendersFocusOnKeystroke(true); 
     TableColumnModel tcm = table.getColumnModel(); 
     TableColumn tc = tcm.getColumn(1); 
     tc.setCellEditor(new SpinnerEditor()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(table); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    public static class SpinnerEditor extends DefaultCellEditor 
    { 
     JSpinner spinner; 
     JSpinner.DefaultEditor editor; 
     JTextField textField; 
     boolean valueSet; 

     // Initializes the spinner. 
     public SpinnerEditor() { 
      super(new JTextField()); 
      spinner = new JSpinner(); 
      editor = ((JSpinner.DefaultEditor)spinner.getEditor()); 
      textField = editor.getTextField(); 
      textField.addFocusListener(new FocusListener() { 
       public void focusGained(FocusEvent fe) { 
        System.err.println("Got focus"); 
        //textField.setSelectionStart(0); 
        //textField.setSelectionEnd(1); 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
          if (valueSet) { 
           textField.setCaretPosition(1); 
          } 
         } 
        }); 
       } 
       public void focusLost(FocusEvent fe) { 
       } 
      }); 
      textField.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent ae) { 
        stopCellEditing(); 
       } 
      }); 
     } 

     // Prepares the spinner component and returns it. 
     public Component getTableCellEditorComponent(
      JTable table, Object value, boolean isSelected, int row, int column 
     ) { 
      if (!valueSet) { 
       spinner.setValue(value); 
      } 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        textField.requestFocus(); 
       } 
      }); 
      return spinner; 
     } 

     public boolean isCellEditable(EventObject eo) { 
      System.err.println("isCellEditable"); 
      if (eo instanceof KeyEvent) { 
       KeyEvent ke = (KeyEvent)eo; 
       System.err.println("key event: "+ke.getKeyChar()); 
       textField.setText(String.valueOf(ke.getKeyChar())); 
       //textField.select(1,1); 
       //textField.setCaretPosition(1); 
       //textField.moveCaretPosition(1); 
       valueSet = true; 
      } else { 
       valueSet = false; 
      } 
      return true; 
     } 

     // Returns the spinners current value. 
     public Object getCellEditorValue() { 
      return spinner.getValue(); 
     } 

     public boolean stopCellEditing() { 
      System.err.println("Stopping edit"); 
      try { 
       editor.commitEdit(); 
       spinner.commitEdit(); 
      } catch (java.text.ParseException e) { 
       JOptionPane.showMessageDialog(null, 
        "Invalid value, discarding."); 
      } 
      return super.stopCellEditing(); 
     } 
    } 
} 
1

傑森的答案是完美的。爲了幫助其他人尋找時間和日期版本,我編輯了Jason的代碼以適應。希望它可以幫助像傑森幫助過我的人。

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class SpinnerInJTable { 
static String[] columnNames = { 
    "Name","Time & Date" 
}; 
static Object[][] data = { 
    {"Date One",new Date(Long.decode("1397091313404"))}, 
    {"Date Two", new Date(Long.decode("1397001313404"))} 
}; 
public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    JTable table = new JTable(data,columnNames); 
    //table.setSurrendersFocusOnKeystroke(true); 
    TableColumnModel tcm = table.getColumnModel(); 
    TableColumn tc = tcm.getColumn(1); 
    tc.setCellEditor(new SpinnerEditor()); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.add(table); 
    frame.pack(); 
    frame.setVisible(true); 
} 
public static class SpinnerEditor extends DefaultCellEditor 
{ 
    JSpinner spinner; 
    JSpinner.DefaultEditor editor; 
    JTextField textField; 
    boolean valueSet; 

    // Initializes the spinner. 
    public SpinnerEditor() { 
     super(new JTextField()); 
     spinner = new JSpinner(new SpinnerDateModel()); 
     editor = ((JSpinner.DateEditor)spinner.getEditor()); 
     textField = editor.getTextField(); 
     textField.addFocusListener(new FocusListener() { 
      public void focusGained(FocusEvent fe) { 
       System.err.println("Got focus"); 
       //textField.setSelectionStart(0); 
       //textField.setSelectionEnd(1); 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         if (valueSet) { 
          textField.setCaretPosition(1); 
         } 
        } 
       }); 
      } 
      public void focusLost(FocusEvent fe) { 
      } 
     }); 
     textField.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent ae) { 
       stopCellEditing(); 
      } 
     }); 
    } 

    // Prepares the spinner component and returns it. 
    public Component getTableCellEditorComponent(
     JTable table, Object value, boolean isSelected, int row, int column 
    ) { 
     if (!valueSet) { 
      spinner.setValue(value); 
     } 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       textField.requestFocus(); 
      } 
     }); 
     return spinner; 
    } 

    public boolean isCellEditable(EventObject eo) { 
     System.err.println("isCellEditable"); 
     if (eo instanceof KeyEvent) { 
      KeyEvent ke = (KeyEvent)eo; 
      System.err.println("key event: "+ke.getKeyChar()); 
      textField.setText(String.valueOf(ke.getKeyChar())); 
      //textField.select(1,1); 
      //textField.setCaretPosition(1); 
      //textField.moveCaretPosition(1); 
      valueSet = true; 
     } else { 
      valueSet = false; 
     } 
     return true; 
    } 

    // Returns the spinners current value. 
    public Object getCellEditorValue() { 
     return spinner.getValue(); 
    } 

    public boolean stopCellEditing() { 
     System.err.println("Stopping edit"); 
     try { 
      editor.commitEdit(); 
      spinner.commitEdit(); 
     } catch (java.text.ParseException e) { 
      JOptionPane.showMessageDialog(null, 
       "Invalid value, discarding."); 
     } 
     return super.stopCellEditing(); 
    } 
} 

}

相關問題