【问题标题】:Problems with mainThread主线程问题
【发布时间】:2013-05-31 15:36:39
【问题描述】:

我试图解决这个问题好几天了。我的程序编辑图像。 我没有使用多线程。

我正在使用在 JTextPane 中写入格式化文本的函数(private void console())。 我有一个名为 ImageWork() 的类,它适用于我的图片。

我的问题:我首先调用 console("start with work") 函数,然后我调用 我的班级编辑图像的功能(需要一些时间)。然后我再次调用了我的控制台(“完成”)函数。我已经尝试了很多方法来编辑图像的方法等到控制台功能准备好但没有成功:(。 所以每次我首先调用 3 个函数时,图像都会被编辑,然后控制台函数会在我的文本窗格中写入两个文本。

private void color2gray()             
{           
       console("start")       
    try         
       {  
        myImg.color2gray();   
        console("success");   
        repaint();    
    } 
    catch (Exception e) 
    {
        console("no success");
    }

程序运行良好。我的问题是我希望我的控制台 (JtextPane) 中的文本现在启动该函数,然后启动 color2gray 函数,因为该函数可能需要一分钟来处理大图片。

我已经尝试过将控制台返回类型更改为布尔值并调用它:

  while (!(console("start")) {};

如果有人能解决这个问题,我会很高兴。谢谢

console() 代码:

private void console(String str,boolean fehler)         
{               
    time=new GregorianCalendar();

    String help=time.getTime().toString();
    help=help.substring(0,19);

    doc = (StyledDocument) console.getDocument();
    Style style = doc.addStyle("StyleName", null);

    StyleConstants.setForeground(style, Color.black);
    try { doc.insertString(doc.getLength(),help, style); } 
    catch (BadLocationException e) { e.printStackTrace(); }

    if (fehler) StyleConstants.setForeground(style, Color.red);
    else StyleConstants.setForeground(style, new Color(0,125,0));

    try {   doc.insertString(doc.getLength()," :  "+str+"\n", style); } 
    catch (BadLocationException e1) { e1.printStackTrace(); }
}

【问题讨论】:

  • 对不起,我不明白你的问题是什么。请编辑您的帖子以使其更清晰。
  • 我们需要查看更多代码。
  • 好吧,我试着说清楚
  • 会发生什么?您是否遇到异常或程序永远不会退出?
  • 不知道这有多相关,但您首先说您没有使用多线程 - 但 Swing 框架是多线程的......请参阅docs.oracle.com/javase/tutorial/uiswing/concurrency

标签: java multithreading swing wait jtextpane


【解决方案1】:

调用 color2gray() 的线程的名称是什么?将此添加到该函数的第一行以找出:

System.out.println("Thread = " + Thread.currentThread().getName());

你可能会看到这样的输出:

线程 = AWT-EventQueue-0

这意味着代码在“事件线程”上运行。这应该是修改 Swing/GUI 组件的唯一线程。而且这个线程不应该做长时间的工作。如果这是事件线程,那么您需要在后台进行长时间的工作。

改变

myImg.color2gray();

Thread t = new Thread() {
    @Override
    public void run() {
      myImg.color2gray();
  }
};
t.start();

作为一个开始。并阅读更多关于摇摆事件线程:

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html http://en.wikipedia.org/wiki/Event_dispatching_thread

【讨论】:

  • 感谢您的快速解答。我用 SwingWorker 解决了这个问题,但我也试着让它像 Keith 一样,但是有更多的功能,所以我可以再次使用这个 swingWorker。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
相关资源
最近更新 更多