将一个Jframe中的变量集从一个传递到另一个

时间:2016-05-20 06:34:55

标签: java swing class jframe

我有一个名为User的JFrame,我在其中声明一个名为id的变量,并根据某些条件将其设置为某个值。

我需要在名为output的第二个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();
}

更新代码 帧 - 输入

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();

 }

3 个答案:

答案 0 :(得分: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();
}
}

答案 1 :(得分:1)

参数传递 最简单的方法是将输出作为参数传递给 InputScreen 。然后,您可以在 InputScreen.submitButtonActionPerformed()逻辑中调用方法 Output.setId(id)。但是,当应用程序增长时,这种方式会有点问题。

观察者模式 更好的方法是将 IdChangedListener 作为Observer模式的一部分实现为已经实现的ActionListener的代理。触发ActionListener时,将所有已注册为 InputScreen 的观察者的 IdChangeListeners 调用。在输出中,您提供了一个方法 setId(id)来提供访问权限。在实例化实现 IdChangeListener 的两个JFrame的位置,将其添加到 InputScreen ,当它触发时,调用 Output.setId()

无论如何,你只看到一个事件的大量工作(和代码)。此方法也有其在应用程序大小和动态方面的局限性。

在Memory EventBus中 最新的方法是在内存中使用EventBus。这消除了UI中组件的硬连线并减少了代码大小。但是,它限制了组件的重用,因为它们会自动对某些事件做出反应。如果你不止一次拥有它们怎么办?听不同的事件?

您需要考虑使用哪种方法。我建议使用EventBus在应用程序的具体组件之间传播事件。在中等大小的组件上使用Observer模式,同时使用小型或非常静态的参数传递。

答案 2 :(得分:0)

您可以使用getter和setter。在框架中定义要从中传递id变量的getter方法。例如

public int getID(){
      return id;
}

在您的其他框架中,您可以使用此方法返回结果。 int id = getID();

解决此问题的另一个方法是将变量globe和static设置为可以将其导入到另一个框架中并进行使用。