2009-12-10 25 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(); 
    } 
} 

}

相关问题