Je ne peux pas cliquer dans ce JTextField pour l'éditer, pourquoi pas?

METTRE À JOUR

Cela ne se produit que sous OS X. Le problème n'est pas présent sur Windows. J'utilise Eclipse Kepler et Oracle 1.7.0_45.jdk


Le code ci-dessous est une interface graphique de base exécutée à partir d'un composant de services déclaratifs OSGI. Le problème est que lorsque l'interface graphique se lance, je ne peux pas interagir avec le JTextField loginField . Je peux interagir avec le JButton loginButton . Si je cours le même code qu'une application Java, je peux interagir/éditer le JTextField . Le problème doit donc être dû au lancement en tant que bundle OSGi. Quelqu'un peut-il faire la lumière sur ce que le problème pourrait être?

DoctorDevice.java

package ie.ucd.sh.doctor;

import org.osgi.service.component.ComponentContext;
import ie.ucd.sh.db.context.DbContext;
import java.awt.EventQueue;

/**
 * This class runs the GUI for the Doctor Device.  It connects to the database using the abstraction
 * provided by the ie.ucd.sh.db.context bundle and displays information on the doctor that has logged in
 * into the device.
 * @author Conor Griffin
 */
public class DoctorDevice {

    protected DbContext dbContext;
    DoctorGUI window;

    public void activate(ComponentContext ctxt) {

        /**
         * Launch the swing GUI and set its DbContext
         */
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    window = new DoctorGUI();
                    window.frame.setVisible(true);
                    window.dbContext = dbContext;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    protected void deactivate(ComponentContext ctxt) {
        window.terminate();
    }

    public DbContext getContext() {
        return dbContext;
    }

    public void setContext(DbContext dbContext) {
        this.dbContext = dbContext;
        System.out.println("DbContext was set to " + dbContext);
    }

}

DoctorGUI.java

package ie.ucd.sh.doctor;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import java.awt.GridLayout;

import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import ie.ucd.sh.db.context.DbContext;
import ie.ucd.sh.db.context.Doctor;
import ie.ucd.sh.db.context.Entity.Type;
import ie.ucd.sh.db.context.Nurse;
import ie.ucd.sh.db.context.Patient;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JTabbedPane;

public class DoctorGUI {

    protected JFrame frame;
    protected DbContext dbContext;
    private static DateFormat df = new SimpleDateFormat("HH:mm:ss");
    private Doctor currentUser;
    private JTextField loginField;

    /**
     * Create the application.
     */
    public DoctorGUI() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    public void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new GridLayout(0, 2, 0, 0));

        JPanel inputPanel = new JPanel();
        frame.getContentPane().add(inputPanel);
        inputPanel.setLayout(null);

        JButton loginButton = new JButton("Login");
        loginButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent e) {
                currentUser = login();
            }
        });
        loginButton.setBounds(137, 6, 82, 29);
        inputPanel.add(loginButton);

        loginField = new JTextField();
        loginField.setBounds(6, 5, 134, 28);
        inputPanel.add(loginField);
        loginField.setToolTipText("Enter your ID");
        loginField.setColumns(10);
        loginField.setEditable(true);

        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        frame.getContentPane().add(tabbedPane);
        loginField.requestFocusInWindow();
    }


    /**
     * Login the doctor
     * @return
     */
    private Doctor login() {
        int id = 0;
        Doctor doctor = null;
        try {
            id = Integer.parseInt(loginField.getText());
        } catch (NumberFormatException e) {
            e.printStackTrace();
            String title = "Invalid Value";
            String message = "ID must be numeric";
            JOptionPane.showMessageDialog(null, message, title, JOptionPane.ERROR_MESSAGE);
            return doctor;
        }

        doctor = (Doctor)dbContext.get(Type.Doctor, id);
        System.out.println(doctor.getFirstName() + " " + doctor.getLastName());

        return doctor;
    }

    /**
     * Set the JFrame to invisible and throw it away
     */
    public void terminate() {
        frame.setVisible(false);
        frame.dispose();
    }
}

DbContextClient.xml - La définition du composant OSGi

<?xml version="1.0" encoding="UTF-8"?>

   
   

3
ajouté édité
Vues: 1
J'ai mis à jour l'exemple afin qu'il soit plus clair comment l'exécuter. C'est un ensemble OSGi utilisant les services déclaratifs. Quand je lance le même code qu'une application Java, je peux éditer le JTextField sans problème ...
ajouté l'auteur conorgriffin, source
S'il vous plaît poster un SSCCE : compilable, exécutable et capable de re-produire votre problème pour une meilleure aide plus tôt- monsieur Andrew Thompson ;)
ajouté l'auteur Sage, source
ne peut pas deviner ce qui se passe, juste quelques commentaires sans rapport: a) ne pas faire de dimensionnement/localisation manuelle des composants, jamais - c'est la responsabilité exclusive de LayoutManager b) ne pas utiliser un mouseListener de bas niveau pour le bouton, un actionListener est ce que vous voulez c) l'alias dbContext n'est pas synchronisé à tout moment (entre doctorDevice et doctorGU). Mais comme dit, rien de tout cela ne produirait le mauvais comportement que vous décrivez ...
ajouté l'auteur kleopatra, source

2 Réponses

Après des heures de recherche, ce paramètre ajouté pour exécuter les paramètres de configuration a résolu mon problème: -noSplash .

My eclipse settings:enter image description here

2
ajouté
Je suis content d'avoir aidé. :)
ajouté l'auteur Deximat, source
Je ne peux pas vous remercier assez pour ça !!! Je vous remercie! Je vous remercie! Je vous remercie! :RÉ
ajouté l'auteur Bogdan Habic, source

loginField.requestFocusInWindow ();

Essayez de demander le focus après que la fenêtre soit visible. (Appelez cette méthode après avoir appelé setVisible (true) dans la fenêtre qui contient ce champ.)

0
ajouté
Je vais essayer, mais voyez-vous une raison pour laquelle cela affecterait OS X et pas Windows?
ajouté l'auteur conorgriffin, source
Je ne suis pas sûr pourquoi cela se comporterait différemment .. Ma meilleure estimation serait la façon dont il a été mis en œuvre dans l'OS. Chaque système d'exploitation a sa propre façon de gérer les événements de l'interface utilisateur et il peut y avoir quelque chose qui ne va pas là-bas.
ajouté l'auteur Mad Piranha, source
Ma source d'informations ... docs.oracle.com/javase/tutorial /uiswing/misc/focus.html ... La fenêtre du composant doit être la fenêtre focalisée actuelle. Pour que cette demande soit accordée, une sous-classe de JComponent doit être visible, activée et focalisable, et avoir une table d'entrée pour que cette requête soit accordée.
ajouté l'auteur Mad Piranha, source