создание экземпляров классов - PullRequest
0 голосов
/ 03 марта 2009

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

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

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

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

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

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

gui = new GUI(); 

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

Можно ли как-нибудь обойти это?

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

Ответы [ 7 ]

3 голосов
/ 03 марта 2009

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

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

2 голосов
/ 03 марта 2009

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

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

    ...

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

SecondForm secondForm = new SecondForm(this);
0 голосов
/ 03 марта 2009

Вы можете использовать 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";
    }
  }
}
0 голосов
/ 03 марта 2009

Я бы использовал слушателя для наблюдения за состоянием переменной '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);
    }
}

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

0 голосов
/ 03 марта 2009

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

0 голосов
/ 03 марта 2009

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

0 голосов
/ 03 марта 2009

в комментариях под этим постом я и 2 других человека определили, что вы должны изучить язык Java, исследовать понятие объектно-ориентированного программирования (включая объектную область), а затем узнать, как реализовать надлежащий код обработки событий - Есть несколько способов, которыми вы можете выполнить то, что вы хотите, я бы предложил комбинацию кода, который я предоставил, вместе с рекомендацией, предоставленной 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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...