小编Chr*_*anS的帖子

如何向classpath添加资源

如何将文件夹(例如包含arts的资源文件夹)添加到netbeans项目的类路径中?我设法通过编辑项目的NB生成的jar文件(即MANIFEST.MF文件+手动复制资源)手动完成,但应该有一种方法告诉netbeans也要记住资源,不是吗?

文件夹结构如下所示:

/project/art/
/project/dist/lib/
/project/dist/art/
/project/dist/project.jar
/project/lib/
/project/src/
Run Code Online (Sandbox Code Playgroud)

我不想将艺术品装入罐子里,因为我希望这种艺术很容易交换.如果我将art文件夹添加到src文件夹,那么NB编译正常,但艺术资源最终在jar中.

将art文件夹添加到netbeans项目库(属性 - >库 - >添加JAR /文件夹)似乎不起作用,因为我最终得到一个错误'...\project\art是一个目录或不能读.不要复制库.' 这反过来又阻止了真正的库文件夹被复制.

有任何想法吗?

最好的问候克里斯

2基于来自gpeche的注释进行观察:a)在"运行"选项卡中指定附加资源文件夹而不是在项目属性的"编译"选项卡中指定 - >库似乎没有太大区别Netbeans(我目前正在使用6.9.1).输出(以及错误)保持不变,即根本不会复制任何内容:

Created dir: C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\dist
C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\art is a directory or can't be read. Not copying the libraries.
Not copying the libraries.
Building jar: C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\dist\VocabularyTrainer.jar
Run Code Online (Sandbox Code Playgroud)

另一个有趣的方面是,在"库"面板的"帮助"菜单中,没有明确提及有关文件夹的库.是否有可能,Netbeans中的按钮被错误地命名,只允许真正的jar?

b)将资源文件夹添加到Libraries列表确实会产生影响,即向MANIFEST.MF添加另一个条目.虽然 - 这是较小的问题 - 类路径条目似乎总是期望资源文件夹是库文件夹的子文件夹(例如"lib/arts"),主要问题是似乎缺少斜线.如上所述,MANIFEST.MF中NB生成的条目看起来像这个"lib/arts"(对我来说不起作用),而(手动设置)"lib/arts /"呢?

我使用文件夹中的资源的方式是这样的:

URL resource = getClass().getResource("/gui/refresh.png");
ImageIcon tmp = new ImageIcon(resource);
Run Code Online (Sandbox Code Playgroud)

编辑:

基于Tushars评论和这篇帖子,我发现以下解决方案是功能性和舒适性之间可接受的权衡.

我从自动生成的'build-impl.xml'文件中覆盖ANT目标,该文件在Netbeans项目的基本'build.xml'文件中的MANIFEST.MF文件中创建Class-Path.转到'build.xml'文件的代码如下所示:

  <property name="art.classpath" value="art/" />

  <target name="-post-jar">
    <mkdir dir="${dist.dir}/art"/>
    <copy todir="${dist.dir}/art">
      <fileset dir="${basedir}/art">
        <!-- <exclude name="**/!source/**"/> …
Run Code Online (Sandbox Code Playgroud)

java netbeans classpath

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

如何拦截和授权用户输入服务器

简短介绍:

我有一个[物理]模拟框架,曾经是一个单用户桌面版本.该框架作为一个工具包,使教师能够在没有深入了解Java编程和/或特定数学的情况下构建各种模拟设置.最终,我们想到将一个客户端 - 服务器范例应用于框架,以允许多个客户端在使用相同的模拟时进行协作(=在所有客户端之间同步模拟).

一些额外的技术事实:

框架/模拟是基于MVC模式设计的.

如果客户端对模拟进行更改 - 例如通过移动滑块或鼠标拖动模拟元素通过Swing GUI - 这些更改必须由服务器授权才能应用于模拟(+服务器必须采取小心将更改分发给所有其他客户端,这些客户端也必须应用它们.

授权本身非常简单,并且基本上只决定时间戳是否应该接受更改(以避免由具有不同延迟的客户端导致的问题导致在[几乎]同时)对同一事物进行更改.

问题分别是问题:

我现在想知道检测(和拦截)用户输入(将它们传递给负责客户端 - 服务器通信的底层消息系统)的最优雅方法是什么?是否存在某种通常用于所描述场景的模式或最佳实践?

我主要关注的一个问题是避免引入新的约束,这些约束必须由使用框架来构建新内容(=模拟)的人员加以考虑.从这个意义上讲,我希望保持现有的模拟工作尽可能少的更改.

我认为可以解决的一个解决方案

我想过引入一个新的界面,如:

public interface Synchronizable {
  public boolean appliesChanges();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,约束是任何类型的更改侦听器如果希望同步它们正在侦听的更改事件,则必须另外实现此接口.通过这样做,底层框架可以用代理对象替换实现Synchronizable的所有对象,代理对象负责验证与服务器的更改[事件](并且成功将事件转发给真正的更改侦听器).

'applyChanges'方法背后的想法是,并非所有对更改侦听器的调用都会导致需要同步的更改.例如,Swing JSlider可能会在旋钮移动时生成事件,但是一旦释放旋钮(即'值不再调整'),更改侦听器的具体实现可能仅应用实际更改.发生在其间的更改事件不需要发送到服务器,因为它们无论如何都不会产生任何影响.这种方法既不方便也不特别漂亮,但我想不出以其他方式解决问题的其他任何可能性?!

除了最终用户必须明确考虑他们想要同步哪些事件(因此为所有特定侦听器声明和实现所提到的接口)的问题之外,剩下的一个问题是如何自动找出哪个特定的method负责处理任意类型的事件(以避免必须为每个可能的更改侦听器实现具体代理).

概述此问题的示例:

public interface SynchronizedChangeListener extends ChangeListener, Synchronizable {}
public interface SynchronizedPropertyChangeListener extends PropertyChangeListener, Synchronizable {}

public static void main(String[] args) {

  SynchronizedChangeListener scl = new SynchronizedChangeListener() {
    public void stateChanged(ChangeEvent e) {
      System.out.println("Hello world - SynchronizedChangeListener");
    }
    public boolean appliesChanges() {
      return true;
    }
  };
  SynchronizedPropertyChangeListener spcl = …
Run Code Online (Sandbox Code Playgroud)

java user-interface swing network-programming

7
推荐指数
1
解决办法
267
查看次数