2015-05-14 6 views
5

मैं उम्मीद कर रहा था कि जब मैं Alt + mnemonic का उपयोग करता हूं कि संबंधित रेडियो बटन केंद्रित और चयनित हो जाएगा। मेरी अपेक्षाएं स्विंग में कैसे काम करती हैं, इस बारे में मेरे ज्ञान पर आधारित हैं। क्या मेरी उम्मीद गलत है?रेडियो बटनों के साथ मनोनीत कैसे काम करते हैं

नीचे दिए गए मेरे उदाहरण कोड में मैंने प्रत्येक रेडियो बटन की संख्या को स्नेही होने के लिए सेट किया है।

  1. प्रोग्राम प्रारंभ होने पर "विकल्प 1" चुना जाता है।
  2. जब मैं Alt + 3 का उपयोग करता हूं, तो प्रोग्राम मेरे ऊपर बीप करता है, सभी निमोनिक्स रेखांकित हो जाते हैं और "विकल्प 3" केंद्रित हो जाता है लेकिन चयनित नहीं होता है। जीयूआई अब इस तरह दिखता है:

http://i.stack.imgur.com/ip3om.png

  1. मैं सिर्फ टाइप 2, "विकल्प 2 ध्यान केंद्रित हो जाता है, लेकिन नहीं चयनित

यहाँ। कोड है:

import javafx.application.Application; 
import javafx.stage.Stage; 
import javafx.scene.*; 
import javafx.scene.control.*; 
import javafx.scene.layout.*; 
import javafx.scene.image.*; 
import javafx.scene.input.*; 
import javafx.scene.effect.*; 
import javafx.scene.paint.*; 
import javafx.beans.value.*; 
import javafx.geometry.*; 

import javafx.event.*; 

public class RadioButtonSSCCE extends Application 
{ 
    public Parent createScene() 
    { 
     ToggleGroup group = new ToggleGroup(); 

     RadioButton rb1 = new RadioButton("Option _1"); 
     rb1.setUserData("Option 1 selected"); 
     rb1.setToggleGroup(group); 

     RadioButton rb2 = new RadioButton("Option _2"); 
     rb2.setUserData("Option 2 selected"); 
     rb2.setToggleGroup(group); 

     RadioButton rb3 = new RadioButton("Option _3"); 
     rb3.setUserData("Option 3 selected"); 
     rb3.setToggleGroup(group); 

     VBox root = new VBox(5); 
     root.setAlignment(Pos.CENTER); 
     root.getChildren().addAll(rb1, rb2, rb3); 

     ChangeListener<Toggle> cl = new ChangeListener<Toggle>() 
     { 
      @Override 
      public void changed(ObservableValue<? extends Toggle> ov, Toggle old_toggle, Toggle new_toggle) 
      { 
       if (group.getSelectedToggle() != null) 
       { 
        String text = group.getSelectedToggle().getUserData().toString(); 
        System.out.println(text); 
       } 
      } 
     }; 
     group.selectedToggleProperty().addListener(cl); 

     rb1.setSelected(true); 

     return root; 
    } 

    @Override 
    public void start(Stage primaryStage) 
    { 
     Scene scene = new Scene(createScene(), 125, 125); 
     primaryStage.setScene(scene); 
     primaryStage.setTitle("Radio Button SSCCE"); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) 
    { 
     launch(args); 
    } 
} 

मैं ने पाया है कि आदेश स्मरक आह्वान करने के लिए में मैं करने के लिए है:

  1. दबाएं और Alt कुंजी को छोड़ दें। अब प्रत्येक रेडियो बटन की नींबू रेखांकित है।
  2. संख्या दबाएं और रेडियो बटन केंद्रित हो जाता है। हालांकि, अब मुझे रेडियो बटन का चयन करने के लिए स्पेस बार का उपयोग करने की आवश्यकता है।

मुझे स्पेस बार को दबाए जाने की आवश्यकता क्यों है? क्या मनमोहक दबाए जाने पर रेडियो बटन का चयन नहीं किया जाना चाहिए?

इसके अलावा, मैं रेडियो बटन का चयन करने के लिए केवल एक कुंजी संयोजन के रूप में Alt + mnemonic का उपयोग क्यों नहीं कर सकता?

क्या मेरा कोड गलत है?

संपादित करें:

कार्रवाई रेडियो बटन का चयन करने के लिए महत्वपूर्ण है।

EventHandler<ActionEvent> onAction = new EventHandler<ActionEvent>() 
{ 
    @Override 
    public void handle(ActionEvent e) 
    { 
     RadioButton button = (RadioButton)e.getSource(); 
     button.setSelected(true); 
    } 
}; 

rb1.setOnAction(onAction); 
rb2.setOnAction(onAction); 
rb3.setOnAction(onAction); 

के बाद से रेडियो बटन एक बटन समूह का हिस्सा हैं मैं एक बटन को अचयनित करने की क्षमता नहीं करना चाहता था: मैं एक सामान्य कार्रवाई सभी बटन द्वारा साझा किया जा करने के लिए बनाया।

+1

आप ऐसा लगता है कि आप अंधेरे तरफ गए हैं। ;) –

+1

ऐसा लगता है कि निमोनिक्स रेडियो बटन पर कार्रवाई की घटनाओं को निकाल दिया जाता है, लेकिन यह वास्तव में चयन को बदलने के लिए मजबूर नहीं करता है (मैं सीधे परीक्षण नहीं कर सकता, क्योंकि यह मेरे बारे में कुछ भी नहीं पहचानता है मैक "Alt" के रूप में)। ऐसा लगता है कि चयन को बदलने के लिए प्रतीत नहीं होता है ... यह एक बग हो सकता है। –

+0

@James_D यह JavaFX 2.2 और JavaFX 8 में इस तरह से कार्य करता है, इसलिए यह इरादा प्रतीत होता है। 'चेकबॉक्स' वैसे ही काम करता है। – OttPrime

उत्तर

2

जावाएफएक्स में Mnemonic पंजीकृत Node पर ActionEvent को लक्षित करता है। RadioButton के मामले में, एक्शनवेन्ट चयन टॉगल नहीं करता है। आप इस तरह एक्शनवेन्ट पर टॉगल करने के लिए RadioButton पर एक सामान्य हैंडलर जोड़ सकते हैं (मान लें कि यह जावाएफएक्स 8 है)।

rb1.setOnAction(event -> rb1.setSelected(!rb1.isSelected())); 
+0

धन्यवाद। 'रेडियोबटन के मामले में, एक्शनवेन्ट चयन को टॉगल नहीं करता है।' - मुझे "लापता फीचर" जैसा लगता है। जब मैं 'मेनू' पर एक नींबू का उपयोग करता हूं, तो मेनू बिना किसी अतिरिक्त कोड के पॉप अप करता है। साथ ही, मुझे कोई विचार क्यों है कि मुझे दो प्रमुख स्ट्रोक का उपयोग करना है? 1) अनन्य वर्णित मनोनीत चरित्र को पेंट करने के लिए Alt दबाएं/रिलीज़ करें 2) कार्रवाई को आमंत्रित करने के लिए स्मारक चरित्र दबाएं। यह किसी भी विंडोज़ ऐप या विंडोज़ पर स्विंग ऐप में पहले कभी भी किया गया है। मैं अपने कंप्यूटर के बिना मेरे कंप्यूटर पर Alt + mnemonic का उपयोग क्यों नहीं कर सकता, एक महत्वपूर्ण स्ट्रोक है? – camickr

+0

दुर्भाग्य से, मुझे नहीं लगता कि यह आपके लिए एक अच्छा समाधान है। निरंतर परीक्षण मुझे दिखा रहा है कि 'रेडियोबटन' पर क्लिक करना सटीक रूप से इसका चयन नहीं कर रहा है। जहां तक ​​निमोनिक कुंजी संयोजन मुद्दा है, मुझे इसका अनुभव नहीं होता है। मैं संयुक्त स्ट्रोक में Alt + 1 का उपयोग करके कार्रवाई को ट्रिगर कर सकता हूं। हालांकि, ट्रिगर के बाद स्क्रीन पर निमोनिक अंडरलाइन स्क्रीन पर रहती है। – OttPrime

+0

समाधान मेरे लिए ठीक काम किया। मेरी कार्रवाई में मैंने हमेशा रेडियो बटन चुना है और मुझे कोई समस्या नहीं दिखाई देती है, यह हमेशा चयनित और केंद्रित होती है। जब मैं Alt + 1 (और निमोनिक रहता है) का उपयोग करता है तो कार्रवाई ट्रिगर हो जाती है, लेकिन मुझे एक बीपिंग ध्वनि भी मिलती है जैसे त्रुटि उत्पन्न होती है। एक स्विंग ऐप की तरह और आप एक खाली JTextField पर हटाएं कुंजी का उपयोग करें (एक खाली जावाएफएक्स टेक्स्टफिल्ड यह ध्वनि नहीं बनाता है)। आश्चर्य है कि यह एक मंच मुद्दा है। मैं विंडोज 7 का उपयोग कर रहा हूं। – camickr

3

OttPrime उसके जवाब में और Mnemonic जावाडोक में नोटों के रूप में:

एक Mnemonic एक Scene पर पंजीकृत किया जाता है, और KeyCombinationScene unconsumed, तो लक्ष्य Node भेजा जाएगा एक तक पहुँच जाता है ActionEvent

अब मुझे लगता है कि यह कोई मुद्दा की तरह है, क्योंकि आप नहीं है वास्तव में केवल एक ActionEvent रेडियो बटन के लिए भेजा करना चाहते हैं, इसके बजाय आप रेडियो बटन fire() करना चाहते हैं।

रेडियो बटन की स्थिति को टॉगल करता है अगर केवल और यदि रेडियोबटन पहले से ही नहीं चुना गया है या टॉगल समूह का हिस्सा नहीं है।

नोट: एक रेडियो बटन फायर करने से बटन पर ActionEvent भी भेजा जाएगा।

यहाँ के लिए Button::fire

@Override public void fire() { 
    if (!isDisabled()) { 
     fireEvent(new ActionEvent()); 
    } 
} 

जावा 8u40 कोड है यहाँ ToggleButton::fire

@Override public void fire() { 
    // TODO (aruiz): if (!isReadOnly(isSelected()) { 
    if (!isDisabled()) { 
     setSelected(!isSelected()); 
     fireEvent(new ActionEvent()); 
    } 
} 

के लिए कोड यहाँ है और के लिए RadioButton::fire

@Override public void fire() { 
    // we don't toggle from selected to not selected if part of a group 
    if (getToggleGroup() == null || !isSelected()) { 
     super.fire(); 
    } 
} 

नोट कोड है: RadioButton है एक टॉगल बटन, तो super.fire() कॉल वें आह्वान करेगा ई टॉगल बटन आग() कोड।

तो, बटन के लिए एक नींबू ठीक होगा: सभी निमोनिक बटन पर एक एक्शनवेन्ट भेज रहा है (जो बटन के लिए आग कार्यान्वयन के समान है)। हालांकि, ToggleButtons और RadioButtons टॉगलबटन की चयन स्थिति में हेरफेर करने के लिए अपनी अग्नि विधियों में अतिरिक्त सामान करते हैं, इसलिए निमोनिक इनवॉक्शन ऐसा नहीं करने जा रहे हैं। जहाँ तक

rb1.setOnAction(event -> rb1.setSelected(!rb1.isSelected())); 

यह है जब आप एक स्मरक के माध्यम से बटन का चयन बहुत अच्छा होगा, लेकिन (के रूप में मैं देख सकते हैं:

अब, आप कह सकते हैं, अच्छी तरह से तो कोई बात नहीं, मैं सिर्फ OttPrime के वैकल्पिक हल को लागू करेंगे), यह बटन चयन के लिए अन्य कार्यक्षमता को तोड़ देगा (उदाहरण के लिए, यदि आप रेडियो बटन को प्रोग्रामेटिक रूप से आग लगाते हैं और संभवतः, यदि आप माउस के साथ रेडियो बटन पर क्लिक करते हैं)। ऐसा इसलिए है क्योंकि बटन की चयन स्थिति दो बार बदल जाएगी (एक बार आग() कोड में और फिर आपके एक्शन कोड में) और शायद आप इसे नहीं चाहते हैं। दुर्भाग्य से, मैं वास्तव में इस सिद्धांत का परीक्षण नहीं कर सकता क्योंकि मेरे पास ऐसी मशीन तक पहुंच नहीं है जो निमोनिक्स का उपयोग कर सके।

तो, अपने मूल प्रश्न "मॉनिमोनिक्स रेडियो बटन के साथ कैसे काम करते हैं" का जवाब देने के लिए? => वे नहीं (कम से कम आईएमओ में, किसी भी तरह से वास्तव में समझ में नहीं आता है)।

मैं रेडियो बटन और टॉगल बटन के लिए केवल disabling Mnemonic parsing सलाह दूंगा।

+0

कोड जो मैंने अपने संपादन में पोस्ट किया है, बस सेट सेलेक्टेड (सत्य) का उपयोग करता है। चूंकि मैं एक समूह में अपने रेडियो बटन का उपयोग कर रहा हूं, इसलिए मैं सिर्फ निमोनिक के साथ बटन चुनना चाहता हूं। ऐसा लगता है कि इस दृष्टिकोण का उपयोग कर, या आग() विधि का उपयोग कर काम करता है। हालांकि, मैंने आगे परीक्षण किया (आपकी टिप्पणियों के आधार पर)। जब कोई बटन टॉगल समूह से संबंधित नहीं होता है तो माउस का उपयोग शुरू करते समय समस्याएं होती हैं। कभी-कभी बटन एक ही स्थिति में रहता है, और कभी-कभी मुझे अपवाद मिलता है। मैं मानता हूं कि यह जिस तरह से मैं उम्मीद करता हूं वह काम नहीं करता है। (+1) – camickr

+0

क्या आपको पता है कि माउस के साथ रेडियो बटन पर क्लिक करने से बटन की स्थिति बदल जाती है? यह महत्वपूर्ण नहीं है, मैंने अभी जावाएफएक्स के साथ खेलना शुरू कर दिया है और उत्सुक हूं। मैंने स्रोत को देखने की कोशिश की लेकिन मैं नहीं देख सकता कि घटनाओं को कैसे प्रबंधित किया जाता है। यदि आप कक्षा को देखने के लिए जानते हैं तो यह बहुत अच्छा होगा। – camickr

+0

मैं मानता हूं कि यह सामान्य रूप से अधिक सही समाधान है। मैंने जवाब दिया कि मैंने अपना जवाब पोस्ट करने के बाद माउस क्लिक किया था। – OttPrime

संबंधित मुद्दे