【问题标题】:radio button to enable text area启用文本区域的单选按钮
【发布时间】:2014-11-29 05:13:54
【问题描述】:

我对 Java 还是很陌生,并且一直在尝试弄清楚如果现在选择了单选按钮,如何启用文本区域进行编辑。我一直在谷歌搜索和阅读各种论坛上的帖子,但是我不明白他们在做什么,也不知道如何在我的程序中这样做。

这是我目前所拥有的:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package labscheduler;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.*;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 *
 * @author S02105032
 */
public class FXMLLabSchedulerDocController implements Initializable {

    @FXML
    private TextField txtRequestorName;
    @FXML
    private TextField txtRequestorEmail;
    @FXML
    private TextField txtEventTitle;
    @FXML
    private TextField txtNumParticipants;
    @FXML
    private TextField txtEventDate;
    @FXML
    private TextField txtStartTime;
    @FXML
    private TextField txtEndTime;
    @FXML
    private ToggleButton togStartTime;
    @FXML
    private ToggleButton togEndTime;
    @FXML
    private CheckBox chkPrinter;
    @FXML
    private RadioButton rbYes;
    @FXML
    private RadioButton rbNo;
    @FXML
    private TextArea txtareaMessage;

    private String requestorName;
    private String requestorEmail;
    private String eventTitle;
    private int participants = 0;
    private Date eventDate;  
    private Date startTime;  
    private Date endTime;  
    private String printer;
    private String message;

    @FXML
    private void handleBtnSubmit(ActionEvent event) {
        requestorName = txtRequestorName.getText();
        requestorEmail = txtRequestorEmail.getText();
        eventTitle = txtEventTitle.getText();
        participants = Integer.parseInt(txtNumParticipants.getText());

        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/YY");
        try {
            eventDate = sdf.parse(txtEventDate.getText());
        } catch (ParseException ex) {
            System.out.println("invalid date format");
        }

        SimpleDateFormat stdf = new SimpleDateFormat("hh:mm");
        try {
            startTime = stdf.parse(txtStartTime.getText());
        } catch (ParseException ex) {
            System.out.println("invalid start time format");
        }

        SimpleDateFormat etdf = new SimpleDateFormat("hh:mm");
        try {
            endTime = etdf.parse(txtEndTime.getText());
        } catch (ParseException ex) {
            System.out.println("invalid end time format");
        }

        if(chkPrinter.isSelected()) {
            printer = "printer requested";
        }
        else {
            printer = "no printer needed";
        }

        if(rbYes.isSelected() && !rbNo.isSelected()) {
            txtareaMessage.setEditable(true);
            message = txtareaMessage.getText();
        }
        else {
            txtareaMessage.setEditable(false);
            message = "None";
        }

    }

    @FXML
    private void handleButtonClose(ActionEvent event) {
        System.out.println("Application Close!");
        Platform.exit();
    }

    @FXML
    private void handleButtonClear(ActionEvent e) {
        System.out.println("Clear All Fields!");
        txtRequestorName.setText("");
        txtRequestorEmail.setText("");
        txtEventTitle.setText("");
        txtNumParticipants.setText("");
        txtEventDate.setText("");
        txtStartTime.setText("");
        txtEndTime.setText("");
        chkPrinter.setSelected(false);
        rbYes.setSelected(false);
        rbNo.setSelected(false);
        txtareaMessage.setText("");
    }

    // Radio Buttons need to be set to group so only one can be selected at a time
    // If Radio Btn Yes is checked, enable txt area message, else disable
    // Set Toggle Buttons to toggle between AM & PM

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    

}

当我选择任一单选按钮时,它似乎没有使文本区域可编辑。

【问题讨论】:

  • 请去掉不相关的方法和字段,以减少无用代码的数量。另外,具体哪个方法分配给了哪个组件,仅仅通过查看是无法判断的(您也可以显示相关的 FXML 代码)。

标签: java javafx radio-button


【解决方案1】:

JavaFX 控件的状态由observable properties 表示。所以RadioButton 有一个selectedPropertyTextArea 有一个editableProperty。您可以使用通常的 set/get(或 set/is)方法设置和检索这些值:txtareaMessage.setEditable(rbYes.isSelected()),您还可以观察它们的变化:

rbYes.selectedProperty().addListener(...);

或者您可以将一个属性的值绑定到另一个属性的值。绑定本质上只是用一个属性注册一个监听器,并在观察到的属性发生变化时更新另一个属性。

在您的情况下,逻辑非常简单(文本区域的可编辑属性的值应该与单选按钮的选定属性的值相同),因此您只需在initialize() 中建立一个简单的绑定即可方法:

txtareaMessage.editableProperty().bind(rbYes.selectedProperty());

【讨论】:

    【解决方案2】:
        if(rbYes.isSelected() && !rbNo.isSelected()) {
            txtareaMessage.setEditable(true);
            message = txtareaMessage.getText();
        }
        else {
            txtareaMessage.setEditable(false);
            message = "None";
        }
    


    那段代码在您的按钮 (handleBtnSubmit) 的 ActionListener 内,因此据我了解,您需要在单选按钮上使用 ActionListener 来触发上述代码。

    【讨论】:

      【解决方案3】:
      1. 像这样创建一个 ToggleGroup。

        final ToggleGroup group = new ToggleGroup();
        
      2. 将单选按钮添加到“组”。

        RadioButton yes = new RadioButton("yes");   
        yes.setToggleGroup(group);
        
        RadioButton no= new RadioButton("no");    
        no.setToggleGroup(group);
        
      3. 检查是否选择了“是”单选按钮。

         yes.setOnAction(new EventHandler<ActionEvent>() {
         @Override
         public void handle(ActionEvent actionEvent) {
             if(yes.isSelected()){
                  textField.setEnabled(true);
        
             }else{
                  textField.setEnabled(false);
             }
           }
        });
        

      【讨论】:

        猜你喜欢
        • 2016-10-30
        • 2012-03-13
        • 1970-01-01
        • 2017-02-05
        • 2015-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-05
        相关资源
        最近更新 更多