我通过使用Executor玩SwingWorker的多线程,我在那里错误地从Vector中识别出错误的元素,看起来像这个代码相当忽略了Vector中的元素不存在
我的问题 - >如何/有可能以某种方式捕获此异常
简单的输出
run:
Thread Status with Name :StartShedule, SwingWorker Status is STARTED
Thread Status with Name :StartShedule, SwingWorker Status is DONE
Thread Status with Name :StartShedule, SwingWorker Status is STARTED
Thread Status with Name :StartShedule, SwingWorker Status is DONE
Thread Status with Name :StartShedule, SwingWorker Status is STARTED
Thread Status with Name :StartShedule, SwingWorker Status is DONE
BUILD SUCCESSFUL (total time: 11 seconds)
Run Code Online (Sandbox Code Playgroud)
通过取消注释
//changeTableValues1(); // un-comment for get ArrayIndexOutOfBoundsException
Run Code Online (Sandbox Code Playgroud)
一切都正确,我得到ArrayIndexOutOfBoundsException并输出
run:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: …Run Code Online (Sandbox Code Playgroud) 1.考虑我的代码是在我的JPanel的某些行上,我是否自动在EDT上?
2.对于不属于GUI,JPanels或其他视图类,简单逻辑类的所有其他类的同名问题.
3.如果我有JPanel我正在播放音乐,那么音乐应该在事件发送线程上运行还是在非EDT的其他线程上运行(因为我没有遇到任何运行问题)来自EDT)?
注意:我想要一般规则如何在不使用SwingUtilities.isEventDispatchThread()
Thanks的情况下了解它
在这里作为答案给出的许多Swing片段中,有一个SwingUtilities#invokeLater来自该main方法的调用:
public class MyOneClassUiApp {
private constructUi() {
// Some Ui related Code
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MyOneClassUiApp().constructUi();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
但根据Threads and Swing的文章,从主线程构造UI是安全的:
一些方法是线程安全的:在Swing API文档中,线程安全方法用以下文本标记:
虽然大多数Swing方法都不是,但这种方法是线程安全的.
应用程序的GUI通常可以构造并显示在主线程中:只要没有实现组件(Swing或其他),以下典型代码是安全的:
public class MyApplication {
public static void main(String[] args) {
JFrame f = new JFrame("Labels");
// Add components to
// the frame here...
f.pack();
f.show();
// Don't do any more GUI work here...
} …Run Code Online (Sandbox Code Playgroud) 有人知道如何开始在 Java Swing 中调试此错误吗?
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.BoxLayout.preferredLayoutSize(BoxLayout.java:282)
at java.awt.Container.preferredSize(Container.java:1599)
at java.awt.Container.getPreferredSize(Container.java:1584)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1636)
at java.awt.BorderLayout.layoutContainer(BorderLayout.java:804)
at java.awt.Container.layout(Container.java:1421)
at java.awt.Container.doLayout(Container.java:1410)
at java.awt.Container.validateTree(Container.java:1507)
at java.awt.Container.validateTree(Container.java:1513)
at java.awt.Container.validate(Container.java:1480)
at javax.swing.plaf.basic.BasicTabbedPaneUI.ensureCurrentLayout(BasicTabbedPaneUI.java:1429)
at javax.swing.plaf.basic.BasicTabbedPaneUI.getTabBounds(BasicTabbedPaneUI.java:1449)
at javax.swing.plaf.synth.SynthTabbedPaneUI.setRolloverTab(SynthTabbedPaneUI.java:491)
at javax.swing.plaf.basic.BasicTabbedPaneUI$TabbedPaneLayout.layoutContainer(BasicTabbedPaneUI.java:2384)
at java.awt.Container.layout(Container.java:1421)
at java.awt.Container.doLayout(Container.java:1410)
at java.awt.Container.validateTree(Container.java:1507)
at java.awt.Container.validate(Container.java:1480)
at javax.swing.plaf.basic.BasicTabbedPaneUI.ensureCurrentLayout(BasicTabbedPaneUI.java:1429)
at javax.swing.plaf.basic.BasicTabbedPaneUI.getTabBounds(BasicTabbedPaneUI.java:1449)
at javax.swing.plaf.synth.SynthTabbedPaneUI.setRolloverTab(SynthTabbedPaneUI.java:498)
at javax.swing.plaf.basic.BasicTabbedPaneUI.setRolloverTab(BasicTabbedPaneUI.java:558)
at javax.swing.plaf.basic.BasicTabbedPaneUI.access$2000(BasicTabbedPaneUI.java:37)
at javax.swing.plaf.basic.BasicTabbedPaneUI$Handler.mouseMoved(BasicTabbedPaneUI.java:3645)
at java.awt.Component.processMouseMotionEvent(Component.java:6333)
at javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3285)
at java.awt.Component.processEvent(Component.java:6057)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4651)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4251)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at …Run Code Online (Sandbox Code Playgroud) 我们的一位客户在我们的申请中报告了一个例外.问题是,我完全无法理解如何重现这个bug.
这是代码:
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
popup.show(btn, 3, btn.getHeight());
}
});
Run Code Online (Sandbox Code Playgroud)
备注:
btn是类型的最终局部变量JButton.popup是类型的最终局部变量JPopupMenu.抛出以下异常:
java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
at java.awt.Component.getLocationOnScreen_NoTreeLock(Unknown Source)
at java.awt.Component.getLocationOnScreen(Unknown Source)
at javax.swing.JPopupMenu.show(Unknown Source)
at fr.def.iss.vd2.mod_site_watcher_gui.SiteElementPanel$4.actionPerformed(SiteElementPanel.java:117)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.focusLost(Unknown Source)
at java.awt.Component.processFocusEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at …Run Code Online (Sandbox Code Playgroud) 不确定这是否是正确的问题,但我遇到了Java问题.我有一些Java代码在Java 6中工作但在Java 7中没有,错误是:
java.lang.IllegalStateException: This function should be called while holding treeLock
Run Code Online (Sandbox Code Playgroud)
使用Java6可以工作,但我们的一些外部用户正在运行Java 7.我发现错误是由调用引起的validateTree(),它在java6中工作但在Java7中我们需要调用validate().当我在本地测试时,它可以工作.
这里是我的问题,我开始在一家大公司工作,他们不会让我们对代码做任何修改,直到其被非常throughly看了看(我的工作变化,将采取在2013年4月影响),但在那之前我们的用户生气了.我不是最好的Java,并想知道是否有一种方法可以传递运行时参数来改变它?或者有什么我可以做而不触及代码库?
我很不好意思问这个问题,因为它可以通过实施修复来轻松解决,但任何想法或方向都会非常有用.
更新:我理想地寻找可以获得支持的东西,以放入java运行时参数,该参数将更改对validate()的所有validateTree()引用.
我们都知道我们应该从事件调度线程完成所有与GUI相关的任务,否则可能会引入奇怪的错误 - 我试着记住这个规则,但我必须承认我最近注意到了几个我没有的地方.
有没有办法识别所有违反此规则的行为,以便修复它们?我已经看到这里有一个相关的findbugs规则,但它似乎并没有抓住我的所有情况.即使在发生违规时抛出异常也很好,所以我可以修复它(或者捕获异常并记录警告以防用户遇到相关问题.)
人们通常采取什么方法?
问题
我们的独立Swing应用程序在某些特定事件(按钮单击等)上显示模态JDialog.该对话框包含一些其他Swing组件(JLabel,JButtons,...).而不是通过JDialog.setBounds(...)我们调用的方法JDialog.pack()(或者方法隐式调用它)显式设置其维度.通过方法计算的维数总是不变的(例如300x100像素.)不幸的是,有时可见对话框的实际维度是1x1 px().JOptionPaneshowDialog(...)pack()JDialog.getSize().equals(new Dimension(1, 1))
JDialog初始化
我们JDialog在应用程序中初始化s 有两种方法.我们检查了两个初始化方法总是从EventDispatchThread调用.
第一种方法
我们只创建一个ADialog其子类的实例JDialog.这是我们的初始化过程的片段:
ADialog dialog = new ADialog();
dialog.setContentPane(content);
dialog.setVisible(true);
Run Code Online (Sandbox Code Playgroud)
这是我们的ADialog实施:
public class ADialog extends JDialog implements ComponentListener {
public JfosDialog(Frame owner) {
super(owner);
init();
}
private void init() {
super.addComponentListener(this);
}
@Override
public void componentShown(ComponentEvent e) {
// Calling pack() at this place is really weird, but we
// have to do …Run Code Online (Sandbox Code Playgroud) package donut;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import javax.swing.JPanel;
public class Board extends JPanel{
public void paint(Graphics g)
{
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
RenderingHints rh =
new RenderingHints(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
rh.put(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2.setRenderingHints(rh);
Dimension size = getSize();
double w = size.getWidth();
double h = size.getHeight();
Ellipse2D e = new Ellipse2D.Double(0, 0, 80, 130);
g2.setStroke(new BasicStroke(1));
g2.setColor(Color.gray);
for (double deg = 0; deg < 360; deg += 5) { …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Swing创建一个测试互斥算法的平台.我的目的是在GUI中显示它们之间发送的服务器和消息.我还想显示一个关键部分,显示当前正在访问它的服务器.我正在使用一个执行SwingWorker线程的线程池来部署加载用户选择的互斥算法的服务器.
程序按预期运行,直到我尝试实现消息显示.为了显示每条消息的箭头,我扩展了SwingWorker,UIArrowThread,以添加一个从源服务器向目标绘制箭头的JLabel.在删除JLabel之前,此线程等待1秒.当我明确地创建一个或多个这些消息时,这似乎工作正常(我还创建了一个可以创建特定消息的测试平台).
当我尝试将此SwingWorker线程集成到程序中时,问题就出现了.启动算法时,每个服务器都会尝试访问关键部分并将其请求发送到每个其他服务器.这应该调用UIArrowThread,但似乎只有一些服务器实际上创建了该线程.
public void sendMsg(int destId, Object ... objects) {
comm.sendMsg(destId, objects);
try{
UIArrowThread a = new UIArrowThread(AlgorithmSimulatorUI.jlp,
objects[0].toString(),
comm.getMyId(),
destId);
AlgorithmSimulatorUI.threadPool.execute(a);
} catch (Exception exc){
System.err.println(exc);
}
}
Run Code Online (Sandbox Code Playgroud)
有些服务器似乎在实例化UIArrowThread之前就停止执行,最终导致死锁.任何使它通过该点的服务器都能正常工作,GUI显示应该是正常的.我在调用UIArrowThread之前和它的构造函数中测试了日志.看起来停止执行的线程永远不会在构造函数中进行日志调用.我很难理解为什么会发生这种情况.
public class UIArrowThread extends SwingWorker<Integer, String>{
JLayeredPane jlp;
String type;
int source;
int target;
Point start;
Point end;
Point[] points;
int quadrant;
public UIArrowThread(JLayeredPane jlp, String msg_type, int source,
int target){
this.jlp = jlp;
this.type = msg_type;
this.source = source;
this.target = target;
this.points = getPoints();
this.start = points[0]; …Run Code Online (Sandbox Code Playgroud)