簡體   English   中英

編輯JTable時的行為不一致

[英]Inconsistent behavior when editing JTable

我想創建一個具有以下屬性的JTable:

  • 單擊單元格將開始編輯(完成-通過setClickCountToStart(1))
  • 跳動會將用戶帶到下一個單元格(已經是默認值)
  • 按回車將調用一些外部方法

我試圖通過將一個項目添加到DefaultCellEditor的文本字段的ActionMap中來實現最后一個項目。 這按以下順序工作:

  • 單擊單元格
  • 輸入一些文字
  • 點擊進入

但是,如果我通過選項卡導航到任何其他單元格,請編輯該單元格,然后單擊Enter,這將不起作用。 僅當我在通過點擊開始編輯的單元格中按Enter鍵時,才會觸發該操作。 如果我通過按Tab鍵或使用箭頭鍵進入該單元格,它將無法正常工作。

我認為也許焦點仍然集中在我開始編輯的單元上? 我注意到,如果我單擊/編輯/制表幾次,然后在按Enter鍵之前單擊當前編輯的單元格,那似乎可行。

選項卡是否將用戶帶到下一個單元格而不轉移焦點? 任何幫助,將不勝感激。

package jtabletest;

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.DefaultCellEditor;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class JTableKeyMap {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(JTableKeyMap::createAndDisplayGui);
    }


    public static void createAndDisplayGui() {
        final JTable table = new JTable(4, 4);
        final JTextField cell = new JTextField();
        final DefaultCellEditor cellEditor = new DefaultCellEditor(cell);
        cellEditor.setClickCountToStart(1);

        table.setDefaultEditor(Object.class, cellEditor);

        KeyStroke enterKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
        String enterText = "enterKeyPressed";

        final InputMap iMap = cell.getInputMap(JComponent.WHEN_FOCUSED);
        iMap.put(enterKeyStroke, enterText);

        AbstractAction action = new AbstractAction() {
            @Override
            public void actionPerformed(final ActionEvent e) {
                System.out.println("Callback for key event");
                cellEditor.stopCellEditing();
            }
        };

        ActionMap aMap = cell.getActionMap();
        aMap.put(enterText, action);

        aMap.put(KeyEvent.getKeyText(KeyEvent.VK_ENTER), new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Callback for key event");

                cellEditor.stopCellEditing();
            }
        });

        JScrollPane scrollPane = new JScrollPane(table);


        final JFrame frame = new JFrame("Table Test");
        frame.setContentPane(scrollPane);
        frame.setPreferredSize(scrollPane.getPreferredSize());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

創建JTable時添加以下內容:

table.setSurrendersFocusOnKeystroke(true);

如果您僅在單元​​格具有焦點時才開始輸入,這將使編輯器具有焦點。 然后,編輯器將響應您的按鍵綁定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM