Bildschirmleser kann nicht Text von Javafx Desktop -Anwendung lesen, die in Java Swing integriert sind
Posted: 24 Feb 2025, 11:13
Wir haben eine Java -Swing -Desktop -Anwendung und haben einige Seiten mit Javafx und für ein besseres UI -Design und integrierte Javafx mit JFXPanel als Brücke für Java Swing aktualisiert. Integration erfolgreich gemacht, aber Bildschirmleser kann Javafx -Komponenten Text und Beschreibung nicht lesen. Wir haben bereits alle Accessibility -Text und Beschreibung hinzugefügt, aber dennoch den Bildschirmleser wie NVDA kann die Javafx -Seite nicht lesen. Können Sie bitte helfen und eine Lösung vorschlagen, wie wir damit fortfahren können?
Code: Select all
package org.example.javafx.hellojavafx;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.AccessibleRole;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.BorderPane;
import org.controlsfx.control.PopOver;
import javax.swing.*;
import java.awt.*;
public class AccessiblePaneExample {
public static void main(String[] args) {
System.setProperty("javafx.accessible.force", "true");
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("Accessible Pane Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setLayout(new BorderLayout());
JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel, BorderLayout.CENTER);
Platform.runLater(() -> initFX(fxPanel));
frame.setVisible(true);
});
}
private static void initFX(JFXPanel fxPanel) {
// Button
Button button = new Button("Click Me");
button.setAccessibleRole(AccessibleRole.BUTTON);
button.setAccessibleRoleDescription("A button that can be clicked");
button.setAccessibleHelp("Clickable Button");
// ComboBox
ComboBox comboBox = new ComboBox();
comboBox.getItems().addAll("Item 1", "Item 2", "Item 3", "Item 4");
comboBox.setAccessibleRole(AccessibleRole.COMBO_BOX);
comboBox.setAccessibleRoleDescription("A combo box for selecting items");
comboBox.setAccessibleHelp("Item Selection ComboBox");
// BarChart
final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis();
final BarChart barChart = new BarChart(xAxis, yAxis);
barChart.setTitle("Item Summary");
xAxis.setLabel("Item");
yAxis.setLabel("Value");
XYChart.Series series = new XYChart.Series();
series.setName("2023");
series.getData().add(new XYChart.Data("Item 1", 50));
series.getData().add(new XYChart.Data("Item 2", 80));
series.getData().add(new XYChart.Data("Item 3", 30));
series.getData().add(new XYChart.Data("Item 4", 60));
barChart.getData().add(series);
barChart.setAccessibleRoleDescription("Bar chart showing item summary");
barChart.setAccessibleHelp("Bar chart showing item summary");
for (XYChart.Data data : series.getData()) {
PopOver popOver = new PopOver();
popOver.setContentNode(new javafx.scene.control.Label(data.getXValue() + ": " + data.getYValue()));
data.getNode().setOnMouseEntered(event -> popOver.show(data.getNode()));
data.getNode().setOnMouseExited(event -> popOver.hide());
data.getNode().setAccessibleRole(AccessibleRole.TEXT);
data.getNode().setAccessibleRoleDescription(data.getXValue() + ": " + data.getYValue());
data.getNode().setAccessibleHelp(data.getXValue() + ": " + data.getYValue());
}
// Layout
BorderPane root = new BorderPane();
root.setTop(button);
root.setCenter(comboBox);
root.setBottom(barChart);
root.setFocusTraversable(true);
Scene scene = new Scene(root, 800, 600);
fxPanel.setScene(scene);
}
}