当ActionEvent通过另一个方法运行时,某些JList操作未被执行JAVA

当ActionEvent通过另一个方法运行时,某些JList操作未被执行JAVA,java,swing,button,netbeans,actionevent,Java,Swing,Button,Netbeans,Actionevent,因此,我有一个按钮,用来添加一个新的用户,该用户的名字是从另一个类中获取的,在按下按钮后被添加到列表中。当我在构建和运行之后手动点击按钮时,它工作正常。问题是,当我通过另一个方法调用ActionEvent方法时,它会输出System.out.println文本,但不会向列表中添加任何新条目 有什么建议吗 下面是在按下按钮时调用的代码,该行由标记,addAuthor方法是否总是在事件调度线程上调用?JList和Swing中的所有内容都不是同步的或线程安全的,因此任何与Swing相关的修改/操作都必

因此,我有一个按钮,用来添加一个新的用户,该用户的名字是从另一个类中获取的,在按下按钮后被添加到列表中。当我在构建和运行之后手动点击按钮时,它工作正常。问题是,当我通过另一个方法调用ActionEvent方法时,它会输出System.out.println文本,但不会向列表中添加任何新条目

有什么建议吗

下面是在按下按钮时调用的代码,该行由标记,addAuthor方法是否总是在事件调度线程上调用?JList和Swing中的所有内容都不是同步的或线程安全的,因此任何与Swing相关的修改/操作都必须在该线程上进行。由于addAuthor方法与Swing组件交互,因此决不能从该线程以外的任何线程调用它。这适用于该类中的任何其他方法,如果主方法编写得很好,则可能除外

如果需要从非事件分派线程的线程调用addAuthor或任何其他直接与Swing组件交互的方法,请使用类似的方法调用该方法,该方法假定Swing窗体名为myUI:

SwingUtilities.invokeAndWait(new Runnable() {
  @Override public void run() {
    addAuthor();
  }
});
如果希望运行代码而不是等待代码完成,也可以使用invokeLater

如果您不确定代码是从哪个线程运行的,请使用以下经验法则:

主方法中的任何代码,或由主方法调用的任何代码,无论其深度有多深,都由主线程运行。 例如,main方法调用foo,foo调用bar,bar调用foobar。所有这些方法中的所有代码都由主线程运行。 如果您手动创建一个新线程,例如使用new Thread…start之类的东西,那么该代码以及它调用的所有方法中的代码都将从此线程运行。 用户界面调用的所有侦听器代码(例如,当您按下按钮时,上面的ActionListener)都由事件调度线程上的代码调用。 在事件分派线程上运行的代码是唯一可以安全地与Swing组件交互的代码。因此,具有与Swing组件(如ActionListener和addAuthor方法)交互的代码的方法只能从EDT中运行的代码中调用


如果您想从上面的任何其他线程1和线程2调用这些方法,您需要使用我在上面向您展示的方法,因为您不能直接这样做。

使用工作代码示例回答您的问题会更容易。请将您的代码发布为演示您的问题的示例。好的!现在我将更改它如果我在actionPerformed方法中得到一个错误:线程AWT-EventQueue-0 java.lang中出现异常。错误:另一方面,无法从事件调度器线程调用invokeAndWait,当我通过另一个方法调用actionPerformed方法时,代码似乎跳过了它…@user3749591:您不应该将此代码放在actionPerformed方法中。当Swing组件调用ActionPerformed方法时,该方法已在事件调度线程上执行。这段代码应该放在另一个方法中,即您调用ActionPerformed的方法中,但它似乎不起作用。@user3749591:Swing窗体中的所有组件和方法只能在事件分派线程中访问,否则您将遇到与您所面临的问题类似的问题。@user3749591:只需发布另一个方法的代码,我会解决的这是给你的。
public void actionPerformed(ActionEvent e) {
        System.out.println("ran action");

        addAuthor();
        System.out.println("authornamefinalfunc name: " + name);

        //Reset the text field.
        employeeName.requestFocusInWindow();
        //employeeName.setText("");

        //Select the new item and make it visible.
        list.setSelectedIndex(index);
        list.ensureIndexIsVisible(index);
        System.out.println("ran action final");
    }
    private void addAuthor()
    {
        String name = Global.s;

        int index = list.getSelectedIndex(); //get selected index
        if (index == -1) { //no selection, so insert at beginning
            index = 0;
        } else {           //add after the selected item
            index++;
        }

        listModel.insertElementAt(name, index);

    }
SwingUtilities.invokeAndWait(new Runnable() {
  @Override public void run() {
    addAuthor();
  }
});