usar setrowcount que como java swing jtable spinner

java - que - model setrowcount



¿Existe una forma conveniente de usar un girador como editor en una JTable Swing? (4)

... y sobrescribe el método 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(); } }

Trato datos numéricos que a menudo se editan hacia arriba o hacia abajo por 0.01 * Value_of_variable, por lo que un spinner parece una buena opción en comparación con una celda de texto habitual.

Miré DefaultCellEditor pero solo tomará campos de texto, cuadros combinados o casillas de verificación.

¿Hay una manera conveniente de usar un spinner?


Simplemente extienda DefaultCellEditor y sobrescriba el método getTableCellEditorComponent() para devolver un JSpinner .


Aquí hay un ejemplo que aborda el problema que comenté en la respuesta de Camickr. Este es un ejemplo completo y compilable. Toma lo que necesitas y abandona lo que no.

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


La respuesta de Jason es perfecta. Para ayudar a otros que podrían estar buscando una versión de fecha y hora, he editado el código de Jason para adaptarlo. Espero que ayude a alguien, ya que Jason me ha ayudado.

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

}