我有一个简单的控制台应用程序,有时需要执行图形操作,对于那些我正在使用JavaFx框架(我需要一些函数,如文本的CSS样式)我只是生成一些形状和文本到一个隐藏的场景然后保存那些存档的,就是这样,
我知道要使用JavaFx我必须将图形操作传递给JavaFx线程,但是当一切都完成后我必须关闭应用程序(几个小时后),这个JavaFx线程仍然保持打开状态......我真的不会想要强制退出System.exit(),因为如果有什么东西被阻止我可能想知道/等待(我也不想将所有内容都作为JavaFx应用程序执行(因为JavaFx组件不到我主应用程序的1%)
代码非常简单,谷歌搜索我发现只使用
Platform.exit();
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用,我也试过玩平台参数,如
Platform.setImplicitExit(false);
Run Code Online (Sandbox Code Playgroud)
这是我可以运行的测试应用程序:
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.geometry.Pos;
import javafx.scene.layout.VBox;
public class SOTestFX {
public static void main(String[] args) {
SOTestFX t = new SOTestFX();
t.runFxThread();
}
public void runFxThread(){
//Application.launch(args);
final JFXPanel jfxPanel = new JFXPanel();
Platform.runLater(new Runnable() {
@Override
public void run() {
System.err.println("CREATING IMAGE");
simpleFXoperations();
System.err.println("NOW CALL EXIT");
System.err.println("JAVA FX THREAD SHOULD BE EXITED NOW");
Platform.exit();
}
});
try {
Thread.sleep(3000); // just wait a bit if something should happen, let it …Run Code Online (Sandbox Code Playgroud) 我有主要的应用程序类,可以执行以下操作:
@Override
public void start(Stage primaryStage) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource(
"RecordScreen.fxml"));
Parent root = (Parent) loader.load();
Scene newScene = new Scene(root);
Stage newStage = new Stage();
newStage.setScene(newScene);
newStage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
它启动一个显示人物的表格视图.我选择一个人,点击编辑按钮,然后尝试启动一个允许我编辑它们的窗口.
@FXML
public void editPerson() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource(
"PersonEditor.fxml"));
PersonEditorCtrl ctrl = loader.getController();
ctrl.init(table.getSelectionModel().getSelectedItem());
Parent root = (Parent) loader.load();
Scene newScene = new Scene(root);
Stage newStage = new Stage();
newStage.setScene(newScene);
newStage.show();
} catch (Exception e) …Run Code Online (Sandbox Code Playgroud) 我很难将文本放在HBox中.我能够设置文本的水平对齐,但我无法设置文本的垂直对齐.我试图在Hbox的垂直中心设置文本,但它出现在顶部.
任何帮助将非常感激.
// Create The Updates Progress Bar At The Bottom Of The Window
HBox checkUpdatesBar = new HBox();
checkUpdatesBar.setId("checkUpdatesBar");
checkUpdatesBar.setPrefSize(CHECK_PANE_WIDTH, CHECK_PANE_HEIGHT);
checkUpdatesBar.setMinSize(CHECK_PANE_WIDTH, CHECK_PANE_HEIGHT);
checkUpdatesBar.setMaxSize(CHECK_PANE_WIDTH, CHECK_PANE_HEIGHT);
// Create The 'Check For Updates...' Text
Text checkForUpdates = new Text();
checkForUpdates.setFont(Font.font("Arial Black", FontWeight.BLACK, 15));
checkForUpdates.setWrappingWidth(CHECK_PANE_WIDTH / 2.8);
checkForUpdates.setFill(Color.WHITE);
checkForUpdates.setTextAlignment(TextAlignment.CENTER);
checkForUpdates.setText("Checking For Updates ...".toUpperCase());
checkUpdatesBar.getChildren().add(checkForUpdates);
Run Code Online (Sandbox Code Playgroud)
我的代码生成以下内容:http://puu.sh/ccEkp/41a26038a4.png
我喜欢我的水平定位.我知道它不在中间,因为我将它设置为那样.但是,我只关心垂直定位.
我分别尝试了以下内容:
checkForUpdates.setLayoutY(20);
checkForUpdates.setY(20);
Run Code Online (Sandbox Code Playgroud)
我选择数字20是因为我想将文本从HBox顶部向下移动20个像素.我在Photoshop中计算了这个值.虽然如果有更好的方法将文本设置为HBox的垂直中心,请赐教.
再次感谢您的帮助!
是否可以在JavaFX应用程序中使用CSS指定字体?我有一个FXML场景和相应的CSS文件.在Java代码中,可以使用以下setFont方法指定字体:
text.setFont(Font.loadFont("file:resources/fonts/SourceSansPro-Bold.ttf", 12));
Run Code Online (Sandbox Code Playgroud)
我试过不同的结构,比如:
-fx-font-family: url("../fonts/SourceSansPro-Bold.ttf");
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
我正在研究与JavaFX控件混合的Swing应用程序.
我创建了一个JavaFX控件(WebView)来浏览HTML文件.但我想知道,如何在Swing的容器上添加此Web视图控件JFrame?
使用JavaFX 8时,我们需要通过GUI运行与GUI的交互Platform.runLater,否则如果从另一个线程运行它们将抛出异常.
但是执行Platform.runLater永远不会检查它当前是否在JavaFX线程上.
我写了以下方法:
public static void runSafe(final Runnable runnable) {
Objects.requireNonNull(runnable, "runnable");
if (Platform.isFxApplicationThread()) {
runnable.run();
}
else {
Platform.runLater(runnable);
}
}
Run Code Online (Sandbox Code Playgroud)
这可以确保它永远不会在非fx应用程序线程上运行.
是否有任何理由认为默认实现不会发生这种短路?
我需要设置为默认值ComboBox从ObservableArrayList,我想在我的设置第一个值ArrayList作为默认值.
List = FXCollections.observableArrayList(arrayList);
comboBox.setItems(List);
Run Code Online (Sandbox Code Playgroud) 如果我理解Oracle的公告,JavaKX将不会从JDK 11开始包含在JDK中,并且只能作为OpenJFX使用.
作为软件开发人员,我必须采取哪些步骤才能使用JDK 11+运行我的JavaFX应用程序?有什么好的adivce吗?将通过Gradle提供OpenJDK吗?