2009-03-03 7 views
0

В настоящее время я работаю над кодом, с которым у меня возникают проблемы.создание экземпляров классов

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

Другая кнопка такая же, за исключением того, что для строки назначается другое значение.

Эта строка создается в начале до конструктора следующим образом:

public string s = "String"; // public so I can call it in another class 

Проблема возникает, когда я хочу, чтобы выяснить, какая кнопка была нажата в другом классе. Я хочу посмотреть, что s так я должен создать экземпляр этого класса GUI:

gui = new GUI(); 

Это сбрасывает значение s в «String» снова, и это губит мое сравнение.

Есть ли способ обойти это?

Я пробовал много идей, но ничего не работает.

+0

Вам действительно нужно сесть и смотреть на это с самого начала. Вам нужно прочитать и узнать, что такое «объекты» и что такое «scope» и как оно работает. – GEOCHET

ответ

3

Когда вы изначально создаете GUI (то есть GUI gui = new GUI();), сохраните эту ссылку, если хотите получить доступ к элементу s.

Когда вы создаете новый объект GUI, этот новый объект никогда не управлялся пользователем, поэтому его значение s равно "String". Вам нужно сохранить ссылку на исходный объект.

-1

в комментариях ниже этого сообщения, я и еще 2 человека определили, что вы должны изучить java langauge, исследовать понятие объектно-ориентированного программирования (включая область объекта), а затем узнать, как реализовать правильный код обработки событий - Есть несколько способов, которыми вы можете выполнить то, что хотите, я бы предложил комбинацию кода, который я предоставил вместе с рекомендациями по ссылкам, представленными Welbog выше (это, конечно, потребует модификации моего кода, но не так уж и много если ваш основной класс находится где-то в другом месте)

в основном, google java учебник (или купить книгу/«приобрести» книгу), и если вы знаете, что некоторые базовые понятия пропускают объектно-ориентированную часть.

если я следовать, что вы хотите, вот некоторые скелет код:

// imports 

public class GUI extends JFrame implements ActionListener { 
    public String s = "String"; 

    public GUI() { 
     // initializer code for buttons 
     btn1.addActionListener(this); 
     btn2.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if(s == "???") 
      s = "this"; 
     else 
      s = "that"; 
    } 

    // other methods 

} 
+0

Какая часть его вопроса заставляла вас думать, что ему нужно знать о обработчиках событий? – GEOCHET

+0

все нажатие кнопки вещь? – zaczap

+0

Согласовано. Он спросил о том, какая кнопка нажата. – Mark

2

Это, вероятно, лучше практика, чтобы передать состояние вашей первой формы ко второй форме или иметь первую форму сообщить вторую форму что определенное событие произошло в реальном времени. В противном случае вам нужно будет передать ссылку первой формы ко второй форме, чтобы сделать сравнение вы пытаетесь IE:

public class SecondForm { 
    private FirstForm _firstForm = null; 
    public SecondForm(FirstForm firstForm){ 
     _firstForm = firstForm; 
    } 

    ... 

    if(_firstForm.s == "comparison"){ 
     ... 
    } 
} 

SecondForm secondForm = new SecondForm(this); 
-3

создать дополнительную ценность, которая содержит кнопку (имя). Измените значение, когда вы нажимаете соответствующую кнопку и читаете ее из другого класса. В основном та же идея, что и s

-2

Очень сложно расшифровать ваш вопрос. Но в целом, если вы хотите узнать, какая кнопка была вызвана событием, добавьте другой ActionListener к каждому из них (или его модели). Держите код как можно более простым и простым.

-1

Я бы использовал прослушиватель для наблюдения за состоянием переменной 'string'.

public class Gui 
{ 
    public static final String STRING_PROPERTY = "string"; 
    private String string = "String"; 
    private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); 

    private void setString(String string) 
    { 
     String oldValue = this.string; 
     this.string = string; 
     propertyChangeSupport.firePropertyChange(STRING_PROPERTY, oldValue, this.string); 
    } 

    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) 
    { 
     propertyChangeSupport.addPropertyChangeListener(propertyName, listener); 
    } 
} 

Этот фрагмент просто демонстрирует, как добавить поддержку свойстваChangeListener в ваш класс. Класс, которому интересно знать значение «string», будет реализовывать PropertyChangeListener и добавляться через метод addPropertyChangeListener.

+0

Кто из вас, нубов, хочет меня проголосовать? :) – willcodejavaforfood

-1

Вы можете использовать ActionListener и команду действий на каждой кнопке, как показано в этом коде

public class GUI extends JFrame implements ActionListener 
{ 
    public static final String BUTTON_1_PRESSED = "BUTTON_1_PRESSED"; 
    public static final String BUTTON_2_PRESSED = "BUTTON_2_PRESSED"; 

    public String s = "String"; 

    public GUI() 
    { 
    // create buttons 
    button1.addActionListener(this); 
    button1.setActionCommand(BUTTON_1_PRESSED); 
    button2.addActionListener(this); 
    button2.setActionCommand(BUTTON_2_PRESSED); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
    if(e.getActionCommand().equals(BUTTON_1_PRESSED)) 
    { 
     s = "this"; 
    } 
    else if(e.getActionCommand().equals(BUTTON_2_PRESSED)) 
    { 
     s = "that"; 
    } 
    } 
} 
Смежные вопросы