标签: javafx

JavaFX循环中setImage异常问题

我有一个 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)

java garbage-collection javafx image render

0
推荐指数
1
解决办法
110
查看次数

我想了解抽象类应用程序的 launch() 方法在 JavaFX 中如何工作

在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)

我想得到输出:你好

java abstract-class static-methods javafx abstract-methods

0
推荐指数
2
解决办法
242
查看次数

How to create responsive desktop applications UI in JavaFx?

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 …

java javafx responsive-design fxml

0
推荐指数
1
解决办法
224
查看次数

在小型客户端-服务器应用程序中更改 JavaFX 标签文本

我创建了一个小型的客户端-服务器程序,其工作原理如下:客户端在五秒内向服务器发送一个随机数,然后服务器发送一个(或多或少出名的)报价给客户端。该随机数表示某些引号所在的 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)

java udp network-programming client-server javafx

0
推荐指数
1
解决办法
59
查看次数

在 JavaFX ListView 中选择自定义列表单元格的内部控件

我有:

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 被重用..如何将焦点放在所选项目上?谢谢。

listview javafx

0
推荐指数
1
解决办法
63
查看次数

如何修改tabpane中的tab超出宽度时显示的弹出页面的样式

如何修改我绘制红圈的样式?我最多能做的就是更改该按钮的样式。

.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 javafx

0
推荐指数
1
解决办法
40
查看次数

为什么我使用 fxml 的 JavaFX 程序出现错误“Caused by: java.lang.ClassNotFoundException: javafx.scene.control.VBox”?

我有一个用 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)

java javafx fxml

0
推荐指数
1
解决办法
86
查看次数

为什么列表显示的是包而不是实际值?

我试图仅显示 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)

oop javafx arraylist

0
推荐指数
1
解决办法
53
查看次数

动态创建时如何知道点击了哪个menuItem?

这是我的观点:

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)

我希望如果我单击产品,则会打开另一个表单。我认为这是通过点击操作完成的。

java javafx

0
推荐指数
1
解决办法
55
查看次数

我在 Javafx 图像显示方面遇到问题

我正在为学校开发一个程序,用户可以选择一个单选按钮来显示总统的图像。但是,单击按钮时我无法显示图像。我不知道哪里出了问题,我需要一些帮助。其他一切都很好。我需要进行任何编辑吗?

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)

java javafx radio-button

0
推荐指数
1
解决办法
60
查看次数