mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-13 03:45:19 +00:00
8043610: Sorting columns in JFileChooser fails with AppContext NPE
Reviewed-by: anthony, alexsch
This commit is contained in:
parent
e563c48360
commit
d454bf5946
@ -27,6 +27,8 @@ package com.sun.java.swing;
|
||||
|
||||
import sun.awt.EventQueueDelegate;
|
||||
import sun.awt.AppContext;
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.WeakHashMap;
|
||||
@ -117,8 +119,8 @@ public class SwingUtilities3 {
|
||||
public static RepaintManager getDelegateRepaintManager(Component
|
||||
component) {
|
||||
RepaintManager delegate = null;
|
||||
if (Boolean.TRUE == AppContext.getAppContext().get(
|
||||
DELEGATE_REPAINT_MANAGER_KEY)) {
|
||||
if (Boolean.TRUE == SunToolkit.targetToAppContext(component)
|
||||
.get(DELEGATE_REPAINT_MANAGER_KEY)) {
|
||||
while (delegate == null && component != null) {
|
||||
while (component != null
|
||||
&& ! (component instanceof JComponent)) {
|
||||
|
||||
@ -3411,7 +3411,7 @@ public abstract class Component implements ImageObserver, MenuContainer,
|
||||
(width > 0) && (height > 0)) {
|
||||
PaintEvent e = new PaintEvent(this, PaintEvent.UPDATE,
|
||||
new Rectangle(x, y, width, height));
|
||||
Toolkit.getEventQueue().postEvent(e);
|
||||
SunToolkit.postEvent(SunToolkit.targetToAppContext(this), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -63,6 +63,7 @@ import javax.swing.plaf.*;
|
||||
import static javax.swing.ClientPropertyKey.*;
|
||||
import javax.accessibility.*;
|
||||
|
||||
import sun.awt.SunToolkit;
|
||||
import sun.swing.SwingUtilities2;
|
||||
import sun.swing.UIClientPropertyKey;
|
||||
|
||||
@ -4802,7 +4803,8 @@ public abstract class JComponent extends Container implements Serializable,
|
||||
* @see RepaintManager#addDirtyRegion
|
||||
*/
|
||||
public void repaint(long tm, int x, int y, int width, int height) {
|
||||
RepaintManager.currentManager(this).addDirtyRegion(this, x, y, width, height);
|
||||
RepaintManager.currentManager(SunToolkit.targetToAppContext(this))
|
||||
.addDirtyRegion(this, x, y, width, height);
|
||||
}
|
||||
|
||||
|
||||
@ -4856,7 +4858,7 @@ public abstract class JComponent extends Container implements Serializable,
|
||||
// which was causing some people grief.
|
||||
return;
|
||||
}
|
||||
if (SwingUtilities.isEventDispatchThread()) {
|
||||
if (SunToolkit.isDispatchThreadForAppContext(this)) {
|
||||
invalidate();
|
||||
RepaintManager.currentManager(this).addInvalidComponent(this);
|
||||
}
|
||||
@ -4870,15 +4872,12 @@ public abstract class JComponent extends Container implements Serializable,
|
||||
}
|
||||
setFlag(REVALIDATE_RUNNABLE_SCHEDULED, true);
|
||||
}
|
||||
Runnable callRevalidate = new Runnable() {
|
||||
public void run() {
|
||||
synchronized(JComponent.this) {
|
||||
setFlag(REVALIDATE_RUNNABLE_SCHEDULED, false);
|
||||
}
|
||||
revalidate();
|
||||
SunToolkit.executeOnEventHandlerThread(this, () -> {
|
||||
synchronized(JComponent.this) {
|
||||
setFlag(REVALIDATE_RUNNABLE_SCHEDULED, false);
|
||||
}
|
||||
};
|
||||
SwingUtilities.invokeLater(callRevalidate);
|
||||
revalidate();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
100
jdk/test/javax/swing/JComponent/8043610/bug8043610.java
Normal file
100
jdk/test/javax/swing/JComponent/8043610/bug8043610.java
Normal file
@ -0,0 +1,100 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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 8043610
|
||||
@summary Tests that JComponent invalidate, revalidate and repaint methods could
|
||||
be called from any thread
|
||||
@author Petr Pchelko
|
||||
*/
|
||||
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
public class bug8043610 {
|
||||
private static volatile JFrame frame;
|
||||
private static volatile JComponent component;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
ThreadGroup stubTG = new ThreadGroup(getRootThreadGroup(), "Stub Thread Group");
|
||||
ThreadGroup swingTG = new ThreadGroup(getRootThreadGroup(), "SwingTG");
|
||||
try {
|
||||
Thread stubThread = new Thread(stubTG, SunToolkit::createNewAppContext);
|
||||
stubThread.start();
|
||||
stubThread.join();
|
||||
|
||||
CountDownLatch startSwingLatch = new CountDownLatch(1);
|
||||
new Thread(swingTG, () -> {
|
||||
SunToolkit.createNewAppContext();
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
frame = new JFrame();
|
||||
component = new JLabel("Test Text");
|
||||
frame.add(component);
|
||||
frame.setBounds(100, 100, 100, 100);
|
||||
frame.setVisible(true);
|
||||
startSwingLatch.countDown();
|
||||
});
|
||||
}).start();
|
||||
startSwingLatch.await();
|
||||
|
||||
AtomicReference<Exception> caughtException = new AtomicReference<>();
|
||||
Thread checkThread = new Thread(getRootThreadGroup(), () -> {
|
||||
try {
|
||||
component.invalidate();
|
||||
component.revalidate();
|
||||
component.repaint(new Rectangle(0, 0, 0, 0));
|
||||
} catch (Exception e) {
|
||||
caughtException.set(e);
|
||||
}
|
||||
});
|
||||
checkThread.start();
|
||||
checkThread.join();
|
||||
|
||||
if (caughtException.get() != null) {
|
||||
throw new RuntimeException("Failed. Caught exception!", caughtException.get());
|
||||
}
|
||||
} finally {
|
||||
new Thread(swingTG, () -> SwingUtilities.invokeLater(() -> {
|
||||
if (frame != null) {
|
||||
frame.dispose();
|
||||
}
|
||||
})).start();
|
||||
}
|
||||
}
|
||||
|
||||
private static ThreadGroup getRootThreadGroup() {
|
||||
ThreadGroup currentTG = Thread.currentThread().getThreadGroup();
|
||||
ThreadGroup parentTG = currentTG.getParent();
|
||||
while (parentTG != null) {
|
||||
currentTG = parentTG;
|
||||
parentTG = currentTG.getParent();
|
||||
}
|
||||
return currentTG;
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user