2017-07-07 4 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); 
} 

別のクラスのCOD:

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

'SelectLayoutCreator'と' interfaceRule'との関係は何ですか? Buttonアクションで 'interfaceRule'をインスタンス化できますか?ちなみに、インデントと正しい命名規則は使いやすいです。 – AxelH

答えて

0

あなたは現在のソリューションを設計し、実装方法に問題があります。 call()メソッドへの呼び出しが行われると、次のようになります。

1)RadioButtonsのあるJFrameが作成され、画面に表示されます。 GUIは、別のスレッド上で実行されるための方法

SelectLayoutCreator s = new SelectLayoutCreator(choose); 

2)実行は、を継続します。したがって、return文が実行され、文字列がまだ初期化されていないため、null値が返されます。

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

} 
関連する問題