当前位置: 首页 > 知识库问答 >
问题:

用组合框更改面板

皇甫文乐
2023-03-14

我想创建用于切换面板的组合框。例如,我想创建几个不同颜色的面板,并使用组合框,我只想让一个面板可见:

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class MainApp extends Application
{
    @Override
    public void start(Stage primaryStage)
    {
        final ComboBox comboBox = new ComboBox();
        comboBox.getItems().addAll(
            "Bar Chart",
            "Pie Chart");
        comboBox.setValue("Bar Chart");

        final Label label = new Label();

        final StackPane stack = new StackPane();

        Button btn = new Button();
        btn.setText("Read comboBox");
        btn.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent event)
            {
                label.setText("selectd: " + comboBox.getValue());
                stack.getChildren();
            }
        });        

        stack.getChildren().add(0, new Rectangle(100,100,Color.BLUE));
        stack.getChildren().add(1, new Rectangle(100,100,Color.GREEN));

        VBox vBox = new VBox();
        vBox.setPadding(new Insets(5, 5, 5, 5));
        vBox.setSpacing(5);
        vBox.getChildren().addAll(label, comboBox, btn);

        StackPane root = new StackPane();
        root.getChildren().add(vBox);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

你能帮我与代码,这将用于切换可见面板见解组合框更改侦听器。

共有2个答案

富钧
2023-03-14

试试这个:

public class MainApp extends Application {
  @Override
  public void start(Stage primaryStage) {
    Rectangle blueRectangle = new Rectangle(100,100, Color.BLUE);
    Rectangle grinRectangle = new Rectangle(100,100, Color.GREEN);

    StackPane stackPane = new StackPane();
    stackPane.getChildren().add(0, blueRectangle);
    stackPane.getChildren().add(1, grinRectangle);

    ComboBox<String> comboBox = new ComboBox<>();
    comboBox.getItems().addAll("Blue rectangle", "Green rectangle");
    comboBox.setValue("Green rectangle");
    comboBox.setOnAction(e -> {
      switch (comboBox.getValue()) {
        case "Blue rectangle":
          blueRectangle.toFront();
          break;
        case "Green rectangle":
          grinRectangle.toFront();
          break;
      }
    });

    VBox vBox = new VBox();
    vBox.setAlignment(Pos.CENTER);
    vBox.setPadding(new Insets(5, 5, 5, 5));
    vBox.setSpacing(10);
    vBox.getChildren().addAll(comboBox, stackPane);

    Scene scene = new Scene(vBox, 300, 250);
    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
  }

  public static void main(String[] args) {
    launch(args);
  }
}
易琛
2023-03-14

有很多方法可以实现这一点,您可以通过@Vitomir将ComboBox的值硬编码到switch case

这里还有一个示例,它认为矩形的添加到StackPane的顺序与值添加到ComboBox的顺序相同,无论何时选择组合框(或选择并按下按钮),选定的矩形都是可见的,其余的都是不可见的。

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class ComboBoxIssue extends Application {
    @Override
    public void start(Stage primaryStage) {
        final ComboBox comboBox = new ComboBox();
        comboBox.getItems().addAll("Show Blue", "Show Green");

        final Label label = new Label();

        final StackPane stack = new StackPane();

        Button btn = new Button();
        btn.setText("Read comboBox");

        /**
         * Uncomment this to run on button selection
         * 
         */
        /*btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                setVisibility(stack, comboBox, label);
            }
        });*/


        comboBox.getSelectionModel().selectedIndexProperty()
                .addListener((ObservableValue<? extends Number> observable,
                            Number oldValue, Number newValue) ->
                        setVisibility(stack, comboBox, label)
        );

        stack.getChildren().add(new Rectangle(100, 100, Color.BLUE));
        stack.getChildren().add(new Rectangle(100, 100, Color.GREEN));

        // Placing it after adding rectangle to stack
        // will trigger the changelistener to show default rectangle
        comboBox.setValue("Show Blue");

        VBox vBox = new VBox();
        vBox.setPadding(new Insets(5, 5, 5, 5));
        vBox.setSpacing(5);
        vBox.getChildren().addAll(label, comboBox, btn, stack);

        StackPane root = new StackPane();
        root.getChildren().add(vBox);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    public void setVisibility(Pane pane, ComboBox comboBox, Label label) {

        //Set Label
        label.setText("selectd: " + comboBox.getValue());

        // Make all children invisible
        for (Node node : pane.getChildren()) {
            node.setVisible(false);
        }
        // make the selected rectangle visible
        int selectedIndex = comboBox.getSelectionModel()
                .selectedIndexProperty().getValue();
        pane.getChildren().get(selectedIndex).setVisible(true);

    }

    public static void main(String[] args) {
        launch(args);
    }
}
 类似资料:
  • 我有一个雇主组合。选择雇主后,表格中会填入特定于雇主的数据: 下面是它绑定到的属性和检查表是否脏的方法。如果表是脏的,则提示用户如果他们改变雇主,改变将丢失: 一切似乎都正常工作: 用户选择更新表的雇主('KMH')。 用户对表进行更改。 用户然后选择不同的雇主('MPC') 提示用户更改将丢失 用户选择“否”并且Can火雇主返回“假” 选择雇主不改变(跳过if{}块) 然而,在GUI中,雇主选项

  • 问题内容: 在对话框中,如果选中了某个组合,则需要显示一组控件,否则显示另一组控件。即我需要2层,并且当组合被选中/未选中时,我需要在它们之间切换。我怎样才能做到这一点? 问题答案: CardLayout 为此,如下所示。

  • 我有一个带有组合框的xaml。由于某种原因,我在那里有一些项目,我不能选择它们,当我选择一个项目时,它通常不允许我更改我的选择,如果它更改了,它仅适用于某些值。这是代码: 我希望我写的很清楚,因为我把它从电脑复制到了手机上。基本上,我有所有的用户,并按部门对他们进行分类。用户只能看到他所在部门的文档,并且可以选择绑定词典中可用的文档。如果不可用,组合框中的项目将为红色且不可检查。这个管用。唯一没有

  • 几个小时寻找答案后,我终于放弃了。我有一个包含以下组合框的FXML表单: 它注入到 JavaFX 控制器类中: 该组合显示了使用Eclipselink 2.7和JPA 2.2从嵌入式H2数据库加载的Tobra(在西班牙语中代表Tipo de Obra)列表。 我不会向用户展示Tobra的价值。toString,相反,我在初始化中设置了一个转换器: 我有一个实现<code>Task的内部类 当然,当

  • 我在一个表单中有两个组合框。 当combobox 2中的列表更新时,我希望combobox 1中选定的值发生变化。 例如:ComboBox1 包含移动公司的名称,ComboBox2 包含该公司所有移动电话的列表。

  • 我有两个组合框。我正在填充这样的两个组合框。组合框1和2的名称是cmbpartyName和cmbprefPT2。 在这里,我从combox1中选择一个值,在它所选的索引更改事件中,如下所示。 由于两个组合框具有相同的值,如何从第二个组合框cmbPrefPT2中删除第一个组合框的选定值?