在Javafx中使用Netbeans Visual Library

时间:2015-03-18 05:46:49

标签: java javafx

我正在尝试使用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());

行中(参数不匹配; JComponent无法转换为Node)

我如何解决这个问题?

我这样做了:

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)确实显示了该按钮。

1 个答案:

答案 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项目并右键单击以运行它。

graph

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场景中。