Проблема с фокусировкой при использовании JPanel в качестве редактора ячеек JTable - PullRequest
3 голосов
/ 21 октября 2010

У меня есть редактор ячеек, который содержит маленькую кнопку, которую можно дважды щелкнуть, чтобы вызвать диалоговое окно редактирования, а затем текстовое поле, которое можно использовать для редактирования встроенного значения (всплывающее окно необходимо, чтобы разрешить редактирование дополнительных значенийв JTable отображается только первое).

Когда пользователь нажимает на поле, все в порядке, но если они вкладывают его в поле, его текстовое поле не получает фокус и не может редактировать поле, если не щелкнетэто с помощью мыши.

Я пытался поиграться с различными методами фокусировки jpanel, но это не имело никакого значения, кто-нибудь знает, что я делаю не так?

package com.jthink.jaikoz.celleditor;

import com.jthink.jaikoz.celldata.Cell;
import com.jthink.jaikoz.guielement.Focus;
import com.jthink.jaikoz.table.CellLocation;
import com.jthink.jaikoz.table.DatasheetToggleButton;
import com.jthink.jaikoz.table.datasheet.Datasheet;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class SimpleMultiRowCellEditor
    extends DefaultCellEditor implements ActionListener
{

    final JPanel panel;
    private final DatasheetToggleButton rowCount;
    Cell value;

    public SimpleMultiRowCellEditor(final JTextField text)
    {
        super(text);
        this.setClickCountToStart(1);

        rowCount = new DatasheetToggleButton();
        rowCount.setVisible(true);
        rowCount.addActionListener(this);
        panel = new JPanel();
        panel.setOpaque(false);
        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
        panel.add(rowCount);
        panel.add(editorComponent);
        /*panel.setFocusable(true);
        panel.setFocusCycleRoot(true);
        ArrayList focusOrder = new ArrayList();
        focusOrder.add(editorComponent);
        focusOrder.add(rowCount);
        focusOrder.add(panel);
        panel.setFocusTraversalPolicy(new Focus(focusOrder));
        */
    }

    public Component getTableCellEditorComponent(
        final JTable table, final Object val, final boolean isSelected,
        final int row, final int column)
    {
        value = (Cell) ((Cell) val).clone();
        rowCount.setText(String.valueOf(value.getValues().size()));
        delegate.setValue(value.getValue());
        return panel;
    }

    public Object getCellEditorValue()
    {
        final String s = (String) delegate.getCellEditorValue();
        value.setValue(s);
        return value;
    }

    public void actionPerformed(final ActionEvent e)
    {
        this.stopCellEditing();
        final CellLocation cl =  Datasheet.getActiveEditSheet()
            .getTable().getSelectedCellLocations().get(0);
        UpdateMultiRowCellDialog.getInstanceOf().display(value,cl);
    }
}

Пробовал добавлять focuslistener на панель, не так липохоже, что-то меняет

class PanelFocusListener implements FocusListener
{
    public void focusGained(FocusEvent e)
    {
        System.out.println("Gained Focus");
        editorComponent.requestFocusInWindow();
    }

    public void focusLost(FocusEvent e)
    {
        System.out.println("Lost Focus");

    }
}

Так что после ввода в поле я набираю клавишу, и это выглядит как фокус, но вы ничего не можете ввести в поле, тогда как если я наберу RETURN, то я могу начатьредактируя поле, что делает нажатие RETURN, чтобы оно работало?

1 Ответ

1 голос
/ 21 октября 2010

что делает нажатие RETURN, чтобы оно работало?

Как показано в удобном приложении Key Bindings , по умолчанию ENTER связывание клавиш в большинстве L & Fs равно notify-field-accept. Непонятно, почему ваш ActionListener начинается с stopCellEditing(). Я ожидал, что он вызовет fireEditingStopped() после обновления модели данных, как предложено в этом примере .

К сожалению, я незнаком с Jaikoz . Вы можете посмотреть Основные понятия: редакторы и средства визуализации и последующие разделы для получения дополнительных указаний.

Приложение: Как отмечено в вашем комментарии, JTextField в DefaultCellEditor позволяет вводить текст в выбранном поле по умолчанию. Из вашего примера не ясно, как это значение по умолчанию обнуляется. Если отсутствует sscce , который демонстрирует проблему, вы можете сравнить свой код с этим связанным примером , который демонстрирует поведение по умолчанию, используя подкласс JTextField.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...