这是我自己上一个问题的后续问题,我很尴尬地问这个......但无论如何:你将如何以独立于系统的方式从独立的Java程序启动第二个JVM?并且不依赖于例如像JAVA_HOME这样的env变量,因为它可能指向与当前正在运行的JRE不同的JRE.我提出了以下代码,它实际上有效,但感觉有点尴尬:
public static void startSecondJVM() throws Exception {
String separator = System.getProperty("file.separator");
String classpath = System.getProperty("java.class.path");
String path = System.getProperty("java.home")
+ separator + "bin" + separator + "java";
ProcessBuilder processBuilder =
new ProcessBuilder(path, "-cp",
classpath,
AnotherClassWithMainMethod.class.getName());
Process process = processBuilder.start();
process.waitFor();
}
Run Code Online (Sandbox Code Playgroud)
此外,当前运行的JVM可能已经启动了第二个JVM不知道的其他一些参数(-D,-X ...,...).
我有一个使用Swing的小型Java桌面应用程序.有一个数据输入对话框,其中包含一些不同类型的输入字段(JTextField,JComboBox,JSpinner,JFormattedTextField).当我通过在表单中进行选项卡或通过鼠标单击来激活JFormattedTextField时,我希望它选择它当前包含的所有文本.这样,用户就可以开始输入并覆盖默认值.
我怎样才能做到这一点?我确实使用了一个在JFormattedTextField上调用selectAll()的FocusListener/FocusAdapter,但它没有选择任何东西,尽管调用了FocusAdapter的focusGained()方法(参见下面的代码示例).
private javax.swing.JFormattedTextField pricePerLiter;
// ...
pricePerLiter.setFormatterFactory(
new JFormattedTextField.AbstractFormatterFactory() {
private NumberFormatter formatter = null;
public JFormattedTextField.AbstractFormatter
getFormatter(JFormattedTextField jft) {
if (formatter == null) {
formatter = new NumberFormatter(new DecimalFormat("#0.000"));
formatter.setValueClass(Double.class);
}
return formatter;
}
});
// ...
pricePerLiter.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
pricePerLiter.selectAll();
}
});
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?有趣的是,选择它的所有文本显然是JTextField和JSpinner的默认行为,至少在表格中选项时是这样.
我正在构建我的第一个Android应用程序.我遇到的问题是与a相关的日期的存储和本地化显示SimpleCursorAdapter
.我有一个类封装了SQLitedatabase
对三个表的访问.该类负责以ISO格式存储所有日期("yyyy-MM-dd").当从数据库中读取日期值并在屏幕上显示时,我希望它们以本地化格式进行格式化.这是我提出的方法.它使用a ViewBinder
来进行格式化:
adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor,
int columnIndex) {
if (view.getId() == R.id.text1) {
((TextView) view).setText(getDateFormatView().format(
parseDatabaseDate(cursor.getString(columnIndex))));
return true;
} else if (view.getId() == R.id.text2) {
((TextView)view).setText(
cursor.getString(columnIndex));
return true;
} else {
return false;
}
}
});
Run Code Online (Sandbox Code Playgroud)
getDateFormatView()
创建一个SimpleDateFormat
具有从中读取的模式的对象strings.xml
.parseDatabaseDate()
是否SimpleDateFormat
使用常量模式从数据库中解析日期yyyy-MM-dd
.
虽然这段代码工作得很好但我想知道是否有更好的方法来做到这一点.我不喜欢的是我需要:
SimpleDateFormat
对象(一个用于parseDatabaseDate()
解析日期字符串SQLiteDatabase
,另一个用于格式化值)java.util.Date
创建的对象然后立即丢弃所以这就是我要问的原因:是否有更好的方式以本地化格式显示日期?
android localization internationalization android-viewbinder
我有一套两种语言的文件:英语和德语.没有关于这些文档的可用元信息,程序只能查看内容.基于此,程序必须决定编写文档的两种语言中的哪一种.
是否有任何"标准"算法可以在几个小时内实现此问题?或者,可以执行此操作的免费.NET库或工具包?我知道LingPipe,但确实如此
这个问题似乎非常困难.我检查了谷歌AJAX语言API(我通过首先搜索这个网站找到),但它是非常糟糕的.对于我指出的六个德语网页,只有一个猜测是正确的.其他猜测是瑞典语,英语,丹麦语和法语......
我想出的一个简单方法是使用一个停用词列表.我的应用程序已经使用德国文档的这样一个列表,以便用Lucene.Net进行分析.如果我的应用程序扫描文档中是否出现任何一种语言的停用词,那么具有更多出现次数的那些将获胜.一个非常天真的方法,可以肯定,但它可能已经足够好了.不幸的是,我没有时间成为自然语言处理方面的专家,尽管这是一个有趣的话题.
我使用Akka及其Java API UntypedActor实现了一个Actor系统.在其中,一个actor(类型A)使用按需动态启动其他actor(类型B)getContext().actorOf(...);
.那些B演员会做一些A不再关心的计算.但我想知道:有没有必要在他们完成后清理那些B型演员?如果是这样,怎么样?
getContext().stop(getSelf())
在完成后给他们打电话?getSelf().tell(Actors.poisonPill());
在完成后给他们打电话?[这就是我现在正在使用的].文档对此并不清楚,或者我忽略了它.我有一些Scala的基本知识,但Akka的来源并不完全是入门级的东西......
当我使用Java开发一个(学术)软件时,我被迫使用一个执行得相当糟糕的API.这意味着对某一组输入数据的此API调用有时永远不会返回.这一定是软件中的一个错误,因为它提供的算法是确定性的,有时会终止于一组数据,有时它会在同一组数据上遇到无限循环......
但是,修复API或重新实现它只是超出范围.我甚至拥有源代码,但API很大程度上依赖于其他未记录且没有源代码的API,并且当时从网络上消失(或者从未在那里?).另一方面,这个"坏"API是解决我遇到的具体问题的唯一一个,所以我真的不得不坚持下去.
问题是:处理API的最干净的方法是什么呢?好吧,讨厌?当我遇到这个问题时,我决定将对API的调用放入一个单独的线程中.然后,另一个线程偶尔会检查此线程是否已终止.如果已经过了一定的时间,我会使用处理线程Thread#stop()
并再次开始处理,希望它会在下次返回.现在,我知道(并且当时知道)该方法已被弃用,不得使用.但是在这种学术背景下,软件可能会进入未定义状态而不是崩溃是可以接受的.
忽略已经遇到无限循环的处理线程也是不可接受的,因为它做了一些非常耗费CPU的操作,这会大大减慢用户的机器速度.
我没有尝试的另一种方法是在单独的进程而不是线程中开始处理,因为可以干净地杀死子进程而不会使软件处于不一致状态.或者新SwingWorker
课程(尚未提供)可以完成这项工作吗?它有一个cancel()
方法,但文档说它"尝试取消执行此任务",所以它看起来也不像是一个可靠的方法.
让一个演员在失败时再次尝试一些东西的好方法是什么,但重试之间的时间间隔越来越长?假设我希望演员在15秒后再尝试30秒,然后每分钟再尝试一次.
这是我想出的:
RetryInfo
参数,如果存在,则包含我们当前所在的重试次数ScheduleRetryMessage
的retryCount + 1
,然后抛出一个RuntimeExceptionnew OneForOneStrategy(-1, Duration.Inf()
返回Resume
作为其指令.演员没有状态,所以Resume
应该没问题ScheduleRetryMessage
,演员将
retryCount < MAX_RETRIES
:使用Akka的调度程序安排RetryMessage
在所需的延迟之后发送这是一个很好的解决方案还是有更好的方法?