Я использую PopOver из библиотеки ControlsFX.Я успешно реализовал пользовательские макеты в PopOver в соответствии с дизайном, включая PieChart.Я заполнил данные на круговой диаграмме без проблем, и круговые фрагменты выглядят нормально, но при установке событий мыши на их фрагменты, таких как ввод мыши, нажатие мыши и т. Д., События не запускаются.
Чтобы дать вам код, ребятассылка, я сделал простое приложение FXML.
Sample.fxml
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.121" fx:controller="sample.Controller">
<center>
<Button fx:id="btn" mnemonicParsing="false" text="Button" BorderPane.alignment="CENTER" />
</center>
</BorderPane>
Controller.java
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.chart.PieChart;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import org.controlsfx.control.PopOver;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller implements Initializable {
@FXML
public Button btn;
@Override
public void initialize(URL location, ResourceBundle resources) {
PieChart pieChart = new PieChart();
pieChart.setData(getChartData());
pieChart.setPrefSize(200, 200);
pieChart.setMinSize(200, 200);
pieChart.setMaxSize(200, 200);
for (final PieChart.Data data : pieChart.getData()) {
Node node = data.getNode();
System.out.println("Check1"); // its working.
node.setOnMouseClicked(event -> {
System.out.println("Mouse Clicked!"); // not triggered.
});
node.setOnMouseEntered(event -> {
System.out.println("Mouse Entered!"); // not triggered.
});
node.setOnMouseExited(event -> {
System.out.println("Mouse Exited!"); // not triggered.
});
}
PopOver popOver = new PopOver(pieChart);
popOver.setPrefSize(500, 500);
btn.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
popOver.show(btn);
}
});
}
private ObservableList<PieChart.Data> getChartData() {
ObservableList<PieChart.Data> data = FXCollections.observableArrayList();
data.add(new PieChart.Data("A", 36));
data.add(new PieChart.Data("B", 36));
data.add(new PieChart.Data("C", 36));
data.add(new PieChart.Data("D", 36));
data.add(new PieChart.Data("E", 36));
data.add(new PieChart.Data("F", 36));
return data;
}
}
И основной класс как обычно.
Main.java
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 500, 500));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Здесь в этом коде всплывающее окно отображается при нажатии кнопки.Я надеюсь, что у вас, ребята, есть некоторые решения.
Заранее спасибо.