Проблема, чтобы сосредоточиться JTextField - PullRequest
1 голос
/ 14 апреля 2010

(проблема возникает только в Ubuntu. Работает нормально в Windows. Я не знаю, в других средах Linux)

Я использовал подход ComponentListener для вызова фокуса в JTextField в диалоге, но для этого случая просто не работает, я не знаю почему. Показывает фокусировку в текстовом поле и быстрое переключение на кнопку. Беги и смотри:

import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class User {

    private String username = "";
    private String password = "";

    public User() {
    // default constructor
    }

    public User(String username, String password) {
    this.username = username;
    this.password = password;
    }

    /** Create a panel containing the componet and tha label. */
    public JPanel createLabeledComponent(JLabel label, Component comp) {
    GridLayout layout = new GridLayout(2, 1);
    JPanel panel = new JPanel(layout);
    panel.add(label);
    panel.add(comp);
    label.setLabelFor(comp);
    return panel;
    }

    public void showEditDialog() {

    JLabel usernameLbl = new JLabel(username);
    final JTextField usernameField = new JTextField();
    usernameField.setText(username);
    JPanel usernamePnl = createLabeledComponent(usernameLbl, usernameField);

    JLabel passwordLbl = new JLabel(password);
    JPasswordField passwordField = new JPasswordField(password);
    JPanel passwordPnl = createLabeledComponent(passwordLbl, passwordField);

    Object[] fields = { "User:", usernamePnl, "Password:", passwordPnl };

    JOptionPane optionPane = new JOptionPane(fields, JOptionPane.PLAIN_MESSAGE,
        JOptionPane.OK_CANCEL_OPTION, null, null);
    JDialog dialog = optionPane.createDialog("User Data");

    dialog.addComponentListener(new ComponentAdapter() {
        @Override
        public void componentShown(ComponentEvent e) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
            usernameField.requestFocusInWindow();
            }
        });
        }
    });

    dialog.setVisible(true);
    }

    public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
        new User().showEditDialog();
        }
    });
    }

}

Есть идеи, как это решить?

- обновление

Теперь все работает на EDT. К сожалению, с таким же поведением.

Кстати, использование последнего аргумента (Object initialValue) конструктора JOptionPane не работает.

Ответы [ 3 ]

1 голос
/ 18 апреля 2010

Помню, у меня была похожая проблема, я использовал решение, найденное внизу этой страницы:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5018574

0 голосов
/ 18 апреля 2010

С Как использовать подсистему фокуса :

Как именно окно получает фокус, зависит от системы управления окнами. На всех платформах нет надежного способа обеспечить фокусировку окна.

Кроме того, из Component.requestFocusInWindow :

Будут приложены все усилия, чтобы удовлетворить просьбу; однако в некоторых случаях это может быть невозможно. Разработчики никогда не должны предполагать, что этот Компонент является владельцем фокуса, пока этот Компонент не получит событие FOCUS_GAINED.

Ваши компоненты могут быть не реализованы, пока вы не позвоните requestFocusInWindow. Вы пытались поставить dialog.pack(); перед setVisible(true)?

0 голосов
/ 14 апреля 2010

Может быть, это Dialog Focus решение будет работать на Ubuntu (я не могу его протестировать).

Показывает фокус в текстовом поле. и быстро переключаемся на кнопку.

Или вы можете попробовать обернуть вызов метода requestFocusInWindow () в SwingUtilities.invokeLater (), чтобы поместить запрос в конец EDT.

...