我们有一个swing应用程序,它通过JNIWrapper嵌入IE ocx组件.
从jdk6切换到jdk7后,我们开始注意焦点问题.当嵌入式IE显示带有文本字段的网页(例如谷歌搜索页面)而不是麻烦开始时:
浏览器"捕获"焦点,因此您可以开始在搜索文本字段中输入内容.键入的每个键都转到IE ocx.但是,摆动似乎忽略了这种焦点变化.即使我将焦点更改为swing文本字段(并且swing显示闪烁的输入光标),所有键入的键都会转到IE ocx
"修复"焦点的唯一方法是取消激活并激活主框架.之后,焦点似乎是一致的.但是,如果我再次点击谷歌搜索文本字段,焦点将再次被打破.
似乎jdk7中的焦点处理有很大的变化.从链接:
在Windows平台上,已经实现了"合成焦点"的概念.这意味着焦点所有者组件仅模拟其可聚焦状态,而真实本机焦点设置为"焦点代理"组件.此组件接收键和输入方法本机消息,并将它们分派给焦点所有者.在JDK7之前,焦点代理组件是框架/对话框内的专用隐藏子组件.在JDK7中,框架/对话框本身用作焦点代理.现在,它代理不仅关注拥有窗口中的组件,还关注所有子组件.一个简单的窗口永远不会接收原生焦点,并依赖于其所有者的焦点代理.此机制对用户是透明的,但在调试时应予以考虑.
任何人都有想法"修复"这种行为?
编辑:这里有一些代码用JxBrowser重现问题
public static void main(String[] args) {
Browser browser = BrowserFactory.createBrowser(BrowserType.IE);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(browser.getComponent(), BorderLayout.CENTER);
JPanel panel = new JPanel();
frame.getContentPane().add(panel, BorderLayout.NORTH);
textField = new JTextField();
panel.add(textField);
textField.setColumns(10);
frame.setSize(700, 500);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
browser.navigate("http://www.google.com");
}
Run Code Online (Sandbox Code Playgroud) 我为Mac OS X下载了JDK7u4并安装了它.现在我想设置Eclipse来使用这个JDK.在Preferences > Java > Installed JREs什么位置,我应该为JRE家集?我把它安装在默认位置.
在为mac os安装jdk7u5之后,我为"普通"用户和root获得了不同的java版本.
java -version 给了我7.
sudo java -version 给了我6.
我抬头
/System/Library/Frameworks/JavaVM.framework/Versions/发现有一些链接.解决了指向真实目录的链接后,我再次尝试了整个路径.
/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java -version
- > 7
sudo /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java -version - > 6
和javac一样!
希望你们能帮助我!
我在Windows 64位上使用Oracle Java 7.
当我使用Files.createSymbolicLink创建符号链接时,我注意到这种行为:
符号链接的类型是固定的,永远不会更改,无论其目标是否有任何更改.
使用Windows的本机mklink命令,可以强制链接类型为"目录符号链接".是否可以使用本机Java API或某些库实现此目的?
一个琐碎和丑陋的方式是:
的fugly.
我有以下代码:
public static void main( String[] args ) {
System.out.println(Locale.getDefault());
File f = new File("/Users/johngoering/Documents");
File[] fs = f.listFiles();
for (File ff : fs) {
System.out.println(ff.getName());
System.out.println(ff.exists());
}
}
Run Code Online (Sandbox Code Playgroud)
在我的Documents文件夹中,我有一个名为"öß.pdf"的文件.这是Java 6下的输出:
en_US
(...)
öß.pdf
true
(...)
Run Code Online (Sandbox Code Playgroud)
但这是Java 7下的输出:
en_US
(...)
o????.pdf
false
(...)
Run Code Online (Sandbox Code Playgroud)
请特别注意,file.exists返回false的文件返回listFiles!! 是什么赋予了?有没有什么办法解决这一问题?这看起来像Java 7的bug ...
我正在尝试从java程序创建300M文件,我从旧的文件API切换到新的java 7 nio包,但是新的包比旧的更慢.
我看到的CPU利用率低于使用旧文件API时的CPU利用率,但我正在运行这个简单的代码,我得到0.5Mbytes/sec的文件传输速率,而java的写入正在读取一个磁盘并写入另一个(写入是访问磁盘的唯一进程).
Files.write(FileSystems.getDefault().getPath(filePath), fiveToTenKBytes, StandardOpenOption.CREATE);
Run Code Online (Sandbox Code Playgroud)
有没有希望在这里获得合理的吞吐量?
更新:
我正在从大文件中解包3亿个5-10k字节的图像文件.我有3个磁盘,1个本地磁盘和2个SAN连接(大型文件的典型吞吐率约为20MB /秒).
我也尝试过这段代码,它将速度提高到不到2MB /秒的吞吐量(解压缩这些文件需要9天).
ByteBuffer byteBuffer = ByteBuffer.wrap(imageBinary, 0, (BytesWritable)value).getLength());
FileOutputStream fos = new FileOutputStream( imageFile );
fos.getChannel().write(byteBuffer);
fos.close();
Run Code Online (Sandbox Code Playgroud)
我从本地磁盘读取并写入SAN连接磁盘.我正在阅读Hadoop SequenceFile格式,hadoop通常能够使用基本相同的代码以20MB /秒的速度读取这些文件.
除了超级缓慢之外,唯一看起来不合适的是,我看到更多的读取IO比写入IO大约2:1,尽管序列文件是gziped(图像实际上比例为1:1),所以压缩文件应该是约.输出1:1.
第二次更新
看着iostat我看到一些奇怪的数字,我们在这里看xvdf,我有一个java进程读取xvdb和写入xvdf并且没有活动的ohter进程xvdf
iostat -d 30
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
xvdap1 1.37 5.60 4.13 168 124
xvdb 14.80 620.00 0.00 18600 0
xvdap3 0.00 0.00 0.00 0 0
xvdf 668.50 2638.40 282.27 79152 8468
xvdg 1052.70 3751.87 2315.47 112556 69464 …Run Code Online (Sandbox Code Playgroud) 在Java 7中使用nio.2,当您创建这样的监视服务时:
WatchService watcher = FileSystems.getDefault().newWatchService();
Run Code Online (Sandbox Code Playgroud)
然后,启动后台线程,在无限循环内轮询文件系统事件.此线程的名称是"Thread-n",在调查线程转储或分析会话期间这有点令人讨厌.
我们可以更改该线程的名称吗?
我想使用java浏览器组件,假设它是由类JWebPane在jdk 7(javax.net包)中存在但是找不到它.
有这样的方法吗?
public <P, T extends List<P>> T getAwesomeList() {
// ...
}
Run Code Online (Sandbox Code Playgroud)
怎么编译没有任何警告?
Set<String> test = getAwesomeList();
Run Code Online (Sandbox Code Playgroud)
我认为这与通用擦除有关,但不确定编译器是怎么回事.这种情况发生在Java 7上,8时你会收到编译错误.
J8上有什么变化让这个不能编译?
更新:
经过仔细检查后,它还可以在Java 8上编译.
我正在迭代两个集合并检查两个集合是否包含相同的元素.我不能使用Java 8.
编辑1年后:
我在问题中创建了方法,以检查两个集合是否包含相同的元素,而不考虑我将两个Collection实现传递给方法的事实.
但Collection不确定元素的排序方式.我正在迭代收藏品.因此,Collection的某些实现可以以随机顺序保存元素,同时包含相同的元素.
如果所有元素都返回0 ,则两个集合都包含可比较的元素,并且内容定义为相等.x.compareTo(y)
如果其中一个为空,则将两个值定义为不同,而不是另一个.我想找到一种优雅的方法来比较nullity并防止对final进行null检查compareTo().
我目前的实施:
public static <T extends Comparable<T>> boolean isSame(@Nullable Collection<T> a, @Nullable Collection<T> b) {
if (a == null || b == null) {
return (a == null && b == null);
}
if (a.size() != b.size()) {
return false;
}
Iterator<T> aIt = a.iterator();
Iterator<T> bIt = b.iterator();
while (aIt.hasNext()) {
T aValue = aIt.next();
T bValue = bIt.next(); …Run Code Online (Sandbox Code Playgroud)