2016-05-20 2 views
0

У меня есть один JFrame, называемый User, где я объявляю переменную с именем id и устанавливаю ее в определенное значение в зависимости от некоторых условий.Передача переменной в одном Jframe от одного к другому

Мне нужно использовать эту переменную во втором JFrame, называемом выходом.

Это код, у меня есть

class InputScreen extends javax.swing.JFrame { 
public int id = 0; 

private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    if (condition){ 
     id = 1; 
     System.out.println(id); 
    } 
    elseif (condition){ 
      id = 2; 
      System.out.println(id); 
    } 
    elseif (condition){ 
      id = 3; 
      System.out.println(id); 
    } 
    else{ 
    System.exit(0); 
    } 

Я использовал конструктор в кадре вывода, но это не похоже на работу.

public class Output extends javax.swing.JFrame { 
int rule; 

public Output(int Id){ 
    rule = Id; 
    initComponents(); 
} 

public Output() { 
    initComponents(); 
    conn = MySqlConnect.ConnectDB(); 
} 

Обновленный код Frame - Input

class InputScreen extends javax.swing.JFrame { 
public int id = 0; 

public int getID(){ 
    return input_rule_id; 
} 

private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    if (condition){ 
     id = 1; 
     System.out.println(id); 
    } 
    elseif (condition){ 
      id = 2; 
      System.out.println(id); 
    } 
    elseif (condition){ 
      id = 3; 
      System.out.println(id); 
    } 

Форма - Выход

private void formWindowActivated(java.awt.event.WindowEvent evt)  {          

    Input InSc = new Input(); 
    InSc.getId(); 

} 
+1

1) Для лучшей помощи в ближайшее время отправьте сообщение [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). 2) См. [Использование нескольких JFrames, Good/Bad Practice?] (Http://stackoverflow.com/q/9554636/418556) –

+0

** Вероятный ** дубликат [Перенос текста с одного JFrame на другой] (http : //stackoverflow.com/q/37336756/418556) .. –

ответ

1

Все примитивные типы данных будут передаваться по значению. Используйте обертку объекта, чтобы передать значение по ссылке. Например, AtomicInteger

class InputScreen extends javax.swing.JFrame { 
    private AtomicInteger id = new AtomicInteger(0); 

private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    if (condition){ 
     id.set(1); 
     System.out.println(id); 
    } 
    else if (condition){ 
      id.set(2); 
      System.out.println(id); 
    } 
    else if (condition){ 
      id.set(3); 
      System.out.println(id); 
    } 
     else{ 
     System.exit(0); 
    } 
} 

public class Output extends javax.swing.JFrame { 
AtomicInteger rule; 

public Output(AtomicInteger Id){ 
    rule = Id; 
    initComponents(); 
} 

public Output() { 
    initComponents(); 
    conn = MySqlConnect.ConnectDB(); 
} 
} 
+0

Я пробовал это, но я только, кажется, получил значение null в качестве значения в кадре вывода. –

+0

Я не могу помочь вам, не видя ваш полный код. –

+0

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

0

Вы можете использовать геттеры и сеттеры. Определите метод getter в вашем кадре, откуда вы хотите передать переменную id. например

public int getID(){ 
     return id; 
} 

В другом кадре вы можете просто использовать этот метод для возврата результата. int id = getID();

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

1

Передача параметров Самый простой способ будет прохождение Output в качестве параметра InputScreen. Затем вы можете просто вызвать метод Output.setId (id) в вашей InputScreen.submitButtonActionPerformed() логика. Этот способ, однако, немного проблематичен, когда приложение растет.

Наблюдатель Pattern Лучше всего было бы реализовать в IdChangedListener как часть шаблона Observer в качестве прокси для ActionListener вы уже реализовали. Когда срабатывает ваш ActionListener, вы вызываете все IdChangeListeners, которые зарегистрировались как наблюдатели до InputScreen. В Вывод вы предоставляете метод setId (id) для обеспечения доступа. В месте, где вы создаете экземпляр двух JFrames, вы реализуете IdChangeListener, добавьте его в InputScreen, а когда он начнет работать, вы вызываете Output.setId().

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

В памяти EventBus Современный подход будет использовать память EventBus в памяти. Это устраняет жесткую проводку компонентов в пользовательском интерфейсе и уменьшает размер кода. Тем не менее, это ограничивает повторное использование компонентов, потому что они будут автоматически реагировать на некоторые события. Что делать, если у вас их более одного раза? Прослушивание разных событий?

Вам нужно подумать о том, где вы хотите использовать какой подход. Я бы предложил использовать EventBus для распространения событий между конкретными компонентами вашего приложения. Используйте шаблон Observer для компонентов среднего размера, в то время как использование параметра передается для небольших размеров или очень статических.

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