0

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

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 调用一个外部类。问题是我无法将 main 中的 system.out.println 与 JRadioButtonExample 中执行的操作同步。

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]

4

2 回答 2

1

JRadioButtonExampleObservable,你Class是一个Observer

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(..)方法,这就是您要打印()的地方。

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);
         }      
    }
}
于 2012-01-26T10:22:58.947 回答
0

您需要ActionListeners在数组中的每个复选框上进行注册,以便在单击它们时执行某些操作。像这样:

// In your constructor:
  public JRadiobuttonExample(int num, ArrayList<String> lbl) {
    // ...
    for(int i=0; i<num; i++) {
      b[i] = new JCheckBox(lbl.get(i));
      // Add this line below:
      b[i].addActionListener(createCheckboxListener());
      getContentPane().add(b[i]);
    }
    // ...
  }

  // Then add this method 
  /** Do something when a checkbox is checked */
  private ActionListener createCheckboxListener() {
    return new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        if (e.getSource() instanceof JCheckBox) {
          JCheckBox source = (JCheckBox)e.getSource();
          System.out.println("You clicked on: " + source.getText());
        }
      }
    };
  }

此外,我会查看您的代码中是否有任何编译错误。当我尝试运行您的示例代码时,它会给我错误,例如未声明的变量等。

这是完整的工作示例:

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;




  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));
      b[i].addActionListener(createCheckboxListener());
      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();
  }

  /** Do something when a checkbox is checked */
  private ActionListener createCheckboxListener() {
    return new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        if (e.getSource() instanceof JCheckBox) {
          JCheckBox source = (JCheckBox)e.getSource();
          System.out.println("You clicked on: " + source.getText());
        }
      }
    };
  }

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

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

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


  public static void main(String []args){
    System.out.println("Hi all");
    ArrayList<String> a=new ArrayList<String>();
    a.add("hi");
    a.add("all");
    JRadiobuttonExample b=new JRadiobuttonExample(2,a);
    Vector<Boolean> boo=b.getCheck();
    for(Boolean b2:boo){
      System.out.println(b2);
    }
  }

}
于 2012-01-26T10:12:27.393 回答