java - 像 JTable 单元格编辑器一样使用 JSpinner

标签 java swing focus tablecelleditor jspinner

我正在使用像表格单元格编辑器一样的 JSpinner,我有一个烦人的问题:

单元格保持在不可编辑模式,直到我点击它,对于不可编辑我的意思是我不能写入它(它没有焦点所以它不接受输入键盘)但我可以改变带有(键盘)上下箭头的值。

那么,当我按下一个键时,我必须做什么才能使我的表格单元格聚焦?

除了那个问题,我的 SpinnerEditor 类工作得很好。

谢谢大家。

最佳答案

这是一个完整的例子。它所做的不仅仅是将 JSpinner 放在表格中,因此您可以阅读它并获取您需要的内容。我发现 Blow 的答案不完整,对我不起作用,所以这里有一些你可以编译和运行的东西。

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

关于java - 像 JTable 单元格编辑器一样使用 JSpinner,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3736993/

相关文章:

java - Netbeans java Swing jRadioButton setIcon 和 setSelectedIcon

java - 动画 Gif 触发 paintComponent (Java)?

java - 如何在 eclipse 中将 MySQL 数据库连接到 tomcat 服务器?

java - 现实生活中,在 Java 中使用 String.intern() 的实际示例?

java - Controller 中扩展抽象 Controller 的方法的自定义注释

c++ - 如何找到当前焦点所在的程序?

java - 当焦点离开我的 JTable 时,结合 'Excel-like' 行为并更新模型

java - 从系统属性获取 JRE 版本

java - 在 Install4j 中创 build 置时将 Java 应用程序启动

android - 我的 PopupWindow 不断窃取 EditText 的焦点