多个按钮点击效果处理

Multiple buttons click effect handling

我想询问有关使用 JavaFX 处理两个(或更多)按钮的问题。 在我的项目中,我有两个切换按钮。我想在按下时为其中一个分配样式(绿色圆形边框)。当我点击另一个按钮时,我想删除第一个按钮的样式并将其移至第二个按钮。目前,我有两个按钮同时显示为“按下”的情况(附图)。 请问如何避免这种情况。下面是我的控制器文件中的代码:

public void oneButton()
{
ToggleButton btn1=new ToggleButton();

    btn1.getStyleClass().add(".toggle-button:selected");
    


}
public void twoButton()
{
ToggleButton btn2=new ToggleButton();

    btn2.getStyleClass().add(".toggle-button:selected");
        
}
}

怎么样:

ToggleGroup toggleGroup = new ToggleGroup();
ToggleButton toggleButton1 = new ToggleButton("Left");
ToggleButton toggleButton2 = new ToggleButton("Right");

toggleButton1.setToggleGroup(toggleGroup);
toggleButton2.setToggleGroup(toggleGroup);

应该允许您将多个按钮添加到切换组,并且应该在选择另一个按钮时清除未选择按钮的样式。

您可以使用 ToggleGroup:

A class which contains a reference to all Toggles whose selected variables should be managed such that only a single Toggle within the ToggleGroup may be selected at any one time [...] (docs).

ToggleGroupExampleApp.java:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;


public class ToggleGroupExampleApp extends Application {

    @Override
    public void start(Stage stage) {

        // Create the toggle buttons:
        ToggleButton firstToggleButton = new ToggleButton("First Toggle Button"),
                secondToggleButton = new ToggleButton("Second Toggle Button");

        // Create a toggle group so only one toggle button can be selected at a time:
        ToggleGroup toggleGroup = new ToggleGroup();

        // Add the buttons to the toggle group:
        firstToggleButton.setToggleGroup(toggleGroup);
        secondToggleButton.setToggleGroup(toggleGroup);

        // Create a container:
        VBox vBox = new VBox(firstToggleButton, secondToggleButton);

        // Load a css file:
        vBox.getStylesheets().add(ToggleGroupExampleApp.class.getResource("styling.css").toExternalForm());

        // Prepare and show stage:
        stage.setScene(new Scene(vBox, 200, 100));
        stage.show();
    }

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

出于样式目的,您可以使用已经可用的选定伪class。

styling.css:

.toggle-button {
    -fx-border-radius: 10;
    -fx-background-radius: 10;
    -fx-border-width: 2;
    -fx-pref-width: 180;
    -fx-pref-height: 35;
}
.toggle-button:selected {
    -fx-border-color: green;
}
VBox {
    -fx-spacing: 10;
    -fx-padding: 10;
}

编辑(添加了 FXML 文件和控制器 class 的变体):

Controller.class:

package org.example;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;

import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable {

    @FXML
    private ToggleButton
            firstToggleButton,
            secondToggleButton;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // Create a toggle group so only one toggle button can be selected at once:
        ToggleGroup toggleGroup = new ToggleGroup();

        // Add the buttons to the toggle group:
        firstToggleButton.setToggleGroup(toggleGroup);
        secondToggleButton.setToggleGroup(toggleGroup);
    }
}

main.fxml:

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.ToggleButton?>
<?import javafx.scene.layout.VBox?>

<VBox spacing="10.0" stylesheets="@styling.css" xmlns="http://javafx.com/javafx/11.0.1"
      xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.example.Controller">
    <padding>
        <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
    </padding>
    <ToggleButton fx:id="firstToggleButton" mnemonicParsing="false" prefHeight="35.0" 
                  prefWidth="150.0" text="First Toggle Button">
    </ToggleButton>
    <ToggleButton fx:id="secondToggleButton" mnemonicParsing="false" prefHeight="35.0" 
                  prefWidth="150.0" text="Second Toggle Button">
    </ToggleButton>
</VBox>

styling.css:

.toggle-button {
    -fx-border-radius: 10;
    -fx-background-radius: 10;
    -fx-border-width: 2;
}
.toggle-button:selected {
    -fx-border-color: green;
}

ToggleGroupExampleApp.java:

package org.example;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;


public class ToggleGroupExampleApp extends Application {

    @Override
    public void start(Stage stage) throws IOException {
        FXMLLoader loader = new FXMLLoader(ToggleGroupExampleApp.class.getResource("main.fxml"));
        stage.setScene(new Scene(loader.load()));
        stage.show();
    }

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