swing内容在javafx应用程序中未正确显示

ndh0cuux  于 2021-07-08  发布在  Java
关注(0)|答案(0)|浏览(292)

我目前正在开发一个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;
}
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题