我有一个 JavaFX 程序,在循环中使用 setImage(new Image(new ByteArrayInputStream(imageBytes))) 方法在 ImageView 中连续设置图像。整个过程被包装在 Platform.runLater() 中以确保 UI 线程安全。
我面临的问题是,当我启用 -Dprism.verbose=true 时,控制台会连续打印消息“Growing pool D3D Vram Pool target”,然后显示不断增加的数字。最终,它会导致 NullPointerException。令人惊讶的是,在 setImage 调用之后添加 System.gc() 解决了该问题,并且异常在一段时间后停止。
据我所知,出于性能原因,不建议在循环中调用 System.gc(),并且垃圾收集器应该自动处理此问题。但是,如果没有这种显式调用,不断增长的池和异常仍然存在。
我还尝试在设置实际图像之前调用 setImage(null) 以通知垃圾收集器,但这没有任何区别。我什至增加了内存,但问题仍然存在。
这种行为正常吗?是什么导致池不断增长和 NullPointerException?关于如何在不依赖 System.gc() 的情况下解决此问题有什么建议吗?
(This code constantily grows D3D Vram Pool like : Growing pool D3D Vram Pool target to 524.167.168 Growing pool D3D Vram Pool target to 524.167.168 Growing pool D3D Vram Pool target to 535.226.368..)
几秒钟后我得到:
java.lang.NullPointerException at com.sun.prism.d3d.D3DTexture.getContext(D3DTexture.java:84) at com.sun.prism.d3d.D3DTexture.update(D3DTexture.java:207) at com.sun.prism.d3d.D3DTexture.update(D3DTexture.java:151)...
this.packetImage.setImageByteStream(new ImageByteStream() {
@Override …Run Code Online (Sandbox Code Playgroud) 在javaFX中Application是一个抽象类。在这个抽象类中,有一些抽象方法在扩展抽象应用程序类的主类中被重写,并且在抽象类应用程序中也有静态 launch() 方法。launch() 方法从主类中的 main 方法调用。现在 launch() 方法如何调用这些抽象方法,并且对于这些调用,执行主类中的重写方法?请帮助我了解这个程序实际上是有效的。我知道非静态方法不能从静态方法调用,并且不可能创建抽象类的实例。抽象方法不能是静态方法。
我不想创建主类的对象。因为launch()方法不知道主类的名称是什么。
给我写一段java代码,这个过程很好地说明了这一点。像这样
public class main extends Application{
public static void main(String[] args)
launch(); // launch() was a static method in Application class
}
@override
public void init(){ // init() was an abstract method in Application class
System.out.println("hello");
}
}
public abstract class Application {
public static void launch(){
init();
}
public abstract void init();
}
Run Code Online (Sandbox Code Playgroud)
我想得到输出:你好
The problem is that i want to know how to make responsive Desktop applications in JavaFx or Java Swing (preferred in JavaFx) . When i try to resize my application frame it's components size does not grow or shrink and similar is the situation when i try to run this on different screen sizes with different screen resolutions. I have searched on this topic but could not find any solution to this. So, any reference material will also be very …
我创建了一个小型的客户端-服务器程序,其工作原理如下:客户端在五秒内向服务器发送一个随机数,然后服务器发送一个(或多或少出名的)报价给客户端。该随机数表示某些引号所在的 ServerClass 中 ArrayList 的索引。连接运行良好,客户收到报价,我可以轻松地使用 sysout 将其打印出来。我现在的问题是,我想在一个小的 JavaFX / FXML 文件中将收到的报价显示为标签,并且当从服务器传入新报价时,文本应该每五秒更改一次。QuotesClient 类(即客户端)也是相应 FXML 文件的控制器,但问题是因为我的 Client 类中负责处理传入 UDP 数据包的方法是静态的,当然我无法访问非静态在此方法中进行标记。
我也尝试将标签设为静态,但随后我收到一个 NullPointerException:
java.lang.NullPointerException
at Aufgabe1.QuotesClient.main(QuotesClient.java:48)
at Aufgabe1.QuotesApp.lambda$1(QuotesApp.java:32)
at java.base/java.lang.Thread.run(Thread.java:844)
Run Code Online (Sandbox Code Playgroud)
这是我的客户端文件:
public class QuotesClient {
private static final int BUFSIZE = 508;
@FXML
private static Label zitatLabel; //Thats the quoteLabel i wanna change
public static void main(String[] args) throws UnknownHostException {
var host = "localhost";
var localPort = 40000;
var serverPort = 50000;
try (var socket = new DatagramSocket(localPort)) {
while(true) {
Random …Run Code Online (Sandbox Code Playgroud) 我有:
public class TaskCell extends ListCell<Activity>...
..
private TextField textField = new TextField();
private HBox content = new HBox(..textField..);
@Override
public void updateItem(final Activity activity, boolean empty) {
super.updateItem(activity, empty);
...
textField.setText(activity.getTitle());
setGraphic(content);
}
Run Code Online (Sandbox Code Playgroud)
内容是一个带有 TextField 和其他控件的 HBox。
通过单击 或 通过以下方式选择列表项:
listView.getSelectionModel().select(1);
Run Code Online (Sandbox Code Playgroud)
起作用并选择整个项目。现在我想使用 Key.Tab 选择内部 TextField 进行编辑。这怎么可能?问题不是关于 KeyEvents,而是如何在所选 ListItem 上的 TextField(任何控件)上获取 requestFocus。
最好且仅部分有效的解决方案:
TaskCell selectedTaskCell = (TaskCell) listView.lookup(".cell:selected");
HBox hBox = (HBox) selectedTaskCell.getGraphic();
TextField textField = (TextField) hBox.getChildren().get(1);
textField.requestFocus();
textField.setVisible(false);
Run Code Online (Sandbox Code Playgroud)
这确实通过调试得到了正确选择的单元格。但是 requestFocus/setVisible 总是在第一个列表项上完成。从逻辑上讲,随着 ListCell 被重用..如何将焦点放在所选项目上?谢谢。
如何修改我绘制红圈的样式?我最多能做的就是更改该按钮的样式。
.tab-pane-ui .control-buttons-tab .tab-down-button .arrow{
}
.tab-pane-ui .control-buttons-tab .tab-down-button{
}
.tab-pane-ui .control-buttons-tab{
}
Run Code Online (Sandbox Code Playgroud)
我查看了 javafx css 文档,但没有任何结果。
我有一个用 java swing 创建的程序,但是我遇到了一个问题,在没有太多在线帮助的情况下使用它来解决我遇到的问题,所以我开始学习 JavaFX 并使用 fxml 作为 gui,所以我尝试创建主窗口在 JavaFX 代码中。只用代码,我就能让它看起来像我想要的那样。然后我决定将其切换到 fxml,因此我创建了 fxml 文件,在我的 java 文件中添加了代码来加载它,但是当我运行该程序时,我不断收到错误“Caused by: java.lang.ClassNotFoundException: javafx .scene.control.VBox”,或与 HBox 相同,具体取决于我使用的。我尝试自己解决这个问题,也尝试过chatGpt,但我找不到解决方案。让我困惑的是,当我第一次在 VS Code 中创建 JavaFX 项目时,它在 fxml 中使用了 VBox,但工作正常。我已经复制了使用的所有代码,只是更改了 fxml 节点。对于上下文,这里是模块文件、我的代码和 fxml 文件。
module gearworks {
requires javafx.controls;
requires javafx.fxml;
opens gearworks to javafx.fxml;
exports gearworks;
}
Run Code Online (Sandbox Code Playgroud)
package gearworks;
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
/**
* JavaFX App
*/
public class App extends Application {
private BorderPane root;
public static void main(String[] …Run Code Online (Sandbox Code Playgroud) 我试图仅显示 orderwindow 中的项目名称,这就是我所拥有的
ListView<MenuItem> orderList = new ListView<>();
public OrderWindow() {
myStage = new Stage();
GridPane gridpane = new GridPane();
VBox vbox = new VBox(gridpane);
Scene scene = new Scene(vbox);
Label orderLabel = new Label("Items");
gridpane.add(orderLabel, 0, 0);
gridpane.add(orderList, 1, 0);
myStage.setTitle("Order Window");
gridpane.add(addSelect, 1, 4);
gridpane.add(placeOrder, 2, 4);
gridpane.add(cancelOrder, 3, 4);
addSelect.setOnAction(this);
placeOrder.setOnAction(this);
cancelOrder.setOnAction(this);
myStage.setScene(scene);
}
public void show(Cafe c) {
cafe = c;
//ObservableList<MenuItem> list = FXCollections.observableArrayList(c.getAllMenuItems());
orderList.getItems().setAll(c.getAllMenuItems());
orderList.getSelectionModel().select(0);
myStage.showAndWait();
}'`
Run Code Online (Sandbox Code Playgroud)
当我执行时,这就是我得到的
这是我的咖啡馆课:
import java.io.File;
import java.io.FileNotFoundException;
import …Run Code Online (Sandbox Code Playgroud) 这是我的观点:
public class AdminPage extends VBox {
public AdminPage() {
Menu menu = new Menu("Optional");
int i;
ArrayList<String> items = new ArrayList<>();
items.add("Product");
items.add("Profile");
items.add("Home");
for (i = 0; i < items.size(); i++) {
menu.getItems().add(new MenuItem(items.get(i)));
}
MenuBar menuBar = new MenuBar();
menuBar.getMenus().add(menu);
this.getChildren().addAll(menuBar);
this.setAlignment(Pos.TOP_LEFT);
}
}
Run Code Online (Sandbox Code Playgroud)
我想编写控制器,但问题是我如何知道点击了哪个项目。
菜单是这样的:
Optional
----------
Product
Home
Run Code Online (Sandbox Code Playgroud)
我希望如果我单击产品,则会打开另一个表单。我认为这是通过点击操作完成的。
我正在为学校开发一个程序,用户可以选择一个单选按钮来显示总统的图像。但是,单击按钮时我无法显示图像。我不知道哪里出了问题,我需要一些帮助。其他一切都很好。我需要进行任何编辑吗?
package com.example.imagedisplay;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.RadioButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
import java.io.File;
public class PresidentImageDisplay extends Application {
@Override
public void start(Stage primaryStage) {
DirectoryChooser directoryChooser = new DirectoryChooser();
directoryChooser.setTitle("Select Presidents Folder");
File selectedDirectory = directoryChooser.showDialog(primaryStage);
if (selectedDirectory != null) {
File[] imageFiles = selectedDirectory.listFiles();
if (imageFiles != null && imageFiles.length >= 5) {
ImageView[] presidentImageViews = new ImageView[5];
ToggleGroup toggleGroup = new ToggleGroup();
HBox radioBox = …Run Code Online (Sandbox Code Playgroud)