在我目前的项目中,我们必须在java中开发一个外观漂亮的桌面应用程序.
目前,我们有一个非常基本的桌面应用程序编写的摇摆和团队没有良好的摇摆知识.我们可以在摇摆中创建一个非常好看的UI吗?
我们应该使用JavaFX来创建桌面应用程序吗?
有什么其他选择吗?
我一直试图找出允许JavaFX TableView(或任何其他JavaFX事物)表示一些Clojure数据的方法,并允许用户通过GUI操作数据.
对于这个讨论,让我们假设我有一个列表/矢量的地图,即类似的东西
[{:col1 "happy1" :col2 "sad1"} {:col1 "happy2" :col2 "sad2"}],我希望它显示在图形表中,如下所示:
mykey1 mykey2
------------------
happy1 sad1
happy2 sad2
Run Code Online (Sandbox Code Playgroud)
非常直截了当.这在世界历史上已经完成了无数次.
问题是TableView坚持采用ObservableList等,这本身就是一个可变的东西,就像JavaFX中的所有Observable一样.这非常适合保持表格更新,并且在可变模型中,它也非常适合允许用户通过GUI直接操作数据.我不是专家,但在这种情况下,似乎JavaFX希望GUI对象实际包含真实数据.这对我来说似乎很有趣(不是哈哈).通过某些API或接口维护我自己的模型并在GUI和模型之间进行通信也意味着我将数据保存在两个地方:在我自己的模型中,在GUI中.这是正确的做事方式吗?也许这是可以的,因为GUI只显示总数据的一小部分,并且它允许我的模型数据只是普通模型数据,而不是某些Java派生类型的实例.
因此,当尝试将GUI放在无状态/不可变模型上时,这会导致以下三个一般性问题:
如果GUI必然允许您更改内容,那么下面的模型如何才能真正不变?我正在考虑某种设计工具,编辑器等,其中用户明确地改变了一些东西.例如,LightTable是一个编辑器,但故事是它基于不可变数据.怎么会这样?我对此次讨论并不感兴趣.
假设在某种程度上存在至少一个Atom或其他Clojure可变类型(ref/var/agent/etc)(无论是Atom包含整个内存设计数据库的单个,还是设计数据库是否是可变的不可变列表Atoms) ,哪种[MVP,MCP,MVVM等]模型最适合这种类型的创作?
JavaFX已经使用Observable接口(http://docs.oracle.com/javafx/2/api/javafx/beans/Observable.html)的 每个可以想象的变体散布了类层次结构Observable[whatever]Value,其中包括例如ObservableMap和ObservableMapValue,以及然后几十个实施课程,如... IntegerProperty和SimpleIntegerPropertygeez!WTF?假设我必须创建一些Clojure对象(defrecord等等)并Observable在我的大多数不可变对象上实现一些接口方法,我可以坚持Observable,或者我必须将每一个实现到叶节点,即ObservableIntegerValue等等?
什么是正确的高级方法?维护一个顶级原子,每次用户更改值时都会替换它?保持一千个低级原子?让我的值存在于JavaFX Observables中,忘记Clojure数据结构?使用一些reify/proxy/gen-class在Clojure中实现我自己的一组Observable,但是将它们实现为每次更改时都被替换的不可变项?Clojure的add-watch功能是否需要或存在?我非常希望我的数据只是Clojure中的普通数据,而不是"类型"或任何接口的实现.整数应该是整数等.
谢谢
我有一个简单的JavaFX 2应用程序,有2个按钮,分别是Start和Stop.单击开始按钮时,我想创建一个后台线程,它将进行一些处理并在其进行时更新UI(例如进度条).如果单击停止按钮,我希望线程终止.
我尝试使用javafx.concurrent.Task我从文档中收集的类可以正常工作.但是每当我单击"开始"时,UI都会冻结/挂起而不是保持正常.
她是主Myprogram extends Application类中用于显示按钮的代码:
public void start(Stage primaryStage)
{
final Button btn = new Button();
btn.setText("Begin");
//This is the thread, extending javafx.concurrent.Task :
final MyProcessor handler = new MyProcessor();
btn.setOnAction(new EventHandler<ActionEvent>()
{
public void handle(ActionEvent event)
{
handler.run();
}
});
Button stop = new Button();
stop.setText("Stop");
stop.setOnAction(new EventHandler<ActionEvent>()
{
public void handle(ActionEvent event)
{
handler.cancel();
}
}
);
// Code for adding the UI controls to the stage here.
}
Run Code Online (Sandbox Code Playgroud)
这是MyProcessor类的代码:
import …Run Code Online (Sandbox Code Playgroud) 我试图使用表视图来呈现/编辑"key = value"对.因此该表应该有两列:"key"和"value".Key只是一个普通的字符串,值可以是任何值.我的问题是值的数据类型可能因行而异.基本上,我想使用复选框作为布尔值和列表选项.我找到了一种方法,通过设置单元格工厂,使用复选框或选项呈现整个表列:
final TableColumn<FieldValue, Field> valueColumn = new TableColumn<>("Value");
valueColumn.setCellFactory(new Callback<TableColumn<FieldValue, Field>, TableCell<FieldValue, Field>>() {
@Override
public TableCell<FieldValue, Field> call(final TableColumn<FieldValue, Field> column) {
// if (value instanceof Boolean)
return new CheckBoxTableCell<>();
}
});
Run Code Online (Sandbox Code Playgroud)
但我需要的是能够根据将要在单元格内呈现的项目类型插入条件.换句话说,某些单元工厂位于单元级别而不是列级别.这会在渲染时评估我的状况.我还没有找到任何解决方案.也许有人有一些适当的技术来实现这种渲染?也许有些第三方数据网格?
我一直在看一些博客和其他stackoverflow问题,我没有看到我的问题的直接答案.我正在创建一个javafx gui客户端,我希望我的菜单栏在一个fxml中是一个控制器,然后我希望内容区域是额外的fxml文件.登录屏幕将是一个fxml,登录屏幕将是应用程序的主要内容,并将在一个fxml中.我该怎么做呢?
我只是不想在同一个文件中拥有我的登录,菜单栏和主要内容的所有代码.这是我正在做的工作的图像:

How to set placeholder for TextField in JavaFX? How can I do this w/o JavaScript?
我正在使用IntelliJ IDEA 13.1.5,我曾经使用Eclipse.我正在研究JavaFX应用程序,我尝试使用getClass().getResource()在我的MainApp类中加载FXML文件.我阅读了文档并尝试了几个想法,最后我得到了null.
这是层次结构:
dz.bilaldjago.homekode.MainApp.java
dz.bilaldjago.homekode.view.RootLayout.FXML
这是我使用的代码片段:
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/RootLayout.fxml"));
Run Code Online (Sandbox Code Playgroud)
我尝试了其他解决方案,例如从root用户提供url并使用classLoader
结果是一样的.请问任何想法
我试图理解线程如何在java中工作.这是一个返回ResultSet的简单数据库请求.我正在使用JavaFx.
package application;
import java.sql.ResultSet;
import java.sql.SQLException;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
public class Controller{
@FXML
private Button getCourseBtn;
@FXML
private TextField courseId;
@FXML
private Label courseCodeLbl;
private ModelController mController;
private void requestCourseName(){
String courseName = "";
Course c = new Course();
c.setCCode(Integer.valueOf(courseId.getText()));
mController = new ModelController(c);
try {
ResultSet rs = mController.<Course>get();
if(rs.next()){
courseCodeLbl.setText(rs.getString(1));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// return courseName;
}
public void getCourseNameOnClick(){
try { …Run Code Online (Sandbox Code Playgroud) 我有一个从主监视器截取的图像,我想将它添加到Java FX中,ImageView如下所示:
@FXML
protected ImageView screenshot() throws AWTException, IOException {
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capture = new Robot().createScreenCapture(screenRect);
ImageView imageView = new ImageView();
Image image = capture; //Error
imageView.setImage(image);
return imageView;
}
Run Code Online (Sandbox Code Playgroud)
我试图设置BufferedImage capture为javafx.scene.image.Image image但但类型不兼容,我也无法投射它.我怎么能纠正这个?
我正在尝试使用maven依赖项创建一个JFX11自包含jar.从我所做的研究来看,似乎最好的方法是通过maven shade插件.但是,当我运行它时,我收到此错误:
错误:缺少JavaFX运行时组件,并且需要运行此应用程序
我不明白为什么会这样.我搞砸了什么?有一个更好的方法吗?我也用同样的消息尝试了maven程序集插件.
pom文件供参考
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Application</groupId>
<artifactId>Main</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>SpaceRunner</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>10</release>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>Application.Main</mainClass>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>
Application.Main
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>Application.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution> …Run Code Online (Sandbox Code Playgroud)