我處理的數字數據往往是按照0.01 * Value_of_variable向上或向下編輯的,所以與通常的文本單元相比,微調看起來是一個不錯的選擇。有沒有一種方便的方式在Swing JTable中使用微調器作爲編輯器?
我已經看過DefaultCellEditor,但它只會採取文本字段,組合框或複選框。
是否有方便的方法來使用微調?
我處理的數字數據往往是按照0.01 * Value_of_variable向上或向下編輯的,所以與通常的文本單元相比,微調看起來是一個不錯的選擇。有沒有一種方便的方式在Swing JTable中使用微調器作爲編輯器?
我已經看過DefaultCellEditor,但它只會採取文本字段,組合框或複選框。
是否有方便的方法來使用微調?
...並覆蓋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();
}
}
只需擴展DefaultCellEditor
並覆蓋getTableCellEditorComponent()
方法返回JSpinner
。
+1 @Uri - 另請參閱「使用其他編輯器」http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#editrender – ssakl
下面是解決我的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();
}
}
}
傑森的答案是完美的。爲了幫助其他人尋找時間和日期版本,我編輯了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();
}
}
}
感謝鄉親。我想我可以創建一個自定義組件,我只是(錯誤地)認爲可能有不同的方式。 – Uri