Ваша проблема, кажется, одна из неуместных ссылок.
Вот как вы создаете свой графический интерфейс:
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.Все имена классов должны начинаться с заглавной буквы.Это значительно облегчит другим понимание того, что делает ваш код.