小编Xky*_*nar的帖子

JavaFX项目结构

使用FXML的JavaFX的MVC模型听起来很棒,但我很难找到如何组织我的项目包.

我发现的关于JavaFX的每一个教程都过于简单和无组织:他们只需创建一个包并在那里创建所有内容,每个控制器,每个fxml,每个css.我不想那样.我希望事情能在正确的位置.

尽管如此,JavaFX的"路径"似乎......"有限".使用URL使得如果我想将资源限制为本地文件,我必须完成所有工作getClass().getResource("foo.fxml").openStream().这很好,但是通过从类路径获取资源,路径来自类所在的包.我有点想要项目的根.这会简化我的生活,但JavaFX似乎并没有像这样工作.

让我们来看一个实际的例子:

想象一下,我有一个FXML"登录屏幕".想象一下,我希望登录屏幕使用样式表.理想情况下,该css将与该fxml位于同一个包中.但是,如果我想在另一个FXML中使用相同的.css呢?这是否意味着我必须将两个FXML放在同一个包中?显然我"不需要",但我该怎么做呢?

另外,假设我想在正确登录时更改场景.在FXML Controller适当的事件中,我将不得不调用"setScene".如果我在不同的包装中使用FXML,那么这条路也很难获得.似乎所有东西都在一个巨大的膨胀包中,或者一切都很难进入而不诉诸"../../dir"之类的黑客.

http://docs.oracle.com/javafx/2/best_practices/jfxpub-best_practices.htm中的Henley Sales应用程序似乎是一个组织良好的应用程序的示例,尽管该应用程序是单个TabPane.不幸的是(至少我认为)来源不公开.它的想法是这样的:

client
  Main.class
  styles.css
      client.images
          image.png
      client.screen1
          Screen1.fxml
          Screen1Controller.java
      client.screen2
          Screen2.fxml
          Screen2Controller.java
      ...
Run Code Online (Sandbox Code Playgroud)

这似乎是一个糟糕的开始,但它有一些问题(或者至少我认为它们是问题).

对于'The Henley Sales',它很聪明,有一个Main可以调用其中一个包'FXML(易于访问,FXML的目录在Main类之下).不过,对于样式表,这必须是硬编码的scene.getStylesheets().add(...);.我真的更愿意选择在FXML中选择样式表.Afterall,stylesheet是View组件的一部分.从FXML中的URL访问.css文件对于这种结构来说会有点困难,因为它位于其目录之上.

此外,通过这个组织,我如何才能合理地改变场景?在这个项目中,这不是必需的,因为整个项目是一个TabbedPane.主叫它,它完成了.无需更多交换.但是一个简单的登录场景(或者为什么需要交换整个场景的原因)需要访问FXML路径.

然后是资源.Css文件可能需要使用图像.该结构通过将.css文件放在顶部,并为.css可能需要的文件创建一个包来解决它.如果我想要一个特定的FXML有一个不同的.css,那么,另一个问题就会到来.

这似乎是一个循环.Css需要访问共享资源文件夹.FXML需要访问Css.FXML的控制器需要访问其他FXML.我希望我清楚我的项目结构存在疑虑.请帮我创建一个JavaFX项目结构,该结构对于超过基本的应用程序来说足够强大,或者将我重定向到一些好的源代码.

哦,我顺便使用Netbeans.

css javafx organization java-8 fxml

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

检查投影在线段上的点是否不在其外部

插图

见上图; 基本上,我想要一个简单的测试来检查一个点是否在线段的范围内.我有的信息(或输入,如果您愿意)是点的坐标和线段终点的坐标.我想要的输出是一个简单的布尔值.我怎样才能以简单的方式检查这个?

java math geometry computational-geometry

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

为什么可以在Thread类中使用Lambda表达式?

我正在学习Lambda表达式,我知道可以在Runnable功能界面和Thread类中使用它们.

我试图创建自己的:

package tests;

public interface Blabla
{
    public void doStuff();
}
Run Code Online (Sandbox Code Playgroud)

这个简单的测试编译:

Blabla bla = () -> System.out.println("Lol");
Run Code Online (Sandbox Code Playgroud)

然后我尝试创建一个像Thread这样的类

package tests;

public class Dodo implements Blabla
{
    public void doStuff()
    {
        // TODO Auto-generated method stub

    }
}
Run Code Online (Sandbox Code Playgroud)

这不编译:

 Dodo dodo = () -> System.out.println("LoL");
Run Code Online (Sandbox Code Playgroud)

我无法解释如何创建一个允许使用lambda表达式的类.

Thread如何允许在不作为接口的情况下使用Lambda表达式?

lambda java-8

5
推荐指数
1
解决办法
2158
查看次数

为什么prolog进入无限循环?

我正在开发一个项目,它基本上是一个带有游戏逻辑的prolog服务器,它与c ++ openGL程序进行通信,该程序呈现从prolog接收的用于游戏绘图的信息.

这是服务器循环,在连接成功后启动:

serverLoop(Stream) :-
    repeat,
    write('reading'), nl,
    read(Stream, ClientMsg),
    write('Received: '), write(ClientMsg), nl,
    write('Parsing'), nl,
    parse_input(ClientMsg, MyReply),
    write('formatting'), nl,
    format(Stream, '~q.~n', [MyReply]),
    write('Wrote: '), write(MyReply), nl,
    write('flushing'), nl,
    flush_output(Stream),
    write('end condition'), nl,
    (ClientMsg == quit; ClientMsg == end_of_file), !.
Run Code Online (Sandbox Code Playgroud)

它充满了写作,因为我已经调试了几个小时.

这里要注意的重要部分是:

parse_input(ClientMsg, MyReply)
Run Code Online (Sandbox Code Playgroud)

这是其中i从发送C++接收的所有消息,并在时刻我有parse_input方法有以下几种:

parse_input(putpieceHuman(BOARD, PIECE, LINE, COLUMN), Answer) :-
    write('Parsing putpieceHuman'), nl,
    drawBoard(BOARD), nl,
    putpieceHuman(BOARD, PIECE, LINE, COLUMN, Answer).

parse_input(putpiecePC(BOARD, PIECE, AI), Answer):-
    write('Parsing putpiecePC'), nl,
    drawBoard(BOARD), nl,
    putpiecePC(BOARD, PIECE, Answer, AI).
Run Code Online (Sandbox Code Playgroud)

它们非常相似.第一个是玩家游戏(指定游戏的位置),第二个是计算机游戏(AI是我希望计算机拥有的智能值,让我们只考虑值0,这是完全随机的)

这些是解析器调用的perdicates:

putpieceHuman(BOARD, PIECE, LINE, …
Run Code Online (Sandbox Code Playgroud)

debugging prolog infinite-loop

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

添加类后项目链接错误

我正在编写一个3D图像引擎(它读取带有场景信息的XML并用openGL打印),用于大学,在visual studio中(不幸的是......),我正在做解析器atm,它将xml读入一个简单的树状数据结构.其中一个元素是Camera,在我添加数据结构的那部分之前,程序运行正常,但是在我添加它之后,我遇到以下错误:

1>LIBCMT.lib(stdexcpt.obj) : error LNK2005: "public: virtual char const * __thiscall std::exception::what(void)const " (?what@exception@std@@UBEPBDXZ) already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMT.lib(stdexcpt.obj) : error LNK2005: "public: __thiscall std::exception::exception(char const * const &)" (??0exception@std@@QAE@ABQBD@Z) already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMT.lib(stdexcpt.obj) : error LNK2005: "public: virtual __thiscall std::exception::~exception(void)" (??1exception@std@@UAE@XZ) already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMT.lib(stdexcpt.obj) : error LNK2005: "public: __thiscall std::exception::exception(class std::exception const &)" (??0exception@std@@QAE@ABV01@@Z) already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMT.lib(_fpinit_.obj) : error LNK2005: __fltused already defined in a previous module
1>LIBCMT.lib(_fpinit_.obj) : error LNK2005: __ldused already …
Run Code Online (Sandbox Code Playgroud)

c++ linker-errors

3
推荐指数
2
解决办法
4628
查看次数