Weird.Запрос работает в HTML-форме Fuseki, но не из JAVA? - PullRequest
0 голосов
/ 05 августа 2011

Я хотел бы задать несколько вопросов, касающихся использования потоков.Я просмотрел множество постов и ссылок, предложенных в этих постах, но все еще оказался пустым.У меня есть проект NetBeans, в котором есть несколько классов.Одним из них является класс Gui, который я использую, чтобы просто нажать кнопку, и выполняется некоторая обработка.Из графического интерфейса я вызываю экземпляр другого класса, который, в свою очередь, вызывает другие классы.Один из этих классов отправляет запрос Sparql во внутреннюю базу данных TDB.Все выходные на данный момент сохраняются в файлы.

Я хотел бы сделать так, чтобы класс, вызываемый из графического интерфейса пользователя, выполнялся в другом потоке, а также имел возможность обновлять EditorPane и TextArea наGui из одного или нескольких названных классов.До сих пор я пытался вызвать экземпляр класса Gui и использовать открытый метод внутри, но это не работает.Я вызываю экземпляр Gui с

Gui gui = new Gui();
gui.setEditorPaneText("File name is: " + fn);

, а метод в классе Gui

public void setEditorPaneText(final String string) {
    SwingUtilities.invokeLater(new Runnable() {

        public void run() {
            setString(string);
            EditorPane.setText(getString());
            EditorPane.repaint();
        }
    });
}

Я попытался запустить отладчик, но обработка переходит с первой строки метода напоследняя фигурная скобка без обработки кода внутри.Мой класс Gui имеет следующий метод в качестве основного.Часть с комментариями была предыдущей версией очереди событий, которую я изменил, читая многочисленные сообщения по этой проблеме.

public static void main(String args[]) {
    SwingUtilities.invokeLater(new Runnable() {

        public void run() {
            new Gui().setVisible(true);
            throw new UnsupportedOperationException("Not supported yet.");
        }
    });
}

Ниже приведен предыдущий код основного метода, который я заменил после прочтениянекоторые из сообщений по этому вопросу.

java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new Gui().setVisible(true);
        }
    });

Любая полезная информация будет высоко ценится.Спасибо.

1 Ответ

0 голосов
/ 06 августа 2011

Я думаю, что ваша главная ошибка в том, что вы создали два экземпляра вашего класса Gui.У вас есть следующий фрагмент дважды: new Gui().Посмотрите на мой пример кода ниже, чтобы увидеть пример того, как передать графический интерфейс в ваш рабочий поток.

// This is handwritte-untested-uncompiled code to show you what I mean
public class Main {
  public static void main(String[]args) {
     SwingUtilities.invokeLater(new Runnable() {
        public void run() {
           Gui g = new Gui();
           g.show(); // show() is equal to setVisible(true)
           g.doBackendAction(); // Normally this would be invoked by a button or sthg. I was to lazy
        }
     });
  }
}


public class Gui extends JFrame {
  private JTextArea area;
  public Gui() {
    // Just some code to create the UI. Not sure if this actually does sthg right :P
    area = new JTextArea();
    setContentPane(area);
    pack();
  }


  public void setTextAreaContent(final String string) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            area.setText(string);
            this.repaint(); // Not 100% sure if we need this

        }
    });
  }

  public void doBackgroundWork() {
    BackgroundWorker w = new BackgroundWorker(this);
    new Thread(w).start(); // Start a worker thread
  }
}

public class BackgroundWorker implements Runnable {
   private Gui gui;
   public BackgroundWorker(Gui gui) {
     this.gui = gui; // we take the initial instance of Gui here as a parameter and store it for later
   }

   public void run() {
     try { Thread.sleep(10 * 1000); } catch (InterruptedException e) {; }
     this.gui.setTextAreaContent("Hello World!"); // calls back to the Gui to set the content 

   }
}
...