提交 7826344d 编写于 作者: L lana

Merge

...@@ -588,6 +588,10 @@ public class NimbusLookAndFeel extends SynthLookAndFeel { ...@@ -588,6 +588,10 @@ public class NimbusLookAndFeel extends SynthLookAndFeel {
} }
private void addDefault(String key, Object value) { private void addDefault(String key, Object value) {
if (compiledDefaults == null) {
return;
}
String prefix = parsePrefix(key); String prefix = parsePrefix(key);
if (prefix != null) { if (prefix != null) {
Map<String, Object> keys = compiledDefaults.get(prefix); Map<String, Object> keys = compiledDefaults.get(prefix);
......
...@@ -337,8 +337,7 @@ public class Utilities { ...@@ -337,8 +337,7 @@ public class Utilities {
// x before x0, return. // x before x0, return.
return 0; return 0;
} }
int currX = x0; int nextX = x0;
int nextX = currX;
// s may be a shared segment, so it is copied prior to calling // s may be a shared segment, so it is copied prior to calling
// the tab expander // the tab expander
char[] txt = s.array; char[] txt = s.array;
...@@ -388,19 +387,45 @@ public class Utilities { ...@@ -388,19 +387,45 @@ public class Utilities {
} else { } else {
nextX += metrics.charWidth(txt[i]); nextX += metrics.charWidth(txt[i]);
} }
if ((x >= currX) && (x < nextX)) { if (x < nextX) {
// found the hit position... return the appropriate side // found the hit position... return the appropriate side
int offset = ((round == false) || ((x - currX) < (nextX - x))) ? int offset;
(i - txtOffset) : (i + 1 - txtOffset);
// the length of the string measured as a whole may differ from // the length of the string measured as a whole may differ from
// the sum of individual character lengths, for example if // the sum of individual character lengths, for example if
// fractional metrics are enabled; and we must guard from this. // fractional metrics are enabled; and we must guard from this.
if (round) {
offset = i + 1 - txtOffset;
int width = metrics.charsWidth(txt, txtOffset, offset);
int span = x - x0;
if (span < width) {
while (offset > 0) {
int nextWidth = offset > 1 ? metrics.charsWidth(txt, txtOffset, offset - 1) : 0;
if (span >= nextWidth) {
if (span - nextWidth < width - span) {
offset--;
}
break;
}
width = nextWidth;
offset--;
}
}
} else {
offset = i - txtOffset;
while (offset > 0 && metrics.charsWidth(txt, txtOffset, offset) > (x - x0)) { while (offset > 0 && metrics.charsWidth(txt, txtOffset, offset) > (x - x0)) {
offset--; offset--;
} }
}
return offset; return offset;
} }
currX = nextX;
} }
// didn't find, return end offset // didn't find, return end offset
......
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
@bug 7048204
@summary NPE from NimbusLookAndFeel.addDefault
@author Pavel Porvatov
*/
import javax.swing.*;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;
public class Test7048204 {
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(new NimbusLookAndFeel());
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
new JLabel();
UIDefaults uid = UIManager.getDefaults();
uid.putDefaults(new Object[0]);
uid.put("what.ever", "else");
}
});
}
}
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 7045593
* @summary Possible Regression : JTextfield cursor placement behavior algorithm has changed
* @author Pavel Porvatov
*/
import sun.awt.SunToolkit;
import javax.swing.*;
import javax.swing.text.BadLocationException;
import java.awt.*;
public class bug7045593 {
private static volatile JTextField jtf;
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
jtf = new JTextField("WW");
JFrame frame = new JFrame();
frame.getContentPane().add(jtf);
frame.pack();
frame.setVisible(true);
}
});
((SunToolkit) SunToolkit.getDefaultToolkit()).realSync();
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
try {
Rectangle r = jtf.modelToView(1);
int delta = 2;
for (int x = r.x - delta; x < r.x + delta; x++) {
assertEquals(jtf.viewToModel(new Point(x, r.y)), 1);
}
System.out.println("Passed.");
} catch (BadLocationException e) {
throw new RuntimeException("Test failed", e);
}
}
});
}
private static void assertEquals(int i1, int i2) {
if (i1 != i2) {
throw new RuntimeException("Test failed, " + i1 + " != " + i2);
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册