2017-07-07 18 views
0

Ich erstellte eine Instanz einer Klasse in einer anderen Klasse. In der Klasse habe ich einen JFrame mit Radiobuttons und Button erstellt. Wenn der Benutzer auf die Schaltfläche geklickt hat, möchte ich, dass der ausgewählte Radiobutton zu der anderen Klasse zurückkehrt. Aber es funktioniert nicht. mit anderen Worten, die a-Variable wird nicht zurückgegeben. Was soll ich machen?Erhalten Sie das Ergebnis von JButton in einer anderen Klasse

Der Code meiner ersten Klasse:

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

Der Kabeljau einer anderen Klasse:

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

Was ist die Beziehung zwischen 'SelectLayoutCreator' und' interfaceRule'? Kannst du 'interfaceRule' einfach in die Button Aktion einbauen? Übrigens, Einrückung und korrekte Namenskonventionen sind gut zu verwenden. – AxelH

Antwort

0

Es gibt ein Problem in der Art und Weise Sie die aktuelle Lösung konzipiert und umgesetzt. Wenn ein Anruf an die call() Methode gemacht wird, geschieht Folgendes:

1) Die JFrame mit der RadioButtons wird erstellt und auf dem Bildschirm angezeigt.

SelectLayoutCreator s = new SelectLayoutCreator(choose); 

2) Durchführung des Verfahrens weiterhin , weil die GUI auf einem separaten Thread ausgeführt wird. Daher wird die return-Anweisung ausgeführt und gibt einen Nullwert zurück, da der String noch nicht initialisiert wurde.

return s.a; 

Ihr Code wartet nicht auf die Auswahl durch den Benutzer und klickt auf die Schaltfläche "Auswählen".

Hier ist ein funktionierendes Beispiel basierend auf Ihrer Lösung (ich habe einen Teil Ihres Codes aufgrund des schlechten Codierungsstils umstrukturiert). Sie können dies in einer Main.java Datei setzen und führen Sie es:

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

} 
Verwandte Themen