我目前正在开发一个javafx应用程序。fx应该只负责ui内容,而相当复杂的功能在另一个已经完成的项目中,该项目是使用swing创建的。为了实现这一点,我使用scenebuilder构建了一个fxml,然后将许多swing面板传递到单独的swingnodes中,并将swingnodes传递到tabpane的不同选项卡中(所有这些都是在我的应用程序类的start()方法中完成的)。启动程序后,一切看起来都很好,swing和fx内容显示正确,功能也正常工作。但是,当手动调整应用程序窗口的大小时,swingnode内容会出现错误,有时选项卡仍然是空的,有时只绘制了节点的一部分,有时它只是完全显示为黑色。
现在,实际启动的程序是“旧的”swing项目,它在某种程度上使用platform.startup()启动fx应用程序。出于功能原因,这是必要的。此时的swing面板被传递到swingnodes中,swingnodes位于fx项目中。
我试图通过不断地在调整窗口大小时设置swingnode内容来“更新”swingnode。我还尝试重新绘制swing内容。两次尝试都没有成功。
我错过了什么?为什么swingnode内容不随窗口的其余部分调整大小?swing内容是否可能太大而无法正常工作?或者可能存在多线程问题?
我知道如果没有任何代码示例,这个问题可能很难理解。我目前正在为这两个项目创建一个极简版本,以重现我的问题,并将尽快更新完成。
编辑:我相信我能够重现这个问题,并试图包括下面的一切。 fx
传递给 swing
构建路径,但不是相反。运行时 swing
将打开一个fx窗口,其中包含三个选项卡,所有选项卡都充满了swingnodes。但是,当用户调整此窗口的大小时,只有活动选项卡´s swingnode被正确地重新粉刷过。其他两个选项卡仍然包含节点,但是元素只有在鼠标悬停在它们上面时才会重新出现-这对标签不起作用。我已经尝试过在swingnodes上使用重绘,到目前为止还没有成功,所以我选择不在这里包含它。
第二次编辑:删除了fxml和fxml控制器类,使问题稍微小一点。fxml只是一个简单的tabpane,scenebuilder中内置了3个选项卡,控制器只包含3个选项卡的getter。
调整大小并将鼠标悬停在10个按钮中的3个按钮上后的选项卡2
projectexplorer中fx项目的结构
projectexplorer中swing项目的结构
项目 fx
包含类 MainFx
它扩展了应用程序和控制器 DebugWindowController
对于fxml文件。还有一个接口 MainInterface
由类实现 Main
在项目中 swing
班级 MainFx
```
package controllers;
import interfaces.MainInterface;
import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
public class MainFx extends Application {
private DebugWindowController debugWindowController;
private AnchorPane mainRoot;
private final SwingNode swingNode1 = new SwingNode();
private final SwingNode swingNode2 = new SwingNode();
private final SwingNode swingNode3 = new SwingNode();
private MainInterface mainInterface = null;
@Override
public void start(Stage primaryStage) {
try {
FXMLLoader debugWindowLoader = new FXMLLoader(getClass().getResource("/view/DebugWindow.fxml"));
mainRoot = debugWindowLoader.load();
debugWindowController = debugWindowLoader.getController();
Scene scene1 = new Scene(mainRoot);
fillFxTabPane();
primaryStage.setScene(scene1);
primaryStage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
private void fillFxTabPane() {
swingNode1.setContent(mainInterface.getPanel1());
swingNode2.setContent(mainInterface.getPanel2());
swingNode3.setContent(mainInterface.getPanel3());
debugWindowController.getTab1().setContent(swingNode1);
debugWindowController.getTab2().setContent(swingNode2);
debugWindowController.getTab3().setContent(swingNode3);
}
public MainInterface getMainInterface() {
return mainInterface;
}
public void setMainInterface(MainInterface mainInterface) {
this.mainInterface = mainInterface;
}
}
接口 `MainInterface` ```
package interfaces;
import javax.swing.JComponent;
public interface MainInterface {
JComponent getPanel1();
JComponent getPanel2();
JComponent getPanel3();
}
项目 swing
只包含一个类,该类包含用于启动程序的main()方法。班级 Main
```
package swing;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import controllers.MainFx;
import interfaces.MainInterface;
import javafx.application.Platform;
import javafx.stage.Stage;
public class Main implements MainInterface {
private JPanel panel1;
private JPanel panel2;
private JPanel panel3;
public Main() {
panel1 = new JPanel();
JLabel label1 = new JLabel("Panel1");
panel1.add(label1);
for (int i = 0; i < 10; i++) {
JButton button = new JButton("B" + (i + 1));
panel1.add(button);
}
panel2 = new JPanel();
JLabel label2 = new JLabel("Panel2");
panel2.add(label2);
for (int i = 0; i < 10; i++) {
JButton button = new JButton("B" + (i + 1));
panel2.add(button);
}
panel3 = new JPanel();
JLabel label3 = new JLabel("Panel3");
panel3.add(label3);
for (int i = 0; i < 10; i++) {
JButton button = new JButton("B" + (i + 1));
panel3.add(button);
}
MainFx mainFx = new MainFx();
mainFx.setMainInterface(this);
Platform.startup(() -> {// launch JavaFx application
Stage stage = new Stage();
try {
mainFx.start(stage);
} catch (Exception ex) {
ex.printStackTrace();
}
});
}
public static void main(String[] args) {
Main main = new Main();
}
@Override
public JComponent getPanel1() {
return panel1;
}
@Override
public JComponent getPanel2() {
return panel2;
}
@Override
public JComponent getPanel3() {
return panel3;
}
}
暂无答案!
目前还没有任何答案,快来回答吧!