मैं इसे संपादित करने के लिए इस JTextField में क्लिक नहीं कर सकता, क्यों नहीं?

अद्यतन करें

यह केवल तब होता है जब ओएस एक्स पर चल रहा है। यह समस्या विंडोज पर मौजूद नहीं है। मैं एक्लिप्स केप्लर और ओरेकल 1.7.0_45.jdk का उपयोग कर रहा हूं


नीचे दिया गया कोड एक मूल जीयूआई है जो ओएसजीआई घोषणात्मक सेवा घटक से चल रहा है। समस्या यह है कि जब जीयूआई लॉन्च होता है, तो मैं JTextField loginField से बातचीत नहीं कर सकता। मैं JButton loginButton से बातचीत कर सकता हूं। यदि मैं जावा एप्लिकेशन के समान कोड चलाता हूं तो मैं JTextField को इंटरैक्ट/संपादित कर सकता हूं। तो यह मुद्दा ओएसजीआई बंडल के रूप में लॉन्च होने के कारण होना चाहिए। क्या कोई इस मुद्दे पर कोई प्रकाश डाल सकता है?

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 - ओएसजीआई घटक परिभाषा

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

   
   

3
जोड़ा संपादित
विचारों: 2
मैंने उदाहरण अपडेट किया है, इसलिए यह स्पष्ट है कि इसे कैसे चलाया जाए। यह घोषणात्मक सेवाओं का उपयोग कर एक ओएसजीआई बंडल है। जब मैं जावा एप्लिकेशन के समान कोड लॉन्च करता हूं तो मैं JTextField कोई समस्या संपादित नहीं कर सकता ...
जोड़ा लेखक conorgriffin, स्रोत
कृपया एक SSCCE पोस्ट करें: संकलित, चलाने योग्य और जल्द से जल्द आपकी सहायता के लिए अपनी समस्या का पुन: उत्पादन करने में सक्षम- सर एंड्रयू थॉम्पसन </कोड>;)
जोड़ा लेखक Sage, स्रोत
अनुमान लगाया जा सकता है कि क्या हो रहा है, केवल कुछ असंबद्ध टिप्पणियां: ए) किसी भी मैन्युअल आकार/घटकों का पता लगाना न करें - यह लेआउटमैनेजर की विशेष ज़िम्मेदारी है b) बटन के लिए लोलेवल माउस लिस्टर का उपयोग न करें, एक एक्शन लिस्टनर वह है जो आप चाहते हैं सी) एलियाज्ड डीबीकॉन्टेक्स्ट हर समय सिंक में नहीं रखा जाता है (डॉक्टर डेविस और डॉक्टरगु के बीच)। लेकिन जैसा कि कहा गया है, इनमें से कोई भी आपके द्वारा वर्णित गलत व्यवहार का उत्पादन नहीं करेगा ...
जोड़ा लेखक kleopatra, स्रोत

2 उत्तर

कॉन्फ़िगरेशन पैरामीटर चलाने के लिए जोड़े गए इस पैरामीटर को शोध करने के घंटों के बाद मेरी समस्या ठीक हुई: -noSplash

My eclipse settings:enter image description here

2
जोड़ा
मुझे खुशी है कि मैंने मदद की। :)
जोड़ा लेखक Deximat, स्रोत
मैं इसके लिए आपको धन्यवाद नहीं दे सकता !!! धन्यवाद! धन्यवाद! धन्यवाद! : डी
जोड़ा लेखक Bogdan Habic, स्रोत

loginField.requestFocusInWindow ();

खिड़की दिखाई देने के बाद फोकस का अनुरोध करने का प्रयास करें। (इस फ़ील्ड में विंडो पर सेट (दृश्य) को कॉल करने के बाद इस विधि को कॉल करें।)

0
जोड़ा
मैं इसे आज़माउंगा लेकिन क्या आपको कोई कारण दिखता है कि यह ओएस एक्स को प्रभावित करेगा, न कि विंडोज़?
जोड़ा लेखक conorgriffin, स्रोत
मुझे यकीन नहीं है कि यह अलग तरीके से क्यों व्यवहार करेगा .. मेरा सबसे अच्छा अनुमान ओएस में लागू किया गया तरीका होगा। प्रत्येक ओएस का यूआई कार्यक्रमों को संभालने का अपना तरीका होता है और वहां कुछ गलत हो सकता है।
जोड़ा लेखक Mad Piranha, स्रोत
जानकारी का मेरा स्रोत ... docs.oracle.com/javase/tutorial /uiswing/misc/focus.html ..._ घटक की विंडो वर्तमान केंद्रित विंडो होना चाहिए। इस अनुरोध के लिए JComponent का उप-वर्ग दिया जाना चाहिए, दृश्य, सक्षम और केंद्रित होना चाहिए, और इस अनुरोध के लिए एक इनपुट मानचित्र दिया जाना चाहिए _...
जोड़ा लेखक Mad Piranha, स्रोत