标签: java-7

重点关注JDK7和本机组件的问题

我们有一个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)

java java-native-interface swing java-7 jxbrowser

6
推荐指数
1
解决办法
3384
查看次数

在Mac OS X上为Eclipse设置JDK7u4的JRE主页是什么?

我为Mac OS X下载了JDK7u4并安装了它.现在我想设置Eclipse来使用这个JDK.在Preferences > Java > Installed JREs什么位置,我应该为JRE家集?我把它安装在默认位置.

java eclipse macos java-7

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

来自root的mac os java版本是不同的

在为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一样!

希望你们能帮助我!

java macos java-7

6
推荐指数
1
解决办法
2623
查看次数

如何强制Java 7在Windows上创建"目录符号链接"而不是"文件符号链接"?

我在Windows 64位上使用Oracle Java 7.

当我使用Files.createSymbolicLink创建符号链接时,我注意到这种行为:

  1. 如果目标是目录,则创建"目录符号链接".
  2. 如果目标是文件,则创建"文件符号链接".
  3. 如果目标不存在,则创建"文件符号链接".

符号链接的类型是固定的,永远不会更改,无论其目标是否有任何更改.

使用Windows的本机mklink命令,可以强制链接类型为"目录符号链接".是否可以使用本机Java API或某些库实现此目的?

一个琐碎和丑陋的方式是:

  1. 如果目标是目录,只需创建链接
  2. 如果目标不存在,请创建新的空目标目录,创建链接并删除目录.
  3. 如果目标是文件......处理它(移动它,应用#2,将其移回).

的fugly.

java windows symlink java-7

6
推荐指数
1
解决办法
2634
查看次数

OS X中Java 7文件名的编码问题

我有以下代码:

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 macos encoding file java-7

6
推荐指数
1
解决办法
1394
查看次数

Java 7的nio.file包在创建新文件时非常慢

我正在尝试从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 file-io java-7 nio2

6
推荐指数
1
解决办法
1290
查看次数

(Java 7 NIO.2)监视服务线程的自定义名称

在Java 7中使用nio.2,当您创建这样的监视服务时:

WatchService watcher = FileSystems.getDefault().newWatchService();
Run Code Online (Sandbox Code Playgroud)

然后,启动后台线程,在无限循环内轮询文件系统事件.此线程的名称是"Thread-n",在调查线程转储或分析会话期间这有点令人讨厌.

我们可以更改该线程的名称吗?

java nio java-7

6
推荐指数
1
解决办法
435
查看次数

无法在jdk 7中找到JWebPane

我想使用java浏览器组件,假设它是由类JWebPane在jdk 7(javax.net包)中存在但是找不到它.

java java-7

6
推荐指数
1
解决办法
3564
查看次数

如何推断泛型方法调用的类型参数?

有这样的方法吗?

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 generics type-inference java-7 java-8

6
推荐指数
0
解决办法
238
查看次数

以优雅的方式检查两个参数为null

我正在迭代两个集合并检查两个集合是否包含相同的元素.我不能使用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)

java collections null iterator java-7

6
推荐指数
1
解决办法
128
查看次数