2

2列のJTableがあります。これらの列の1つはJTextFieldで表され、もう1つはラジオボタンで表されます。

モデルは次のように入力されます。

   model.addRow(new Object[]{radioButton, ""});

JTextFieldに関連付けられているのは、次のようなセルエディタです。

class MyCellEditor extends DefaultCellEditor {

  MyCellEditor(JTextField textField) {
    super(textField);
    textField.addFocusListener(new FocusListener() {

        public void focusLost(FocusEvent e) {
            // do something if focus is lost
        }

        @Override
        public void focusGained(FocusEvent e) {
        }
    });
}

JTextFieldセルをクリックすると、期待どおりに「点滅」カーソルが表示されるので、テキストを入力できます。とにかく、メインウィンドウの他の場所をクリックすると、「focusLost(...)」メソッドが呼び出されたと思います。ただし、これは、ウィンドウ内で少し「再生」した場合にのみ発生します(jtextfieldを数回クリックしたりクリックしたりするなど)。

別の外部コンポーネントを最初にクリックした直後に、コンポーネントがフォーカスを失わないのはなぜですか?

4

2 に答える 2

4

stopEditing()で上書きできますTableCellEditor

または直接書く

table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

より複雑な (JFormattedTextField) の例

import java.awt.Component;
import java.awt.EventQueue;
import java.text.DecimalFormat;
import java.text.ParseException;
import javax.swing.*;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;

public class EditorAsRendererTableTest {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JTable table = new JTable(3, 2);
                TableColumnModel colModel = table.getColumnModel();
                MyCellEditor both = new MyCellEditor();
                colModel.getColumn(0).setCellEditor(both);
                colModel.getColumn(0).setCellRenderer(both);
                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.getContentPane().add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    private static class MyCellEditor extends AbstractCellEditor implements TableCellEditor, TableCellRenderer {

        private static final long serialVersionUID = 1L;
        private JFormattedTextField renderer = new JFormattedTextField(DecimalFormat.getInstance());
        private JFormattedTextField editor;

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            renderer.setValue(value);
            return renderer;
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            editor = new JFormattedTextField(DecimalFormat.getInstance());
            editor.setValue(value);
            return editor;
        }

        @Override
        public boolean stopCellEditing() {
            try {
                editor.commitEdit();
            } catch (ParseException e) {
                return false;
            }
            return super.stopCellEditing();
        }

        @Override
        public Object getCellEditorValue() {
            return editor.getValue();
        }
    }

    private EditorAsRendererTableTest() {
    }
}
于 2012-05-28T12:54:09.683 に答える
0

私はこのように修正しました:

1) 新しい JTextField にフォーカスを与える:

 if (editCellAt(getRowCount()-1, 1)) getEditorComponent().requestFocus();

2) テーブルはフォーカスの喪失を自動検出します。

 table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

3) 「MyCellEditor クラス --> @Override public boolean stopCellEditing()」で、コンポーネントにフォーカスがあるかどうかを確認します。

 getComponent().isFocusOwner()
于 2012-05-28T20:51:30.527 に答える