Java JTextArea/JTextComponent setText导致崩溃

Java JTextArea/JTextComponent setText导致崩溃,java,swing,settext,Java,Swing,Settext,我对Java基本上是新手,尤其是对Swing库。当我尝试记事本演示(来自JDK的标准演示)时,我在试图更改编辑器窗口中的文本时遇到了崩溃。我的示例代码: void Filter(Component f){ if (f instanceof JTextComponent){ JTextComponent textComponent = (JTextComponent) f; textComponent.setVisible(false); //Works textCom

我对Java基本上是新手,尤其是对Swing库。当我尝试记事本演示(来自JDK的标准演示)时,我在试图更改编辑器窗口中的文本时遇到了崩溃。我的示例代码:

void Filter(Component f){
  if (f instanceof JTextComponent){
    JTextComponent textComponent = (JTextComponent) f;
    textComponent.setVisible(false); //Works
    textComponent.setVisible(true); //Works
    textComponent.getText(); //Works
    textComponent.updateUI(); //Works
    textComponent.setText("Hello world!"); //Crashes
  }else{
    RecursiveGet(f);
  }
}
void RecursiveGet(Component c){
  for (Component f : ((JComponent) c).getComponents()) {
    if (f instanceof JComponent) {
      Filter(f);
    }
  }
}
我搜索了例如JTextComponent,直到找到它,然后测试了一些方法。我想我遗漏了一些东西,一些细节。我的环境是JDK 1.7、JRE 7.0、Win7 x64。我很乐意得到任何帮助。多谢各位

更新 我添加了异常处理程序

void Filter(Component f){
        if (f instanceof JTextComponent){
            JTextComponent textComponent = (JTextComponent) f;
            textComponent.setVisible(false);  //Work
            textComponent.setVisible(true);  //Work
            textComponent.getText();  //Work
            textComponent.updateUI(); //Work
            try {
            textComponent.setText("Hello world!"); //Crash
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else{
            RecursiveGet(f);
        }
    }
还有这个

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at javax.swing.plaf.synth.SynthContext.getPainter(Unknown Source)
        at javax.swing.plaf.synth.SynthTextAreaUI.update(Unknown Source)
        at javax.swing.JComponent.paintComponent(Unknown Source)
        at javax.swing.JComponent.paint(Unknown Source)
        at javax.swing.JComponent.paintChildren(Unknown Source)
        at javax.swing.JComponent.paint(Unknown Source)
        at javax.swing.JViewport.paint(Unknown Source)
        at javax.swing.JComponent.paintChildren(Unknown Source)
        at javax.swing.JComponent.paint(Unknown Source)
        at javax.swing.JComponent.paintChildren(Unknown Source)
        at javax.swing.JComponent.paint(Unknown Source)
        at javax.swing.JComponent.paintToOffscreen(Unknown Source)
        at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown S
ource)
        at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
        at javax.swing.RepaintManager.paint(Unknown Source)
        at javax.swing.JComponent._paintImmediately(Unknown Source)
        at javax.swing.JComponent.paintImmediately(Unknown Source)
        at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
        at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
        at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
        at javax.swing.RepaintManager.access$700(Unknown Source)
        at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
        at java.awt.event.InvocationEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$000(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
更新2
setText方法在添加异常处理程序块之后工作。但我错过了什么?

这不是一个答案,而是一个代码帖子,显示您的方法或其变体,允许编码者更改要发布的文本:

import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.text.*;

@SuppressWarnings("serial")
public class TestFilter extends JPanel {
   public TestFilter() {
      JPanel textFieldPanel = new JPanel(new GridLayout(0, 3));
      for (int i = 0; i < 15; i++) {
         textFieldPanel.add(new JTextField(10));
      }

      JPanel buttonPanel = new JPanel();
      buttonPanel.add(new JButton(new FilterAction("Show Text", "Hello World")));
      buttonPanel.add(new JButton(new FilterAction("Clear Text", "")));

      setLayout(new BorderLayout());
      add(textFieldPanel, BorderLayout.NORTH);
      add(new JScrollPane(new JTextArea(10, 15)));
      add(buttonPanel, BorderLayout.SOUTH);
   }

   private class FilterAction extends AbstractAction {
      private String text;

      public FilterAction(String name, String text) {
         super(name);
         this.text = text;
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         filter(TestFilter.this, text);
      }
   }

   void filter(Component f, String text) {
      if (f instanceof JTextComponent) {
         JTextComponent textComponent = (JTextComponent) f;
         textComponent.setVisible(false); // Works
         textComponent.setVisible(true); // Works
         textComponent.getText(); // Works
         textComponent.updateUI(); // Works
         textComponent.setText(text); // Crashes
      } else {
         RecursiveGet(f, text);
      }
   }

   void RecursiveGet(Component c, String text) {
      for (Component f : ((JComponent) c).getComponents()) {
         if (f instanceof JComponent) {
            filter(f, text);
         }
      }
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("TestFilter");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new TestFilter());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
import java.awt.*;
导入java.awt.event.ActionEvent;
导入javax.swing.*;
导入javax.swing.text.*;
@抑制警告(“串行”)
公共类TestFilter扩展了JPanel{
公共测试过滤器(){
JPanel textFieldPanel=新的JPanel(新的网格布局(0,3));
对于(int i=0;i<15;i++){
添加(新的JTextField(10));
}
JPanel buttonPanel=新的JPanel();
add(newjbutton(newfilteraction(“showtext”、“helloworld”));
add(newjbutton(newfilteraction(“明文”));
setLayout(新的BorderLayout());
添加(textFieldPanel,BorderLayout.NORTH);
添加(新的JScrollPane(新的JTextArea(10,15));
添加(按钮面板,边界布局。南部);
}
私有类FilterAction扩展了AbstractAction{
私有字符串文本;
公共筛选器操作(字符串名称、字符串文本){
超级(姓名);
this.text=文本;
}
@凌驾
已执行的公共无效操作(操作事件e){
过滤器(TestFilter.this,text);
}
}
无效过滤器(组件f,字符串文本){
if(JTextComponent的f instanceof){
JTextComponent textComponent=(JTextComponent)f;
textComponent.setVisible(false);//有效
textComponent.setVisible(true);//有效
textComponent.getText();//有效
textComponent.updateUI();//有效
textComponent.setText(text);//崩溃
}否则{
递归获取(f,文本);
}
}
void RecursiveGet(组件c,字符串文本){
对于(组件f:((JComponent)c).getComponents()){
if(f JComponent的实例){
过滤器(f,文本);
}
}
}
私有静态void createAndShowGui(){
JFrame=新JFrame(“测试过滤器”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(新的TestFilter());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGui();
}
});
}
}

因此,问题很可能是您如何调用您的方法,这是您尚未向我们展示的。

根据您对原始问题的评论

[…]它在另一个线程中工作,但[原始]线程在创建所有对象后启动

修改Swing组件的所有代码都必须在事件分派线程中运行。如果你等到所有的东西都被创造出来,这是不够的

java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
        // modify swing components
    }
});
您可能需要阅读以下内容:


…这是:

是否报告了任何错误?您所说的崩溃是什么意思?它会引发异常吗?如果是,那是什么?我的意思是记事本应用程序被冻结,无法响应我的操作。如果您是从命令行运行程序,请查看输出。如果您在IDE中运行,请查看“输出”选项卡。如果没有,请在您的系统设置中启用Java控制台。您的代码是否在事件调度线程上运行?好的,我尝试显示所有代码,但不要责怪我),正如我所说的,这是它的实验。+1用于发布可运行代码,并显示
setText
实际工作:-)@Darius不,不要显示所有代码。发布一个演示您的问题的帖子。根据堆栈跟踪,此异常来自事件调度线程。在原始问题的注释中,他写道:“它在另一个线程中工作,但线程在创建所有对象后启动…”