возвращение значения из ButtonGroup () - PullRequest
2 голосов
/ 21 марта 2012

У меня проблема с возвратом простого значения int из созданной мною радиокнопки.

        static int f5(String question) 
        {
            int intValue = 0;
            answered = false;
            JFrame f = new JFrame(question);
            f.setSize(300, 750);

            f.addWindowListener(new WindowAdapter() 
            {
              public void windowClosing(WindowEvent we) 
              { 
                  System.exit(0); 
              }
            });

            JPanel p = new JPanel(new GridLayout(0,1,3,3));
            final ButtonGroup bg = new ButtonGroup();
            JRadioButton radioButton;

            p.add(radioButton = new JRadioButton("q1"));
            radioButton.setActionCommand("1");
            bg.add(radioButton);
            p.add(radioButton = new JRadioButton("q2"));
            radioButton.setActionCommand("2");
            bg.add(radioButton);
            p.add(radioButton = new JRadioButton("q3"));
            radioButton.setActionCommand("3");
            bg.add(radioButton);
            p.add(radioButton = new JRadioButton("q4"));
            radioButton.setActionCommand("4");
            bg.add(radioButton);

            JButton orderButton = new JButton("Submit");
            p.add(orderButton);

            f.getContentPane().setLayout(new FlowLayout());
            f.getContentPane().add(p);
            f.pack();


            orderButton.addActionListener(new ActionListener() 
            {
              public void actionPerformed(ActionEvent ae) 
              {

                String ans = bg.getSelection().getActionCommand();
                boolean sel;
                f5Answer = Integer.parseInt(ans);
                answered = true;
                System.out.println("in void: " + f5Answer); //how to return the f5Answer?

              }

            });
            f.setVisible(true);


            f5Answer = intValue;
            System.out.println("out of void: " + f5Answer);//this only returns 0 right away



            return intValue;
        }

Я хотел бы вернуть значение и завершить функцию после того, как я найду значение, когда я нажму "отправить". Прямо сейчас значение возвращается к 0 сразу после того, как я использую функцию в main. Как сделать так, чтобы функция возвращала значение только после нажатия кнопки отправки?

Заранее спасибо!

1 Ответ

5 голосов
/ 21 марта 2012

Мне кажется, я понимаю твою проблему.Что вам нужно сделать, это сделать объект ButtonGroup полем частного класса , а затем дать вашему классу открытый метод, скажем что-то вроде ...

public int getSelection() {
   ButtonModel btnModel = bg.getSelection();
   if (bg == null) {
     // TODO: throw an exception -- no radio button has been selected
   } else {
      return Integer.parseInt(btnModel.getActionCommand());
   }
}

Затем в actionlistener вашей кнопки отправкиуведомите все стороны о том, что выбор сделан, и что они должны вызвать метод getSelection() для этого объекта, чтобы выяснить, что это за выбор.

Редактировать
Ах, теперь я вижу, что вы пытаетесь сделать - вы пытаетесь создать диалог с вопросом.Мое предложение заключается в том, что вы действительно делаете это, создаете диалог , а не JFrame, и фактически делаете его модальным диалогом, чтобы ваш метод ожидалчтобы пользователь отвечал, прежде чем двигаться дальше, и чтобы после завершения метода ButtonGroup фактически содержала правильную информацию.Самый простой способ сделать это - использовать JOptionPane, которые являются очень гибкими критериями, и использовать тот, который содержит JPanel, который содержит сетку ваших JRadioButtons.Затем выясните, что пользователь выбрал после , которую возвращает JOptionPane.Здесь статический метод может работать нормально, так как вы не меняете состояние объекта.Например:

   public static String myQuestion(String question, String[] answers) {
      JPanel panel = new JPanel(new GridLayout(0, 1));
      final ButtonGroup btnGroup = new ButtonGroup();

      for (String answer : answers) {
         JRadioButton radioBtn = new JRadioButton(answer);
         radioBtn.setActionCommand(answer);
         btnGroup.add(radioBtn);
         panel.add(radioBtn);
      }

      String[] options = { "Submit", "Cancel" };
      String initialValue = "Submit";

      int optionResult = JOptionPane.showOptionDialog(null, panel, question,
            JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null,
            options, initialValue);

      // *** code will pause here and wait for the user to handle the modal dialog

      if (optionResult != 0) {
         return ""; // did not select "Submit"
      } else if (optionResult == 0) {
         ButtonModel btnModel = btnGroup.getSelection();
         if (btnModel == null) {
            return ""; // error! nothing selected
         } else {
            return btnModel.getActionCommand();
         }
      }
      return "";
   }

   public static void main(String[] args) {
      String question = "Where is Ulysses S. Grant buried?";
      String[] answers = { "In my back yard", "At the white house",
            "red my lord! No, blue!", "In Grant's tomb", "Who the hell is Ulysses S. Grant?" };
      String selectedString = myQuestion(question, answers);
      System.out.println("Answer selected: " + selectedString);
   }
...