在最多6个Java的所有版本中,放置在JScrollPane中的JTextPane的默认行为是:如果可能,在字边界处换行.如果没有,那么无论如何都要包装它们.
在JDK 7中,默认行为似乎是:如果可能,在字边界处换行.如果没有,只需扩展JTextPane的宽度(永远不要换长字).
这很容易重现,这是一个SSCCE:
public class WrappingTest extends JFrame
{
public static void main ( String[] args )
{
new WrappingTest();
}
public WrappingTest ()
{
setSize(200,200);
getContentPane().setLayout(new BorderLayout());
JTextPane jtp = new JTextPane();
JScrollPane jsp = new JScrollPane(jtp);
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
getContentPane().add(jsp,BorderLayout.CENTER);
setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
只需在JDK 6和JDK 7中运行它,写一些小字,然后写一个长字,你就会看到差异.
我的问题很简单...... JDK 7中的新默认行为完全混淆了我的程序(他们应该更加小心Oracle更改这种默认值......它们似乎并不重要但是当你使用JTextPane显示时通常包含非常长的字母串的数据,它们并不是那么不重要 - 实际上我要提交错误报告,但是我想在/如果它们不解决它的情况下有一个解决方法).有什么方法可以回到以前的行为?
请注意,我已经检查了相关问题的答案.如何在JTextPane中实现自动换行,以及如何使其包装不带空格的字符串?但是它没有回答这个问题 - 它提供了一种使JTextPane包装完全不考虑空白的方法,但对我来说,如果可能的话,所需的行为是在空白处分割行,如果不可能的话,在其他地方(如以前的Java)版本).
注意,您无法使用Java 1.7 jarsigner签署Android APK.所以我想知道为什么这是1.6和1.7签名者有什么区别?
我们使用了一些varargs函数,当我们转向java 1.7时,我们得到了一个奇怪的未经检查的警告.
功能在接口ICache中添加
public interface ICache<O> {
void add(Object source, O... objects);
}
Run Code Online (Sandbox Code Playgroud)
在界面中报告错误.
ICache.java:18: warning: [unchecked] Possible heap pollution from parameterized vararg type O
void add(Object source, O... objects);
where O is a type-variable:
O extends Object declared in interface ICache
1 warning
Run Code Online (Sandbox Code Playgroud)
O扩展了Object,作为其通用缓存类.
我阅读了xlint警告并且我们在未经检查的情况下编译,但是http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings似乎暗示这个错误应该是[varargs]类型不是未经检查的类型.
我错过了什么吗?
我正在尝试在字符串功能上使用新的Java 7开关.
但是Tomcat没有合作.
我确保tomcat在java 7下运行,但它似乎没有在它下面进行编译.
我已将以下内容添加到jsp servlet条目下的web.xml文件中
<init-param>
<param-name>compiler</param-name>
<param-value>C:/Program Files/Java/jdk1.7.0/bin/javac.exe</param-value>
</init-param>
Run Code Online (Sandbox Code Playgroud)
但它似乎没有做到这一点.
任何提示将不胜感激.
我非常想写这个:
Lists.transform(vals,
new Function<>() {
public List<ValEntry> apply(Validator<? super T> input) {
return input.validate(value);
}
});
Run Code Online (Sandbox Code Playgroud)
...比这个:
Lists.transform(vals,
new Function<Validator<? super T>, List<ValEntry>>() {
public List<ValEntry> apply(Validator<? super T> input) {
return input.validate( value );
}
});
Run Code Online (Sandbox Code Playgroud)
但Java编译器给我以下错误消息:
'<>' cannot be used with anonymous classes
Run Code Online (Sandbox Code Playgroud)
有这个根本原因吗?或者刚刚跳过JDK 7中的功能,也许它们是在8中完成的?
我将现有的代码库切换到Java 7,我不断收到此警告:
warning: File for type '[Insert class here]' created in the last round
will not be subject to annotation processing.
Run Code Online (Sandbox Code Playgroud)
快速搜索显示没有人发出此警告.
它没有在javac编译器源中记录:
从OpenJDK\langtools\src\share\classes\com\sun\tools\javac\processing\JavacFiler.java
private JavaFileObject createSourceOrClassFile(boolean isSourceFile, String name) throws IOException {
checkNameAndExistence(name, isSourceFile);
Location loc = (isSourceFile ? SOURCE_OUTPUT : CLASS_OUTPUT);
JavaFileObject.Kind kind = (isSourceFile ?
JavaFileObject.Kind.SOURCE :
JavaFileObject.Kind.CLASS);
JavaFileObject fileObject =
fileManager.getJavaFileForOutput(loc, name, kind, null);
checkFileReopening(fileObject, true);
if (lastRound) // <-------------------------------TRIGGERS WARNING
log.warning("proc.file.create.last.round", name);
if (isSourceFile)
aggregateGeneratedSourceNames.add(name);
else
aggregateGeneratedClassNames.add(name);
openTypeNames.add(name);
return new FilerOutputJavaFileObject(name, fileObject);
}
Run Code Online (Sandbox Code Playgroud)
这意味着什么以及我可以采取哪些步骤来清除此警告?
谢谢.
更新:Oracle已将此确认为错误.
简介:某些在JDK 1.6中工作的自定义BeanInfos和PropertyDescriptors在JDK 1.7中失败,有些只在垃圾收集运行并且清除了某些SoftReferences后才会失败.
编辑:这也将打破
ExtendedBeanInfo在春季3.1,如帖子底部所述.编辑:如果您调用JavaBeans规范的第7.1或8.3节,请准确说明规范的这些部分需要什么.在这些部分中,语言不是必要的或规范性的.这些部分中的语言是示例中的语言,这些示例最好不明确作为规范.此外,
BeanInfoAPI特别允许人们更改默认行为,并在下面的第二个示例中明确区分.
Java Beans规范查找具有void返回类型的默认setter方法,但它允许通过a定制getter和setter方法java.beans.PropertyDescriptor.使用它的最简单方法是指定getter和setter的名称.
new PropertyDescriptor("foo", MyClass.class, "getFoo", "setFoo");
Run Code Online (Sandbox Code Playgroud)
这在JDK 1.5和JDK 1.6中有效,以指定setter名称,即使它的返回类型不是void,如下面的测试用例中所示:
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import org.testng.annotations.*;
/**
* Shows what has worked up until JDK 1.7.
*/
public class PropertyDescriptorTest
{
private int i;
public int getI() { return i; }
// A setter that my people call "fluent".
public PropertyDescriptorTest setI(final int i) { this.i = i; return this; }
@Test …Run Code Online (Sandbox Code Playgroud) 我找到了一些专门用于在VirtualMachine中进行调试的com.sun.jdi类,但我不能使用它,因为Sun JDK7中似乎不存在包.
如何使用这个包?
BTW.lib/sa-jdi.jar是不是我想要的
我是一名高级解决方案架构师,但我最近偶然发现了一个让我停下来思考的问题......
对我来说,下面的代码总是应该触发错误,但当我的一位同事问我为什么Eclipse没有显示错误时,我无法回答任何问题.
class A {
public static void main(String... args) {
System.out.println(new Object() == 0);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经调查过,发现在源级别为1.6时确实会抛出一个错误:
incomparable types: Object and int
Run Code Online (Sandbox Code Playgroud)
但现在在1.7中编译好了.
请问,有哪些新功能可以保证这种行为?
尝试在Java中java.nio.file.DirectoryNotEmptyException递归删除从Delete目录中删除的递归删除方法中的偶然问题
代码(归功于@TrevorRobinson):
static void removeRecursive(Path path) throws IOException {
Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
logger.warn("Deleting " + file.getFileName());
Files.delete(file);
logger.warn("DELETED " + file.getFileName());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
// try to delete the file anyway, even if its attributes could
// not be read, since delete-only access is theoretically possible
// I NEVER SEE …Run Code Online (Sandbox Code Playgroud)