我以前用Java创建了一些GUI应用程序,每次我真的只是乱搞,直到我想要它做的事情,使用我在网上找到的几个GUI示例的snippit.最近我阅读了一些关于使用Swing在Java中编写GUI时的良好实践,但仍有一些事情我不清楚.让我先描述一下我在下一个项目中想要做什么,以便我们可以将其作为一个例子:
我想创建一个可执行应用程序,使用户能够加载图像,对这些图像执行某些操作并保存项目.核心应该有一个主图像查看器,下面有一个简单的导航器,可以在加载的图像之间切换.应该有带按钮的面板对图像执行操作(例如按钮'从图像中选择背景颜色'),这些操作应该可以从工具栏或菜单中访问.
我知道,例如,GUI应该从Event Dispatch Thread启动,并且我可以使用SwingWorker进行耗时的操作.我还了解到,通过使用Actions,我可以将功能与状态分开,并为面板按钮,工具栏按钮和菜单项创建一个Action.
我不明白的是所有这些事情是如何相互沟通的,以及我把它放在哪里.例如:我是否在一个单独的模型中维护我的程序状态(当前显示哪个图像,设置了什么设置),并在我的主窗口类中引用该模型?那控制器怎么样?我是否继续参考控制器中的模型?当我对图像进行一些计算时,是否使用简单的重绘更新控制器中的gui图像或gui本身的图像?
我想我遇到的主要问题是我真的不明白如何让程序的不同部分进行通信.GUI由许多部分组成,然后有所有这些动作和监听器,模型,控制器,并且所有这些都需要以某种方式进行交互.我不断添加对所有这些对象中几乎所有内容的引用,但它使一切都非常混乱.
我在网上找到的另一个例子是:http: //www.devdaily.com/java/java-action-abstractaction-actionlistener
我理解这是如何工作的,我不明白的是如何真正改变"本来会做'切'动作." 进入实际切割动作.让我们说它涉及在观察者中从我的图像中切出一部分,我是否已将图像传递给动作?如果这个过程需要很长时间,我会在动作中创建一个新的SwingWorker吗?然后我如何让SwingWorker在计算时更新GUI?我是否会将GUI的引用传递给SwingWorker,以便它可以不时更新它?
有没有人有一个如何做到这一点的好例子,或者有关如何正确学习这个的一些提示,因为我有点不知所措.有太多的信息和许多不同的做事方式,我真的想学习如何使用干净的代码创建可伸缩的应用程序.是否有一个很好的开源项目,没有太多的代码,非常好地演示了我所描述的GUI,以便我可以从中学习?
我有一个静态类,在类中,图像被加载到BufferedImage对象中,如下所示:
File groundTopImageFile = new File("src/main/resources/ground - grass top.png");
Run Code Online (Sandbox Code Playgroud)
现在,当我使用Maven2创建一个可执行jar时,一切正常,除了它找不到图像文件.我检查了jar,图像文件都放在了jar的根目录中,所以我尝试使用:
File groundTopImageFile = new File("ground - grass top.png");
Run Code Online (Sandbox Code Playgroud)
但没有成功.同样,我不能再在Eclipse中使用相同的代码了.有没有办法在jar和Eclipse中使这个工作?
这是我的Pom.xml文件:
<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>com.WetWindmill</groupId>
<artifactId>Sheepness</artifactId>
<name>Sheepness</name>
<version>0.0.1-SNAPSHOT</version>
<description>Equilibrium reaction visualized with sheep :)</description>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.8</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>generate-resources</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>controller.Sheepness</mainClass>
<packageName>com.WetWindmill.Sheepness</packageName> …Run Code Online (Sandbox Code Playgroud) 我有一个带有一些通用接口的父包。我现在想创建这个接口的几个实现,每个实现在不同的文件中。我以为我可以简单地使这些包成为包含接口的包的子包,实例化泛型,然后直接访问子包,但这给了我一个错误,即子包也必须是泛型的。
这导致我进行以下实现:
parent.ads:
generic
type T is private;
package Parent is
type I_Generic is interface;
type Any_Generic is access all I_Generic'Class;
function Get (This : in out I_Generic) return T is abstract;
procedure Set (This : in out I_Generic; Value : T) is abstract;
end Parent;
Run Code Online (Sandbox Code Playgroud)
亲子广告:
generic
package Parent.Child is
-- long spec
type Impl is new I_Generic with private;
type Impl_Access is access all Impl;
overriding function Get (This : in out Impl) return T;
overriding procedure Set …Run Code Online (Sandbox Code Playgroud) 我有一个Set对象,我使用这个集合来确保当我向它添加一个已经存在于集合中的元素时,它不会被添加.这是一个简单的部分,只需使用Set.add();但是在完成之后我需要引用Set中的对象.
我的本质意思是有一个.add()不返回布尔值,但是你试图添加的实际对象(如果它没有添加,则是集合中的那个).是否已经有一个Set实现来执行此操作,还是我必须自己编写?
目前我使用了a Set.add(),如果它返回false,我使用迭代器来查找集合中的那个.虽然这有效,但我发现它很难看.特别是当使用HashSet实现时,它应该能够使用哈希码更快地找到对象.有任何想法吗?
编辑:哇,在相对较短的时间内有很多答案,谢谢.好吧,所以我要做的是创建一个特定的数据结构,从某个地方加载数据并从中创建对象.这个数据可能包含重复项,如果我使用了一个集合并且只需要这个集合就不会有问题,但是数据结构需要将对这些唯一对象的引用添加到数据结构中的其他对象,因此我需要引用集合中的(唯一)对象.此外,我不能只是不加载已经包含在集合中的数据,因为还有更多(唯一)链接到它的数据,这些数据也被添加,同时还包含对集合中已包含的数据的引用.为了便于说明(因为上面的解释还不清楚),我将在这里给出一个例子:
数据:
foo bar 1 3 1 4 2 5
数据结构:
Set<Foo> totalFooSet
Set<Bar> totalBarSet
Run Code Online (Sandbox Code Playgroud)
富:
sometype data
Set<Bar> barSet
Run Code Online (Sandbox Code Playgroud)
酒吧:
sometype data
Set<Foo> fooSet
Run Code Online (Sandbox Code Playgroud)
这有点像多对多的关系.
我不确定这里是否存在一些重大的设计缺陷,我已经和其他人一起看过了,我们无法弄清楚如何以不同的方式做到这一点.我喜欢使用HashMap的想法,所以我将创建一个子类并向其添加addAndReturn()函数.
我正在为我正在做的一些计算生成位掩码,我需要屏蔽一个int,除了最右边的x之外的所有都变为零.我这样做使用:
int mask = ~(-1 << x);
Run Code Online (Sandbox Code Playgroud)
这适用于x的所有值,除了x = 32.它应该返回-1然后,但它返回0.这里发生了什么?
另外,我试过这个:
int mask = -1 >>> 32 - x;
Run Code Online (Sandbox Code Playgroud)
在x = 0时,它应该返回0,但它返回-1.以某种方式将某些东西移动32会导致操作返回操作员的左侧.当我尝试将-1移位33或34位时,它返回一个值,好像它移动了1或2.我是否正确假设Java实际上是这样做的:
int mask = ~(-1 << x % 32);
Run Code Online (Sandbox Code Playgroud)
和
int mask = -1 >>> (32 - x) % 32;
Run Code Online (Sandbox Code Playgroud)
?
如果是这样,如果你超过int的32位长度,你为什么要这个循环行为呢?有关Oracle的文档明确指出:
无符号右移运算符">>>"将零移动到最左边的位置
但显然,当它必须超过32时,它实际上并不是它正在做的事情......
我正在为我的DAO编写一些测试,并且因为很多测试都使用了保存到我的数据库的测试对象,所以我创建了一个带有@Before和@After注释的setup()和teardown()方法为了避免冗余代码,但其中一个测试,实际上是一个不需要测试对象的测试,调用DAO中包含调用getCurrentSession().clear()的方法(这是一个使用ScrollableResults获取数据的方法)从db中批量生成,并避免内存填满它每隔50行调用flush()和clear()).这会产生一个问题,因为clear()实际上从会话中删除了setup()中创建的测试对象,因此当调用teardown()时会出现错误:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [nl.ru.cmbi.pdbeter.core.model.domain.PDBEntry#395]
有没有办法告诉JUnit不要在这个测试中使用setup()和teardown(),或者最好将所有不需要setup()和teardown()的测试放在一个新的测试类中?
我在理解@async注释的某个方面时遇到了一些困难,可能还有整个线程和线程池的工作方式.当我在spring配置文件中设置它时:
<task:executor id="WhifExecutor" pool-size="10"/>
<task:annotation-driven executor="WhifExecutor" />
Run Code Online (Sandbox Code Playgroud)
这不意味着只会启动10个线程吗?然而,当我运行一个具有@async 1000次的函数时,它会立即继续调用后的其余代码(控制台中会显示一条简单的消息来显示函数被调用的次数).然后一段时间后,池函数开始返回它们的值,但奇怪的是只有1个池和10个不同的线程.这里发生了什么?如何调用所有这1000个函数但只使用10个线程?它是否可能在启动线程之前将所有这些都放在某个堆栈上?我尝试阅读有关此文档的文档,但我找不到任何有关此现象的信息.
还有,有没有办法让它等待线程开始运行,这样我就不会立即调用几千个函数?
我写了一个小程序,在一小时内解决49151数独的任务,但我们不得不计时.我以为我只是让它运行然后检查执行时间,但它说-1536.087 s.我猜它与定时器是一些签名的dataype或其他东西,但我不知道在控制台中使用什么数据类型的定时器(代码::块控制台,我不知道这是否实际上是单独的控制台,或只是从本地操作系统运行终端的跑步者),所以我无法检查实时是什么.我宁愿不在我的程序中使用一些编码计时器再次运行它,因为我现在想再次使用我的电脑.有人知道这次会是什么时候吗?它应该在40到50分钟之间,所以在2400到3000秒之间.
我已经创建了自己的MutableInt类,它包含一个原始int和一些用于更改此int值或仅增加或减少1的方法.
我想知道是否有任何方法可以让这个类像Integer类一样工作,例如:
MutableInt foo = 42;
Run Code Online (Sandbox Code Playgroud)
要么
MutableInt foo = new MutableInt(41);
foo++;
Run Code Online (Sandbox Code Playgroud)
要么
MutableInt foo = new MutableInt(42);
int bar = foo;
Run Code Online (Sandbox Code Playgroud)
这在Java中可行吗?
当我跑:
String line = " test";
Pattern indentationPattern = Pattern.compile("^[\\s]+");
Matcher indentationMatcher = indentationPattern.matcher(line);
if (indentationMatcher.matches()) {
System.out.println("Got match!");
int indent = indentationMatcher.group(0).length();
System.out.println("Size of match: " + indent);
} else {
System.out.println("No match! :(");
}
Run Code Online (Sandbox Code Playgroud)
我得不到比赛.这里发生了什么?我在http://www.regexplanet.com/advanced/java/index.html上在线测试了正则表达式,它似乎专门用于在Java中测试正则表达式.
在Delphi中是否可以在所有其他窗口之上保持一个窗口?例如,当您的应用程序中有错误消息时,假设您希望将窗口保持在最顶层,并确保用户必须先单击某些内容才能执行其他操作.我真的是指任何事情,比如在后台点击另一个程序.在Java中怎么样?