小编Per*_*eel的帖子

如何在预加载器中处理java web start(jnlp)下载进度?

问题

我的应用程序的预加载器处理特定于应用程序的初始化.现在我正在尝试扩展它,以便预加载器还显示下载的应用程序JAR的进度.


TL; DR

  • 为什么预加载器在第2阶段没有加载,因为这应该处理PreloaderFx::handleProgressNotification();跟踪JAR的下载我想?

  • 2016年3月14日更新:使用DownloadServiceListener解决这个问题的方法是什么?如何将其连接到JavaFX阶段?


文档

根据Oracle的说法,启动应用程序有4个阶段:

  • 阶段1:初始化:Java Runtime的初始化和初始检查确定在启动应用程序之前必须加载和执行的组件.在此阶段,将显示启动画面.默认是这样的:

Java开始了

  • 阶段2:加载和准备:从网络或磁盘缓存加载所需的资源,并进行验证过程.所有执行模式都会看到默认或自定义预加载器.在此阶段,应显示我的自定义预加载器.

  • 阶段3:特定于应用程序的初始化:应用程序已启动,但可能需要在其完全正常运行之前加载其他资源或执行其他冗长的准备工作.目前,我的自定义预加载器显示如下:

预载

  • 阶段4:应用程序执行:显示应用程序并准备使用.在我的例子中,显示了一个登录窗口,用户可以继续.

登录


我的情况

我注意到的第一件事是,在阶段2中,未显示处理应用程序JAR下载的默认JavaFX预加载器.因此,用户感觉程序没有提前启动或终止,使他们多次打开JNLP文件.下载JAR后,我们进入阶段3并显示预加载器.

但是,我希望我的自定义预加载器能够处理ProgressBar中的下载进度(阶段2).我使一切尽可能简单,以便在应用程序启动期间跟踪发生的事件.这是基于JewelseaOracle示例的示例:

预载:

public class PreloaderFX extends Preloader {

        Stage stage;
        //boolean noLoadingProgress = true;

        public static final String APPLICATION_ICON
            = "http://cdn1.iconfinder.com/data/icons/Copenhagen/PNG/32/people.png";
        public static final String SPLASH_IMAGE
            = "http://fxexperience.com/wp-content/uploads/2010/06/logo.png";

        private Pane splashLayout;
        private ProgressBar loadProgress;
        private Label progressText;
        private static final int SPLASH_WIDTH = 676;
        private static final …
Run Code Online (Sandbox Code Playgroud)

java jnlp java-web-start javafx-8

28
推荐指数
2
解决办法
3208
查看次数

带控制器的多个FXML,共享对象

各位晚上好,

我已经在这个主题上发现了很多帖子,但我仍然无法将一个对象从Controller1传递给Controller2.有没有一个完整的教程或一些示例项目,这样做?

在我遇到困难之前,我已经走到了这一步:

国家级

public class Country {
private SimpleStringProperty country = new SimpleStringProperty("");

//Constructor
public Country() {
}

//GETTERS
public String getCountry() {
    return country.get();
}

//SETTERS
public void setCountry(String value) {
    country.set(value);
}

@Override
public String toString() {
    return getCountry();
}
}
Run Code Online (Sandbox Code Playgroud)

程序启动时,主要的FXML被加载(Sample.fxml).其中包含一个边框窗格,顶部面板中有一个菜单栏,中间有一个内容窗格.在初始化时,我创建一个新的Country对象并将其存储在全局变量中.我有一个方法,当单击一个菜单项时,将另一个FXML加载到内容窗格中:

SampleController.java

public class SampleController implements Initializable {

@FXML
private Pane pContent;

private Country c;

@FXML
private void handleButtonAction(ActionEvent event) throws IOException {
    System.out.println(c); //this prints Belgium, which is correct

    URL url = getClass().getResource("Sub1.fxml");

    FXMLLoader fxmlloader …
Run Code Online (Sandbox Code Playgroud)

controller javafx-2 fxml javafx-8

27
推荐指数
1
解决办法
4万
查看次数

Combobox清算价值问题

我在javafx2.2中偶然发现了Comboboxes的一个问题.这是场景:

  • 用户单击"editFile"按钮.
  • 另一个窗格变为可见(使用setVisible方法).

此窗格包含6个组合框.其中三个有固定项:cboReport,cboSales,cboSend.其中三个从db(ObservableList)获取数据,并在窗格变为可见时填充:cboFile,cboCustomer,cboVet

  • 用户从cboFile中选择文件编号.其余的组合框设置正确的值.
  • 用户按下保存按钮,文件将按预期保存.
  • 接下来,用户按下关闭按钮.

窗口关闭时,窗格上的数据将通过resetGUI_editFilePane()方法重置.有像这样的行:

...
cboReport.getSelectionModel().clearSelection();
cboSales.getSelectionModel().clearSelection();
cboSend.getSelectionModel().clearSelection();
cboFile.getSelectionModel().clearSelection();
cboCustomer.getSelectionModel().clearSelection();
cboVet.getSelectionModel().clearSelection();

cboFile.getItems().clear();
cboCustomer.getItems().clear();
cboVet.getItems.clear();
...
Run Code Online (Sandbox Code Playgroud)

当用户通过按下"editFile"按钮再次打开窗格时,我注意到只有"固定项目"组合框已经清除了它们的选择,动态填充的组合框显示最后选择的项目,尽管选择本身的值是null.这看起来像是一个图形错误或我做错了什么?

有没有解决这个问题的方法或重置组合框的最佳方法是什么?

编辑2014/08/27:
这是正式的错误(clearSelection()不清楚值):https:
//bugs.openjdk.java.net/browse/JDK-8097244

官方的"解决方法"是清除选择后清除ComboBox的值.

cb.getSelectionModel().clearSelection();
// Clear value of ComboBox because clearSelection() does not do it
cb.setValue(null);
Run Code Online (Sandbox Code Playgroud)

combobox selectionmodel javafx-2 javafx-8

20
推荐指数
3
解决办法
4万
查看次数

ComboBox FXML默认值

如何在ComboBox使用FXML中设置默认值?

<ComboBox fx:id="cbo_Bacteriologie_Aesculine" prefHeight="21.0" prefWidth="105.0" GridPane.columnIndex="1" GridPane.rowIndex="0">
    <items>
        <FXCollections fx:factory="observableArrayList">
            <String fx:value="NVT" />
            <String fx:value="Bezig" />
            <String fx:value="Positief" />
            <String fx:value="Negatief" />
        </FXCollections>
    </items>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)

我希望NVT默认选中.我尝试添加selected="selected",但似乎没有找到正确的语法.

是否可以使用Scene Builder编辑列出的项目?我似乎找不到它.

java combobox javafx javafx-2 fxml

16
推荐指数
3
解决办法
3万
查看次数

泽西制作媒体类型冲突

我现在正在尝试Jersey,按照链接在netbeans中设置一个Web服务.我有我的实体类和我的REST类.它适用于从javafx2客户端添加,编辑,删除,请求对象(在本例中为Users对象).

但是,现在我尝试向我的webservice添加一个新方法,以进行一些简单的身份验证.首先,我在Users.java文件中添加了一个新的命名查询(Users.login):

@NamedQueries({
    @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
    @NamedQuery(name = "Users.login", query = "SELECT u FROM Users u WHERE u.username = :username AND u.password = :password"),
    @NamedQuery(name = "Users.findById", query = "SELECT u FROM Users u WHERE u.id = :id"),
    @NamedQuery(name = "Users.findByUserlevel", query = "SELECT u FROM Users u WHERE u.userlevel = :userlevel"),
    @NamedQuery(name = "Users.findByDisabled", query = "SELECT u FROM Users u WHERE u.disabled = :disabled")
})
Run Code Online (Sandbox Code Playgroud)

然后我将以下代码添加到我的UsersFacadeREST.java文件(由Netbeans 7.2生成):

@GET
@Path("{username}/{password}") …
Run Code Online (Sandbox Code Playgroud)

java jersey javafx-2

16
推荐指数
1
解决办法
1万
查看次数

更新7u21后,需要验证身份窗口弹出

我在过去的6个月里一直致力于一个项目.对于这个项目,我有一个glassfish服务器实例,其中部署了webservice.在客户端,我正在使用JavaFX2.2,它使用BASIC身份验证对Jersey(XML请求/响应,没有JSON)执行REST请求.

当用户启动程序(JWS/JNLP)时,通常他们只需在自己的登录窗口中输入他们的凭据,按下登录按钮并开始工作.但是从7u21开始,由于某种原因,我得到了额外的Java"需要身份验证"弹出窗口(可能是因为7u21中的安全性已经改变).

需要身份验证弹出窗口

为了确保它与Java版本之间的兼容性问题无关,我还将服务器更新为7u21,因此:

  • 客户:从7u17到7u21更新了java
  • 服务器:更新了java从7u09到7u21,调整了glassfish asenv.bat文件以使用新的jdk

如果我点击上面显示的"需要验证"窗口中的取消按钮,程序会启动,但在执行请求时它不会运行稳定:

java.io.IOException: stream is closed
file:/D:/NetBeansProjects/MIT_20130516/CL_KenoM/dist/CL_KenoM.jar!/GUI/cow/ListCow.fxml
  at com.sun.jersey.api.client.ClientResponse.close(ClientResponse.java:615)
  at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:570)
  at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:535)
  at com.sun.jersey.api.client.WebResource.handle(WebResource.java:696)
  at com.sun.jersey.api.client.WebResource.access$300(WebResource.java:74)
  at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:512)
  at DA.CowsClient.getCowsByUserId(CowsClient.java:96)
  at GUI.cow.ListCowController.initialize(ListCowController.java:728)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2152)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2028)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2744)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2723)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2709)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2696)
  at Classes.Context.showContentPane(Context.java:186)
  at GUI.user.ListUserController.openAddData(ListUserController.java:389)
  at GUI.user.ListUserController.access$100(ListUserController.java:55)
  at GUI.user.ListUserController$8.handle(ListUserController.java:657)
  at GUI.user.ListUserController$8.handle(ListUserController.java:652)
  at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
  at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
  at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
  at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
  at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
  at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
  at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
  at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
  at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
  at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
  at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
  at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33)
  at javafx.event.Event.fireEvent(Event.java:171)
  at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3117)
  at javafx.scene.Scene$ClickGenerator.access$8600(Scene.java:3055) …
Run Code Online (Sandbox Code Playgroud)

java rest jnlp code-signing jersey

10
推荐指数
1
解决办法
7905
查看次数

EV代码签名极其缓慢

自2月以来,GlobalSign仅颁发EV代码签名证书.这意味着代码签名必须使用硬件令牌(Safenet USB eTokens)完成.

由于我不得不切换到EV代码签名,我注意到在签署我的应用程序时会有大量的时间增加.从使用常规Java密钥库的几分钟到使用eToken超过40分钟.

根据GlobalSign网站,我应该在我的罐子上签名如下:

jarsigner -keystore NONE -storetype PKCS11 -tsa http://timestamp.globalsign.com/scripts/timestamp.dll -providerClass sun.security.pkcs11.SunPKCS11 -providerArg eToken.config -storepass mypass myapp.jar myalias
Run Code Online (Sandbox Code Playgroud)

我联系了GlobalSign的支持,但他们无法帮助我,因为签名确实有效......只是非常慢.

我试过的事情:

  • 替代TSA
  • 在没有TSA的情况下签名
  • 将项目放在jarsigner位置的同一磁盘和分区上
  • 使用命令行而不是maven配置文件(在我的IDE中配置)

对缓慢的签名没有任何影响.有没有人有其他想法或有同样的问题?

java code-signing jar-signing

8
推荐指数
2
解决办法
690
查看次数

如何使用Maven结合Webstart Maven插件向清单文件添加"所有权限"?

我最近开始尝试使用Maven.作为测试,我正在尝试创建一个简单的JavaFX8 webstart应用程序.

为此,我使用了Netbeans 8中Maven类别下的JavaFX示例.这给了我一个简单的HelloWorld应用程序:

你好,世界

我在我的pom.xml文件中添加了一个名为'jnlp'的新配置文件.这样就可以在构建项目时创建一个JNLP文件(使用webstart maven插件).

....
<profiles>
    <profile>
        <id>jnlp</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>webstart-maven-plugin</artifactId>
                    <version>1.0-beta-6</version>
                    <dependencies>
                        <dependency>
                            <groupId>org.codehaus.mojo</groupId>
                            <artifactId>webstart-pack200-impl</artifactId>
                            <version>1.0-beta-6</version>
                        </dependency>
                        <dependency>
                            <groupId>org.codehaus.mojo</groupId>
                            <artifactId>keytool-api-1.7</artifactId>
                            <version>1.5</version>
                        </dependency>
                    </dependencies>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>jnlp</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <codebase>http://(my_url)/maven/</codebase> //replaced the url obviously :)
                        <jnlp>
                            <mainClass>com.mycompany.mavenprojecthelloworld.MainApp</mainClass>
                        </jnlp>
                        <pack200>
                            <enabled>false</enabled>
                        </pack200>
                        <sign>
                            <keystore>${project.basedir}/src/main/jnlp/mykeystore</keystore>
                            <keypass>mykeypass</keypass>
                            <storepass>mystorepass</storepass>
                            <alias>myalias</alias>
                            <verify>true</verify>
                        </sign>
                        <verbose>true</verbose>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
Run Code Online (Sandbox Code Playgroud)

当我构建它时,它会在目录中生成一个launch.jnlp文件和一个mavenprojectHelloWorld-1.0-SNAPSHOT.jar文件/target/jnlp.我用jarsigner仔细检查了我的jar文件是否正确签名.这是输出:

的jarsigner

我将launch.jnlpmavenprojectHelloWorld-1.0-SNAPSHOT.jar文件复制到我的webhost(http://(my_url)/ maven)并通过启动JNLP文件启动了HelloWorld应用程序.但是,当我这样做时,我收到一条消息'Java …

java jnlp manifest java-web-start maven

6
推荐指数
1
解决办法
4384
查看次数

对抗Java堆大小,Java本地和Java Web启动之间的巨大差异

上周末我打电话给客户,告诉我他们的Java程序在导入数据时没有响应.数据是一个简单的Excel工作簿,包含4个工作表.正在从列中读取所有数据并将其添加到数据库中.

所以我开始调查并得到了一些奇怪的结果.

  1. 使用Netbeans中的Run测试导入.这使用Java 64位实例:

第一次运行

本地首次运行(64位)

第二次运行

本地第二轮(64位)

  1. 使用Java Web start测试导入.这是通过打开JNLP文件并使用Java 32位实例启动的:

第一次运行

webstart首次运行(32位)

在这种情况下,我遇到了客户报告的相同问题,程序在经过一段时间的导入过程后停止响应.这是因为我达到了最大堆大小(据我所知)(红色圆圈).

第二次运行

所以我决定通过在JNLP文件中添加以下内容来增加初始堆大小和最大堆大小:initial-heap-size="512m" max-heap-size="1024m".当我再次测试导入时,它似乎工作,但是我注意到与前两种情况相比,使用的内存要多得多:

webstart第二次运行(32位)

  • 与案例4相比,为什么案例1和案例2之间的内存使用量有300mb的差异?
  • 这种高内存使用是编程错误还是内存泄漏的结果?或者拥有如此高的价值是否正常?
  • 是否initial-heap-size="512m" max-heap-size="1024m"为此问题添加了有效的解决方案?

java memory memory-leaks heap-memory

6
推荐指数
1
解决办法
434
查看次数

龙目岛 javafx 属性

我正在尝试将 Lombok 与 JavaFX 属性结合使用:

@Data
public class Country {
    private SimpleIntegerProperty id = new SimpleIntegerProperty();
    private SimpleStringProperty name = new SimpleStringProperty();
}
Run Code Online (Sandbox Code Playgroud)

这会为属性本身生成 getter 和 setter:

  • getId(): SimpleIntegerProperty
  • setId(SimpleIntegerProperty id)
  • getName:SimpleStringProperty
  • setName(SimpleStringProperty 名称)
  • ...

但是,我希望(/喜欢)JavaFX 中的这个:

  • getId(): 整数
  • setId(int id)
  • getIdProperty(): SimpleIntegerProperty
  • getName(): 字符串
  • 设置名称(字符串名称)
  • getNameProperty(): SimpleStringProperty
  • ...

这在 Lombok 中受支持吗?我没有找到太多关于 Lombok 与 JavaFX 结合的信息(或者我一定是搜索错误)。我对 Lombok 还不是很熟悉,所以如果这是一个基本问题,我很抱歉。

java lombok javafx-2 javafx-8

6
推荐指数
1
解决办法
1739
查看次数