2010-07-31 1 views
1

Сначала я хотел бы сказать, что я работал с java только 1 месяц. Это довольно простой вопрос. Я искал и классический пример фруктов не имел никакого смысла для меня. Я часами смотрел на него и пытался понять, как применить это, чтобы заставить его работать. Это не имеет никакого смысла для меня, потому что каждый объясняет, как получить и установить свойство с 2 строками кода и без инструкций структуры. Я бы очень признателен за прорыв в том, как разговаривать с нестационарным статичным.Может кто-нибудь объяснить, как setText из статики, используя мой пример?

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

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

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

Я попытался это как в ответ я получил, но это не работает ...

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

// Попытка вне работоспособный метода приращения коды общественности Строки getNewScannerValueRunnable() {

Runnable doWorkRunnable = new Runnable() { 

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

    }; 
     SwingUtilities.invokeAndWait(doWorkRunnable); 

    return X; 
} 

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

ответ

2

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

Существует «секрет» Swing, о котором вам нужно знать: вы не можете (явно) изменять свойства объектов GUI из любого потока, отличного от потока Swing, например, Dispatching Thread.

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


EDIT:

ОК, давайте вернемся. Ваша форма основана на 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 - это, по сути, метод «босса» для вашей программы.

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

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

Вероятно, самым простым было бы:

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

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

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

Status.form.main(args); 

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

Obd2nerForm.main(args); 

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

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

+0

Я попытался это, но он не работает ... общественного Строка getNewScannerValueRunnable() { Runnable doWorkRunnable = новый Runnable() { @Override общественности недействительным запуска() {Status.form.getNewRotatingValue();} }; SwingUtilities.invokeAndWait (doWorkRunnable); возвращение X; } Строка X = ""; Должен ли я просто ставить все мои форматированныеTextBoxes? –

+0

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

+0

Спасибо. Вы помогли мне ... Видимо, я ссылался на form.main(), который создает новую форму. Все, что мне нужно было сделать, было form.setvisible. Я смотрел новую форму, и в фоновом режиме бегала невидимая форма. –

 Смежные вопросы

  • Нет связанных вопросов^_^