那就是问题所在..
这是我想要做的简化版本:

public class Class{
    public void main(){
       Vector<Boolean> boo=new Vector<Boolean>;
       System.out.println("Hi all");
       ArrayList<String> a=new ArrayList<String>()
       a.add("hi");
       a.add("all");
       JRadioButtonExample b=new JRadioButtonExample(2,a);
       boo=b.getCheck();
       for(Boolean b:boo){
         System.out.println(b);
       }
    }
}


我必须为GUI调用一个外部类。
问题是我无法与JRadioButtonExample中执行的操作同步地同步system.out.println。

JRadioButtonExample类如下:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;


public class JRadiobuttonExample extends JFrame {

static JCheckBox b[];
static Vector<Boolean> check=new Vector<Boolean>();
JButton altervista=new JButton("RUN");
JButton selectall=new JButton("select all");
JButton deselectall=new JButton("deselect all");
static int num;
int i=0;

public static JCheckBox[] getB() {
    return b;
}
public void setB(JCheckBox[] b2) {
    b = b2;
}
public Vector<Boolean> getCheck() {
    return check;
}
public void setCheck(Vector<Boolean> check2) {
    check = check2;
}
public JRadiobuttonExample(int num, ArrayList<String> lbl) {

    super("JRadiobuttonExample");

    getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING));

    b= new JCheckBox[num];

    for(i=0; i<num; i++) {
        //creo i bottoni
        b[i] = new JCheckBox(lbl.get(i));
        getContentPane().add(b[i]);
    }

    //adding buttons
    getContentPane().add(selectall);
    getContentPane().add(deselectall);
    getContentPane().add(altervista);

    //adding listeners
    AscoltatoreSel asc1=new AscoltatoreSel();
    selectall.addActionListener(asc1);
    setVisible(true);

    AscoltatoreDesel asc2=new AscoltatoreDesel();
    deselectall.addActionListener(asc2);
    setVisible(true);

    Ascoltatore asc=new Ascoltatore();
    altervista.addActionListener(asc);
    setVisible(true);

    this.pack();
}

class Ascoltatore extends WindowAdapter implements ActionListener{
    public void windowClosing(WindowEvent e){
        System.exit(0);
    }
    public void actionPerformed(ActionEvent e){
        if(e.getSource()==altervista){
            setVisible(false);
            boh(b);
        }
    }
}

class AscoltatoreSel extends WindowAdapter implements ActionListener{
    public void windowClosing(WindowEvent e){
        System.exit(0);
    }
    public void actionPerformed(ActionEvent e){
        if(e.getSource()==selectall){
            for(i=0; i<num; i++) {
                b[i].setSelected(true);
                setVisible(true);
            }
        }
    }
}

class AscoltatoreDesel extends WindowAdapter implements ActionListener{
    public void windowClosing(WindowEvent e){
        System.exit(0);
    }
    public void actionPerformed(ActionEvent e){
        if(e.getSource()==deselectall){
            for(i=0; i<num; i++) {
                b[i].setSelected(false);
            }
        }
    }
}


public static void boh(JCheckBox[] b){
    JCheckBox[] buttons=getB();

    for (JCheckBox c:buttons){
        check.add(c.isSelected());
    }

}


}

提前致谢!

ps。如果所有复选框都被选中,我需要获取boo = [true; true]

最佳答案

JRadioButtonExampleObservable,您的ClassObserver

JRadioButtonExample中,应保留要在此对象的状态更改时通知的观察者的列表。您可以实现以下类似的方法,notifyObservers()通知所有已注册的观察者。

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Observer;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;

public class JRadioButtonExample extends JFrame   {

    static JCheckBox b[];
    static Vector<Boolean> check = new Vector<Boolean>();
    JButton altervista = new JButton("RUN");
    JButton selectall = new JButton("select all");
    JButton deselectall = new JButton("deselect all");
    static int num;

    private ArrayList<PropertyChangeListener> listeners = new ArrayList<PropertyChangeListener>();

    public static JCheckBox[] getB() {
        return b;
    }

    public void setB(JCheckBox[] b2) {
        b = b2;
    }

    public Vector<Boolean> getCheck() {
        return check;
    }

    public void setCheck(Vector<Boolean> check2) {
        check = check2;
    }

    public JRadioButtonExample(int num, ArrayList<String> lbl) {

        super("JRadioButtonExample");

        getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING));

        b = new JCheckBox[num];

        for (int i = 0; i < num; i++) {
            // creo i bottoni
            b[i] = new JCheckBox(lbl.get(i));
            getContentPane().add(b[i]);
        }

        // adding buttons
        getContentPane().add(selectall);
        getContentPane().add(deselectall);
        getContentPane().add(altervista);

        // adding listeners
        AscoltatoreSel asc1 = new AscoltatoreSel();
        selectall.addActionListener(asc1);
        setVisible(true);

        AscoltatoreDesel asc2 = new AscoltatoreDesel();
        deselectall.addActionListener(asc2);
        setVisible(true);

        Ascoltatore asc = new Ascoltatore();
        altervista.addActionListener(asc);
        setVisible(true);

        this.pack();
    }
    public void addPropertyChangeListener(PropertyChangeListener listener){
        this.listeners.add(listener);
    }
    public void notifyObservers(){
        for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
            PropertyChangeListener name = (PropertyChangeListener) iterator
                    .next();
            name.propertyChange(null);

        }
    }

    class Ascoltatore extends WindowAdapter implements ActionListener {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }

        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == altervista) {
                setVisible(false);
                boh(b);
            }
            notifyObservers();
        }
    }

    class AscoltatoreSel extends WindowAdapter implements ActionListener {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }

        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == selectall) {
                for (int i = 0; i < num; i++) {
                    b[i].setSelected(true);
                    setVisible(true);
                }
            }
            notifyObservers();
        }
    }

    class AscoltatoreDesel extends WindowAdapter implements ActionListener {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }

        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == deselectall) {
                for (int i = 0; i < num; i++) {
                    b[i].setSelected(false);
                }
            }
            notifyObservers();
        }
    }

    public static void boh(JCheckBox[] b) {
        JCheckBox[] buttons = getB();

        for (JCheckBox c : buttons) {
            check.add(c.isSelected());
        }

    }
}


您的Class应该实现PropertyChangeListener,并且应该将自己注册为JRadioButtonExample的所有侦听器。
并实现propertyChange(..)方法,这就是您要print()的位置。

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;

import java.util.Vector;

public class Class implements PropertyChangeListener{
    private JRadioButtonExample b;

    public Class(JRadioButtonExample b){
        this.b = b;
        b.addPropertyChangeListener(this);
    }

    public static void main(String[] args){
        ArrayList<String> a = new ArrayList<String>();
        a.add("hi");
        a.add("all");
        JRadioButtonExample myButton = new JRadioButtonExample(2,a);
        Class myClass = new Class(myButton);
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        Vector<Boolean> boo = b.getCheck();
         for(Boolean bool : boo){
               System.out.println(bool);
         }
    }
}

10-05 23:43