2017-07-07 72 views
0

我在另一個類中創建了一個類的實例。在課堂上,我創建了一個帶有單選按鈕和按鈕的JFrame。當用戶點擊按鈕時,我希望選中的單選按鈕的文本返回到另一個類。但它不起作用。換句話說,一個變量沒有返回。我該怎麼辦?在另一個類中得到JButton的結果

我的第一類的代碼:

public class SelectLayoutCreator { 
public JFrame f = new JFrame("Choos Rule"); 
public String a; 
public SelectLayoutCreator(ArrayList<String> choose) { 
// TODO Auto-generated constructor stub 
ArrayList<JRadioButton> ruleRadioButtions = new ArrayList<JRadioButton>(); 
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
f.setSize(400, 300); 
f.setLayout(null); 
JTextField ruleText = new JTextField(); 
ruleText.setBounds(30, 67, 90, 10); 
f.add(ruleText); 
JLabel ruleLabel = new JLabel ("Which of the following rules should be execute?"); 
ruleLabel.setBounds(20, 20, 350, 20); 
f.add(ruleLabel); 
ButtonGroup group = new ButtonGroup(); 
for (int i = 0; i < choose.size(); i++) { 
    JRadioButton radio = new JRadioButton(choose.get(i)); 
    radio.setActionCommand(choose.get(i)); 
    ruleRadioButtions.add(radio); 
    ruleRadioButtions.get(i).setBounds(20, 50+20*i, 200, 30); 
    group.add(ruleRadioButtions.get(i)); 
    f.add(ruleRadioButtions.get(i)); 
    } 
JButton b = new JButton("Select"); 
b.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
    **a** = group.getSelection().getActionCommand(); 
     } 
    }); 
f.add(b); 
b.setBounds(270,220,100, 40);  
e.setBounds(170,120,100, 40); 
f.setVisible(true); 
} 

另一個類的鱈魚:

public class interfaceRule { 
public String call(ArrayList<String> choose) 
{ 
    SelectLayoutCreator s = new SelectLayoutCreator(choose); 
    return s.a; 
} 
} 
+0

什麼是'SelectLayoutCreator'和'interfaceRule'之間的關係?你可以簡單地實例化按鈕操作中的'interfaceRule'嗎?順便說一句,縮進和正確的命名約定很好用。 – AxelH

回答

0

有一個在你設計並實現了當前解決方案的方式有問題。當撥打call()方法時,會發生以下情況:

1)JFrameRadioButtons已創建並顯示在屏幕上。

SelectLayoutCreator s = new SelectLayoutCreator(choose); 

2)的製造方法的繼續執行,因爲GUI上一個單獨的線程中運行。所以,執行return語句並返回一個空值,因爲String尚未初始化。

return s.a; 

您的代碼現在不會等待用戶做出選擇並單擊「選擇」按鈕。

這是一個基於你的解決方案的工作示例(由於編碼風格不合理,我重構了一些代碼)。你可以把這個在Main.java文件並運行它:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 

import javax.swing.ButtonGroup; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JRadioButton; 
import javax.swing.JTextField; 


class SelectLayoutCreator { 

    private JFrame f = new JFrame("Choose Rule"); 
    private String a; 

    public SelectLayoutCreator(ArrayList<String> choose, Object lock) { 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(400, 300); 
     f.setLayout(null); 

     JTextField ruleText = new JTextField(); 
     ruleText.setBounds(30, 67, 90, 10); 
     f.add(ruleText); 

     JLabel ruleLabel = new JLabel("Which of the following rules should be executed?"); 
     ruleLabel.setBounds(20, 20, 350, 20); 
     f.add(ruleLabel); 

     ButtonGroup group = new ButtonGroup(); 
     ArrayList<JRadioButton> ruleRadioButtions = new ArrayList<JRadioButton>(); 
     for (int i = 0; i < choose.size(); i++) { 
      JRadioButton radio = new JRadioButton(choose.get(i)); 
      radio.setActionCommand(choose.get(i)); 
      ruleRadioButtions.add(radio); 
      ruleRadioButtions.get(i).setBounds(20, 50 + 20 * i, 200, 30); 

      group.add(ruleRadioButtions.get(i)); 
      f.add(ruleRadioButtions.get(i)); 
     } 

     JButton b = new JButton("Select"); 
     b.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       a = group.getSelection().getActionCommand(); 

       /* wake up the thread waiting inside InterfaceRule */ 
       synchronized (lock) { 
        lock.notify(); 
       } 

       f.dispose(); 
      } 
     }); 
     b.setBounds(270, 220, 100, 40); 
     f.add(b); 

     f.setVisible(true); 
    } 

    public String getA() { 
     return a; 
    } 

} 


class InterfaceRule { 

    private static Object lock = new Object(); 

    public String call(ArrayList<String> choose) { 
     SelectLayoutCreator s = new SelectLayoutCreator(choose, lock); 

     /* wait for the String to be populated */ 
     synchronized (lock) { 
      try { 
       lock.wait(); 
      } 
      catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

     return s.getA(); 
    } 

} 


public class Main { 

    public static void main(String[] args) { 
     ArrayList<String> choose = new ArrayList<String>(); 
     choose.add("1"); 
     choose.add("2"); 
     choose.add("3"); 

     String chosen = new InterfaceRule().call(choose); 
     System.out.println(chosen); 
    } 

} 
相關問題