2014-10-10 71 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

相關問題