سؤال

ما أريد القيام به هو عندما المستخدم التحرير الانتهاء من البيانات في خلية جدول لنقل التركيز إلى خلية أخرى حسب ما دخل المستخدم، وتتحول تلك الخلية في وضع التحرير بحيث يمكن للمستخدم بدء كتابة على الفور مع أي إجراء إضافي. يمكن بهذه الطريقة المستعمل يركز على عمله والبرنامج سوف تفعل "التفكير" حول الخلية التي يجب أن تعدل المقبل.

ومهمة بسيطة التي لا تبدو في غاية البساطة في الحياة الحقيقية ... أي شخص فكرة؟

هل كانت مفيدة؟

المحلول

يرجى محاولة هذا المثال.

وينبغي أن تتيح لك التنقل من خلال جدول بإدخال القيم ش، د، ل، ص لأعلى، أسفل، يسار، يمين.

ونأمل أن هذا سوف تعطيك فكرة عن كيفية القيام بذلك.

import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class Test extends JFrame {

    private JTable table;
    private TableModel tableModel;

    public Test() {
        tableModel = new DefaultTableModel(5, 5);

        table = new JTable(tableModel);
        table.setColumnSelectionAllowed(true);

        getContentPane().add(table);

        Action handleEnter = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                table.getCellEditor().stopCellEditing(); // store user input
                int row = table.getSelectedRow();
                int col = table.getSelectedColumn();
                String val = String.valueOf(table.getValueAt(row, col)).toLowerCase();
                if (val.equals("u"))
                    --row;
                else if (val.equals("d"))
                    ++row;
                else if (val.equals("l"))
                    --col;
                else if (val.equals("r"))
                    ++col;
                if (     row >= 0 && row < tableModel.getRowCount()
                      && col >= 0 && col < tableModel.getColumnCount()) {
                    table.changeSelection(row, col, false, false);
                    table.editCellAt(row, col);
                }
            }
        };
        // replace action for ENTER, since next row would be selected automatically
        table.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "handleEnter");
        table.getActionMap().put("handleEnter", handleEnter);
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.setSize(800, 600);
        test.setVisible(true);
    }
}

نصائح أخرى

ويجب عليك إضافة KeyListener إلى JTable للحصول على كل حرف كتبته. بعد يضغط المستخدم أدخل ، يجب عليك التحقق من كلمة تمت كتابة المستخدم.

وكتابة FocusTraversalPolicy بنفسك لتعيينها إلى الجدول

table.setFocusTraversalPolicy(policy)

ووFocusTraversalPolicy يصف المكون الذي يحصل على التركيز المقبل. بعد ذلك يمكنك الاتصال ب

FocusManager.getCurrentManager().focusNextComponent();

وتحرير: لم أكن اختبار هذا، انها مجرد فكرة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top