【问题标题】:Java fx combobox reset issueJavafx 组合框重置问题
【发布时间】:2014-04-08 14:28:49
【问题描述】:

当我尝试使用以下代码清除组合框时:

代码:

public class ComboController implements Initializable
{

@FXML
ComboBox firstcombobox=new ComboBox();
@FXML
ComboBox secondcombobox=new ComboBox();
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
    // TODO Auto-generated method stub
    firstcombobox.getItems().add("firabc");
    firstcombobox.getItems().add("firbcd");

    secondcombobox.getItems().add("seccde");
    secondcombobox.getItems().add("secdef");
}
@FXML
public void firstcomboboxAction()
{
    secondcombobox.getSelectionModel().clearSelection();
    secondcombobox.getItems().clear();
    System.out.println(firstcombobox.getSelectionModel().getSelectedItem());
}

public void secondcomboboxAction()
{
    System.out.println(secondcombobox.getSelectionModel().getSelectedItem());
    System.out.println("my name is vinay");
}

}

它会自动调用动作事件

首先我从第二个组合框中选择了“seccde” 然后我从第一个组合框中选择了“firabc”

我收到的输出是:

seccde
my name is vinay
null
my name is vinay
firabc

但它应该是:

seccde
my name is vinay

firabc  [with an empty firstcombobox]

Fxml:

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="application.ComboController">
<ComboBox fx:id="firstcombobox" onAction="#firstcomboboxAction"  >
<ComboBox fx:id="secondcombobox" onAction="#secondcomboboxAction" >

【问题讨论】:

  • 你想要什么?它完美无缺!
  • 我正在进行数据库搜索。当我尝试清除这些组合框时,它会自动调用其关联的操作,导致空指针错误,因为我已经删除了该搜索条件
  • 先显示你的整个代码!!
  • secondcomboboxAction() 不应该被调用
  • 但是如何调用这两种方法呢?你的 FXML 文件在哪里?

标签: java user-interface combobox javafx javafx-2


【解决方案1】:

输出正是您所期望的。

首先,您在第二个组合框中选择一些内容。这会调用第二个组合框的处理程序,并给出输出

seccde
my name is vinay

然后您在第一个组合框中选择一个项目。这会调用第一个组合框的处理程序。该组合框的处理程序首先清除第二个组合框中的所有项目,作为副作用将第二个组合框的 value 属性设置为 null。这会导致调用第二个组合框的操作处理程序,生成输出

null
my name is vinay

第二个组合框的处理程序然后生成输出

firabc

当然此时第二个组合框将没有任何项目。

这完全符合 ComboBox 的 Javadocs。特别是,docs for the onAction handler 将处理程序描述如下:

ComboBox 操作,每当 ComboBox 值时调用 属性变了。这可能是由于 value 属性是 以编程方式更改,当用户在弹出窗口中选择项目时 列表或对话框,或者,在可编辑组合框的情况下,可能是 用户提供自己的输入(通过 TextField 或一些 其他输入机制。

【讨论】:

    【解决方案2】:

    点击按钮事件后,使用此代码重置您的组合框。

    例如。

    yourresetbutton.setOnAction(new EventHandler<ActionEvent>() {
    
            @Override
            public void handle(ActionEvent t) { 
    
              firstcombobox.getSelectionModel().clearSelection();
              firstcombobox.getItems().clear();
    
              secondcombobox.getSelectionModel().clearSelection();
              secondcombobox.getItems().clear();
              }             
          });
    

    选中此项可重置组合框。

    谢谢..

    【讨论】:

    • 先生,首先将值设置为第二个组合框,不要在第一个组合框中选择值,然后尝试在第一个组合框操作中重置其值,它会自动调用第二个组合框操作
    【解决方案3】:

    我使用 changeListener 解决了这个问题。

    public class ComboController implements Initializable
    {
        @FXML
        ComboBox firstcombobox=new ComboBox();
        @FXML
        ComboBox secondcombobox=new ComboBox();
        @Override
        public void initialize(URL arg0, ResourceBundle arg1) 
        {
            // adding elements to comboboxes
            firstcombobox.getItems().add("firabc");
            firstcombobox.getItems().add("firbcd");
    
            secondcombobox.getItems().add("seccde");
            secondcombobox.getItems().add("secdef");
    
            // adding action to first combobox
            firstcombobox.getSelectionModel().selectedItemProperty()
                    .addListener(new firstcomboboxAction());
    
            // adding action to second combobox
            secondcombobox.getSelectionModel().selectedItemProperty()
                    .addListener(new secondcomboboxAction());
    
        }
    
    class firstcomboboxAction implements ChangeListener<String>
    {
        @Override
        public void changed(ObservableValue<? extends String> observable,String oldValue, String newValue) {
    
             if(newValue!=null)
             {
                      secondcombobox.getSelectionModel().clearSelection();
                      secondcombobox.getItems().clear();
                      System.out.println(firstcombobox.getSelectionModel().getSelectedItem());
             }
    }
    
    
    class secondcomboboxAction implements ChangeListener<String>
    {
        @Override
        public void changed(ObservableValue<? extends String> observable,String oldValue, String newValue) 
        {
            System.out.println(secondcombobox.getSelectionModel().getSelectedItem());
            System.out.println("my name is vinay");
        }
    }
    }
    

    FXML:

    <AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2"
    fx:controller="application.ComboController">
    <ComboBox fx:id="firstcombobox"  >
    <ComboBox fx:id="secondcombobox"  >
    

    输出:

    seccde
    my name is vinay
    
    firabc  [with an empty firstcombobox]
    

    【讨论】:

      猜你喜欢
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 2017-02-08
      • 2015-03-06
      相关资源
      最近更新 更多