Обновление Jlabel - PullRequest
       22

Обновление Jlabel

0 голосов
/ 28 января 2012

У меня проблемы с обновлением jlabel в методе.вот мой код:

    JLabel curStatus = new JLabel("");
JButton jbtnSubmit;

public static void main(String[] args) {
    test gui = new test();
    gui.startGUI();
    // gui.setCurStatus("testing!"); << seems to work here, 
    //but when i call it from another class, it doesn't want to run.
}

// Set up the GUI end for the user
public void startGUI() {
    // These are all essential GUI pieces
    new JTextArea("");
    final JFrame jfrm = new JFrame("my program");
    jfrm.setLayout(new FlowLayout());
    jfrm.setSize(300, 300);
    jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    jbtnSubmit = new JButton("Submit");

    jfrm.add(jbtnSubmit);
    jfrm.add(curStatus);
    jfrm.setVisible(true);
}

public void setCurStatus(String inCurStatus) {
    curStatus.setText(inCurStatus);
    curStatus.setVisible(true);
}

что происходит, так это то, что метка curStatus не появляется.например, вот звонок:

gui1.setCurStatus("Now running diagnostics... Please wait!");

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Ваша проблема, кажется, одна из неуместных ссылок.

Вот как вы создаете свой графический интерфейс:

  public static void main(String[] args) {
     test gui = new test();
     gui.startGUI();
     // gui.setCurStatus("testing!"); << seems to work here,
     // but when i call it from another class, it doesn't want to run.
  }

Вы создаете свой «тестовый» объект (который должен называться «Test»)."Кстати, чтобы соответствовать соглашениям об именах Java) внутри вашего основного метода.Поскольку она объявлена ​​внутри main, эта переменная имеет область видимости только внутри main и видна не где-либо еще.

Затем вы сообщаете нам, что вызываете метод следующим образом:

gui1.setCurStatus("Now running diagnostics... Please wait!");

Переменная gui1 относится к объекту тестового класса, но, скорее всего, относится к другому объекту , нежели к тестовому объекту, который отображается, поскольку на исходный отображаемый тестовый объект ссылается только переменная, локальная для основного метода.

Чтобы решить эту проблему, необходимо вызвать setCurStatus для текущего отображаемого тестового объекта.Как это сделать, зависит от остальной части вашего кода, от которой вы отказались нам показывать, несмотря на наши просьбы сделать это.

Редактировать : На основании вашего последнего сообщениякод (который все еще не скомпилируется для меня, так как отсутствует метод, createTasksFile(), мои предположения верны, вы вызываете setCurStatus(...) для объекта графического интерфейса, который не отображается:

  public static String[] runDiagnostics() throws IOException {

     gui gui1 = new gui(); // (A)
     gui1.setCurStatus("Now running diagnostics... Please wait!");

В строке (A) вы создаете новый объект графического интерфейса и вызываете для него setCurStatus, но это не отображаемый объект графического интерфейса, а совершенно другой и не связанный объект.является объектом того же класса, что и отображаемый, но это все. Решение состоит в том, чтобы получить ссылку на отображаемый графический интерфейс и вызвать этот метод для этого объекта и только для этого объекта.

Также, предположения Робина верны, потому что даже если вы исправите это, вы столкнетесь с проблемой параллелизма Swing. JLabel не будет обновляться, потому что поток Swing пытается открытьфайл:

  public static String[] runDiagnostics() throws IOException {

     gui gui1 = new gui();
     gui1.setCurStatus("Now running diagnostics... Please wait!");

     int i = 0;
     int errorsI = 0;
     File f = new File("tasks.txt");
     String[] errors = { "", "", "", "", "" };

     // try to create the file three times
     do {
        f.createNewFile();
        i++;
     } while (!f.exists() && i < 3);

Итак, мы оба правы.Решением этой проблемы является открытие вашего файла в фоновом потоке, здесь отлично подойдет SwingWorker.

Edit 2
Таким образом, чтобы исправить проблему с ссылками, передайте ссылку наGUI в метод runDiagnostics, используя параметр GUI.Затем вызовите метод setCurStatus для этого параметра.Например:

  public static String[] runDiagnostics(gui gui1) throws IOException {

     //!! gui gui1 = new gui(); // !! no longer needed
     gui1.setCurStatus("Now running diagnostics... Please wait!");

При вызове метода вам нужно будет передать графический интерфейс:

        //!! results = taskBckg.runDiagnostics();
        results = taskBckg.runDiagnostics(gui);

Также, пожалуйста, отредактируйте весь свой код так, чтобы он соответствовал соглашениям об именах Java.Все имена классов должны начинаться с заглавной буквы.Это значительно облегчит другим понимание того, что делает ваш код.

1 голос
/ 28 января 2012

У меня также будет предположение, основанное на сообщении, которое вы пытаетесь отобразить, поскольку в этом вопросе отсутствует некоторая существенная информация.На основании сообщения

«Сейчас выполняется диагностика ... Пожалуйста, подождите!»

, я предполагаю, что вы запускаете диагностику и пытаетесь обновить пользовательский интерфейс на том женить.Размещенный вами код не содержит явных ошибок, которые объясняли бы, почему ваш вызов

gui1.setCurStatus("Now running diagnostics... Please wait!");

не обновил бы содержимое метки.

Все, что вам нужно сделать, объяснено в Swingруководство по параллелизму .Суть в том, что вы обновляете пользовательский интерфейс в потоке диспетчеризации событий и никогда не выполняете тяжелые вычисления в этом потоке, так как это заблокирует пользовательский интерфейс, что приведет к ужасному взаимодействию с пользователем.Тяжелые вычисления должны выполняться в рабочем потоке, например, с использованием класса SwingWorker, и только обновление пользовательского интерфейса (например, для сообщения о ходе выполнения) должно происходить в EDT.

С этой информацией и ссылками вы сможете найти всю необходимую информацию.Также на этом сайте вы найдете несколько примеров использования SwingWorker для выполнения фоновых вычислений и обновления пользовательского интерфейса, например, мой ответ на предыдущий вопрос

...