2016-05-20 59 views
0

我有一个名为User的JFrame,我声明了一个名为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(); 
} 

更新的代码 框架 - 输入

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]或[简短,独立,正确的示例](http://www.sscce.org/)。 2)请参阅[使用多个JFrames,良好/错误的实践?](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

您可以使用getters和setter。在你想要传递id变量的地方在你的Frame中定义一个getter方法。例如

public int getID(){ 
     return id; 
} 

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

解决此问题的另一个解决方法是制作变量globe和static,以便它可以在其他框架中导入并使用。

1

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

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

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

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

你需要考虑你想使用哪种方法。我会建议使用EventBus来处理应用程序的具体组件之间的事件传播。在中等大小的组件上使用Observer模式,而使用小尺寸或非常静态的参数传递。

相关问题