我正在尝试使用Javafx
中的Net beans Visual Library,我在这里举例https://platform.netbeans.org/graph/examples.html。
我特别使用javaone.demo4包中的DemoGraphscene.java。虽然我正在使用我的javafx项目中的示例,但我不确定如何显示图形。
以下是我在控制器类中编写的内容:
public class GraphicalViewController implements Initializable {
/**
* Initializes the controller class.
*/
@FXML
private Pane pane1;
@FXML
private Label label;
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
GraphScene scene = new DemoGraphScene ();
String helloNodeID = "Hello";
String worldNodeID = "World";
String edge = "edge";
Widget hello = scene.addNode (helloNodeID);
Widget world = scene.addNode (worldNodeID);
scene.addEdge (edge);
scene.setEdgeSource(edge, helloNodeID);
scene.setEdgeTarget(edge, worldNodeID);
hello.setPreferredLocation (new Point (100, 100));
world.setPreferredLocation (new Point (400, 200));
pane1.getChildren().add(scene.getView());
}
}
所以我在pane1.getChildren().add(scene.getView());
我如何解决这个问题?
我这样做了:
SwingNode swingScene = new SwingNode();
SwingNode swingScene1 = new SwingNode();
swingScene.setContent(new JButton("Click me!"));
swingScene1.setContent(scene.getView());
pane1.getChildren().add(swingScene1);
当我pane1.getChildren().add(swingScene1)
时,我看不到任何内容,但pane1.getChildren().add(swingScene)
确实显示了该按钮。
答案 0 :(得分:2)
使用SwingNode
NetBeans Visual Library基于Swing。如果要在JavaFX中使用它,则需要wrap the Swing component in a JavaFX node。
@FXML Pane pane1;
. . .
GraphScene scene = new DemoGraphScene();
. . .
SwingNode swingScene = new SwingNode();
swingScene.setContent(scene.getView());
. . .
pane1.getChildren().add(swingScene);
混乱的注释
特别令人困惑,因为可视化库可以处理场景,JavaFX库也可以处理场景,但它们是来自不同库的不同场景,因此需要将Visual Library场景视图按顺序包装在JavaFX节点中在JavaFX场景中显示它。
此外,在混合使用Swing和JavaFX代码时,请确保在Swing事件调度线程和JavaFX应用程序线程上的JavaFX代码上执行Swing代码 - 否则可能会出现严重错误。
我不是混合Swing和JavaFX的忠实粉丝,通常我建议如果你想使用Swing,那么编写一个100%Swing应用程序,如果你想使用JavaFX,写一个100%JavaFX App
可执行样本
这是一个可执行的示例。该示例依赖于以下源代码:https://platform.netbeans.org/graph/examples.html。要使用它,请从该链接下载示例项目,将下面的示例代码粘贴到 NetBeans项目并右键单击以运行它。
import java.awt.Dimension;
import java.awt.Point;
import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javax.swing.JComponent;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import org.netbeans.api.visual.graph.GraphScene;
import org.netbeans.api.visual.widget.Widget;
public class FXGraphDemo extends Application {
@Override
public void start(final Stage stage) {
final SwingNode swingNode = new SwingNode();
createAndSetSwingContent(swingNode);
Scene scene = new Scene(new Group(swingNode), 400, 300);
stage.setScene(scene);
stage.show();
}
private void createAndSetSwingContent(final SwingNode swingNode) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final GraphScene graphScene = new DemoGraphScene();
String helloNodeID = "Hello";
String worldNodeID = "World";
String edge = "edge";
Widget hello = graphScene.addNode (helloNodeID);
Widget world = graphScene.addNode (worldNodeID);
graphScene.addEdge (edge);
graphScene.setEdgeSource(edge, helloNodeID);
graphScene.setEdgeTarget(edge, worldNodeID);
hello.setPreferredLocation (new Point (100, 100));
world.setPreferredLocation (new Point (300, 200));
final JComponent sceneView = graphScene.createView();
final JScrollPane panel = new JScrollPane (sceneView);
panel.getHorizontalScrollBar().setUnitIncrement (32);
panel.getHorizontalScrollBar().setBlockIncrement (256);
panel.getVerticalScrollBar().setUnitIncrement (32);
panel.getVerticalScrollBar().setBlockIncrement (256);
panel.setPreferredSize(new Dimension (400, 300));
swingNode.setContent(panel);
}
});
}
public static void main(String[] args) {
launch(args);
}
}
<强>买者强>
样本(通常但不总是)在最初绘制时会出现问题,在尝试计算矩形时会闪烁黑色并记录NullPointerExcepton(出于我不知道的原因 - 看起来有点像种族条件某处)。在那之后,它似乎显示和工作正常。要绕过黑色闪存和NullPointerException,您可以在JFrame而不是SwingNode中显示图形,但它会在其自己的单独窗口中显示,而不是嵌入在JavaFX场景中。