2014-10-10 70 views
0

我是一位C程序员,他被交给了最后一分钟的Java GUI任务。鉴于我不是一个GUI或Java人,我已经创建了两个对象:如何将变量从一个actionlistener内部分配到一个外部

1是一个文本框,我希望能分配第二个对象的结果。 2是一个组合框。当用户从组合框中选择时,我希望将该值填充到我的第一个对象(文本框)中。这里是我的ActionListener():

class Foo { 
    // declared instance variable 
    private String theValue; 

    // created textField, and JComboBox thingies 

    listBox.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      // this line produces the reported error 
      //textField.setText((String)(((JComboBox)e.getSource()).getSelectedItem())); 

     // this line works, but then get below error when try to assign theValue outside method 
      theValue = ((JComboBox)e.getSource()).getSelectedItem(); 
     }      
    }); 
... 
textField.setValue(theValue); // errors out 

,并得到以下(显然也知道Java错误):不能指非最终变量 文本框在一个不同的方法

定义的一个内部类中评论线产生了相同的结果。我希望能够将value赋值为我的文本字段的值,但显然不能在侦听器中声明我,因为这样就存在范围问题。

任何援助是极大的赞赏:-)

+0

澄清:在actionPerformed()方法内赋值给值不会产生错误。但是当我稍后尝试将该值分配给侦听器之外的另一个变量时,我收到了报告的错误。 – frododot 2014-10-10 04:16:22

+0

谢谢MadProgrammer!问题解决了...! – frododot 2014-10-10 18:26:16

回答

1

要么使JTextFieldfinal或使其在类中的实例字段。

final JTextField textField = ... 

public class ... { 

    private JTextField textField; 

    public ...() { = new JTextField(...); 

您可以为其他变量来做到这一点。通常情况下,除非你有其他理由,否则我会建议使用实例字段。看看Understanding Class Members了解更多详细信息...

您可以考虑像C中的“私有”变量这样的实例字段,那些在C文件本身中声明的实例字段,其中不能在文件的外部引用它们在

更新

首先,GUI的(对不起,很长一段时间,因为我已经做了ç所以可能不完全正确)宣布往往是事件驱动的,也就是说,它们不运行在线性/程序化的方式。你设置了一堆回调,并等待一些东西来触发它们。当触发回调,您采取适当的行动......

import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JTextField textField; 
     private JComboBox comboBox; 
     private String theValue; 

     public TestPane() { 
      textField = new JTextField(10); 
      comboBox = new JComboBox(new String[]{"Banana", "Apple", "Grapes", "Strawberries"}); 
      comboBox.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        theValue = (String)comboBox.getSelectedItem(); 
        textField.setText(theValue); 
       } 
      }); 
      comboBox.setSelectedItem(null); 

      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      add(textField, gbc); 
      add(comboBox, gbc); 
     } 

    } 

} 

在这个例子中,分配给JComboBoxActionListener没有立即叫,这意味着分配下的剩余代码会立即运行和前ActionListener有任何被调用的机会。

认为它像一个函数指针或回调。你可以把它传递给另一个函数,但你不知道什么时候会被称为......

当的JComboBox变化和触发器和操作事件的状态下,ActionListener小号actionPeformed方法被调用,此时您可以获取当前值并将其应用到文本字段并将其分配给您的变量...或者您还需要做什么......

请注意,我附加了ActionListener和被调用comboBox.setSelectedItem(null),这将会实际上会导致ActionListener被通知...棘手;)

+0

我不清楚如何使用最终变量。目前,我已将该值在班级中宣布为私人,在听众之外。我无法将其声明为final,因为我没有分配它的价值(最终需要)。我相信我已经尝试了你提到的另一个解决方案,关于创建JTextField,它再次在侦听器之外声明(非最终),导致报告的错误。猜猜我需要进一步的细节:-) – frododot 2014-10-10 04:06:23

+0

代码不适合评论,更好地更新问题;) – MadProgrammer 2014-10-10 04:08:11

+0

你有没有尝试过把它变成像第二个例子一样的实例字段?确保你没有用方法 – MadProgrammer 2014-10-10 04:40:21

相关问题