Может кто-нибудь объяснить, как установить текст из статического на моем примере? - PullRequest
1 голос
/ 01 августа 2010

Во-первых, я хотел бы сказать, что я работаю с Java только 1 месяц. Это, наверное, довольно простой вопрос. Я искал, и классический пример с фруктами не имел для меня никакого смысла. Я часами смотрел на это и пытался понять, как применить это, чтобы оно заработало. Это не имеет никакого смысла для меня, потому что все объясняют, как получить и установить свойство с 2 строками кода и без структурных операторов. Я был бы очень признателен за то, как говорить с нестатическим от статического.

Я хотел бы установить текст в текстовом поле в моем классе OBD2nerForm из отдельного и статического класса.

public class OBD2nerForm extends java.awt.Frame {

/** Creates new form OBD2nerForm */
public OBD2nerForm() {
     initComponents();
}   ....................................


public String setText(String text){
    this.jFormattedTextField1.setText(text);
}

Я думаю, что у меня есть статическая ссылка на этот экземпляр формы, определенной здесь ..

public class Status {
    public static OBD2nerForm form = new OBD2nerForm();

это называется из моего основного, как это

public class obd2ner {
 public static void main(String[] args) throws IOException {
                        Status.form.main(args);

Затем, когда я пытаюсь вызвать его ... Status.form.getText выдает мне начальные значения при создании формы. Когда я устанавливаю текст, он не меняет тот, что на экране.

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

Я просто не понимаю, как использовать геттер и сеттер в нестатическом режиме. Это не совсем то, что мне нужно. Кажется, что я вижу один экземпляр на своем экране, и он использует новый экземпляр для выполнения получения и установки.

Я попробовал это согласно полученному ответу, но это не сработало ...

public class OBD2nerForm extends java.awt.Frame {
      String X = "";

// Попробуем работающий метод приращения кода public String getNewScannerValueRunnable () {

    Runnable doWorkRunnable = new Runnable() {

        @Override
        public void run() { 
           Status.form.getNewRotatingValue()
        ;}

    };
        SwingUtilities.invokeAndWait(doWorkRunnable);

    return X;
}

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

1 Ответ

2 голосов
/ 01 августа 2010

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

Есть секрет «Swing», о котором вы должны знать: вы не можете (явно) изменить свойства объектов GUI из любого потока, кроме потока Swing, иначеПоток диспетчеризации событий.

Хитрость в том, чтобы сделать это в любом случае, состоит в том, чтобы передать изменяющий свойство код как Runnable в SwingUtilities.invokeAndWait() или SwingUtilities.invokeLater().


РЕДАКТИРОВАТЬ:

ОК, давайте вернемся.Ваша форма основана на AWT, а не на Swing, поэтому, боюсь, мой совет по использованию SwingUtilities, вероятно, не помог бы вам, даже если бы вы правильно его реализовали.На этот раз я попытаюсь дать более конкретные подсказки.

Вы создали класс OBD2nerForm, это форма AWT.Этот класс имеет конструктор, который вызывает initComponents для настройки некоторых компонентов графического интерфейса на экране.

В классе также есть метод с именем setText, который помещает текст своего аргумента в одно из полей формы,Этот метод является методом экземпляра, т. Е. Он не является «статическим», как вы его называете.

У вас есть другой класс, Status с полем класса form.Инициализатор для form вызывает конструктор для OBD2nerForm.Это создаст экземпляр формы и сохранит его в form;но я не видел, чтобы show() или setVisible() вызывался в форме для ее отображения.

Вот первые признаки проблемы:

 public class obd2ner {
 public static void main(String[] args) throws IOException {
                        Status.form.main(args);

Имена классов(как obd2ner) должен начинаться с заглавных букв;но это вопрос стиля и соглашения, это не то, что вызывает у вас проблемы.Следование соглашениям помогает другим людям читать и отлаживать ваш код.

Большая проблема - obd2ner.main() вызов вашей формы main().То, что можно заставить работать, но обычно это признак того, что вы делаете что-то не так.

Хотя ничто не мешает вам кодировать статические методы main во столько ваших классов, скольковы хотите, только один из этих основных может быть запущен извне, т. е. при запуске приложения.Первый main по сути является методом 'boss' для вашей программы.

"Первый главный" обычно создает и инициализирует несколько объектов.В приложении без графического интерфейса main() может затем запустить цикл или какую-либо другую структуру управления, в которой он затем будет координировать действия других объектов.В приложении с графическим интерфейсом main() обычно просто создает экземпляр, а затем показывает графический интерфейс и затем завершается;как только GUI становится видимым, вся дальнейшая активность программы запускается действиями, которые пользователь выполняет над GUI.

Не видя ваш код, я предполагаю, что Obd2nerForm.main() также создает экземпляр Obd2nerForm и показывает его.Таким образом, вы, вероятно, действительно имеете одну экземплярную, но невидимую форму, висящую за Status.form, а другую - экземплярную, видимую и ссылающуюся из некоторой переменной в Obd2nerForm.Если вы хотите повлиять на этот графический интерфейс, вам нужно сделать ссылку на эту форму доступной.

Возможно, самое простое будет:

В Obd2nerForm, объявить public static Obd2nerForm form и вObd2nerForm.main, сразу после вызова конструктора скопируйте ссылку на форму в эту переменную.С этого момента вы можете получить доступ к форме и ее методам, используя, например, Obd2nerForm.form.setText().

Напоминание: у вас, похоже, два main() s, и это нужно исправить.Все, что нужно сделать в начале жизни приложения, должно быть в одном из этих main с, а не в нескольких.

Наконец, посмотрите на этот вызов метода:

Status.form.main(args);

Это синтаксис для вызова метода в конкретном экземпляре.Но Obd2nerForm.main - это метод класса (то, что вы называете «статическим»), и поэтому не нужно вызывать «определенный», он всегда принадлежит только самому классу.Вот почему синтаксис вызова метода класса выглядит примерно так:

Obd2nerForm.main(args);

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

Там ... Я надеюсь, что это продвинет вас немного дальше. Если у вас все еще есть проблемы, пожалуйста, опубликуйте более полный пример кода в PasteBin, и я посмотрю!

...