0

まあ、それは奇妙です。ちなみに私はラジオボタンが苦手です。しかし、RadioButton を含む JPanel プログラムを netbeans で作成しました。このすべての情報を JTextFields で入力すると (問題ありません)、最後に、必要な選択をクリックする JButton が表示されます。次に、すべての情報を取得してこれを出力する JButton があります。RadioButton については、最初に通常どおり入力しました。

    family = new JRadioButton("Family", true);
    friend = new JRadioButton("Friend");
    relative = new JRadioButton("Relative");
    friendFriend = new JRadioButton("Friend of Friend");

    ButtonGroup group = new ButtonGroup();
    group.add (friend);
    group.add (family);
    group.add (relative);
    group.add (friendFriend);

(RadioButtons のリスナーが必要かどうかはわかりませんが、私のプログラムは何があっても「クラッシュ」するようです)。

次に、すべてのテキストフィールドとラジオボタンを含む JButton のアクションリスナーを 1 つ用意しました。しかし、RadioButton が問題です。

私が持っていたアクションリスナーで: Object source = event.getSource();

        if (source == family)
            relation1 = true;
        else
            if (source == friend)
                relation2 = true;
            else
                if(source == relative)
                    relation3 = true;
                else
                    if(source == friendFriend)
                    relation4 = true;

次に、リレーション クラスを作成しました。

public Relation(boolean relation1, boolean relation2, boolean relation3,
        boolean relation4)
{
    this.arrayFamily = relation1;
    this.arrayFriend = relation2;
    this.arrayRelative = relation3;
    this.arrayFriendFriend = relation4;
}

public String relations ()
{
    String relationship = null;

    if(arrayFamily && !arrayFriend && !arrayRelative && !arrayFriendFriend == true)
    {
        relationship = "Family";
    }
    else
        if(arrayFriend && !arrayFamily && !arrayRelative && 
                !arrayFriendFriend == true)
        {
            relationship = "Friend";
        }
        else
            if(arrayRelative && !arrayFamily && !arrayFriend && 
                    !arrayFriendFriend == true)
            {
                relationship = "Relative";
            }
            else
                if(arrayFriendFriend && !arrayFamily && !arrayFriend &&
                        !arrayRelative == true)
                {
                    relationship = "Friend of a Friend";
                }
    return relationship;
}

}

最後にアクション リスナに戻ります。このクラスを実装します。

        Relation relationship = new Relation(relation1, relation2, relation3
                , relation4);

        String arrayRelation = relationship.relations();

最後に arrayRelation を配列に含めましたが、配列は正常に機能しました。

私の問題は、RadioButtons の配列の出力が「null」を読み取り続けることです (このコードが原因である可能性が最も高い: String relationship = null;)。これは、 if else ステートメントがどれも満たされていないことを意味すると思いますが、その理由は本当にわかりません。また、ラジオ ボタンをクリックせずに [送信] をクリックすると (ボタンは [家族] のまま)、null と表示されることにも注意してください。ボタンをクリックすると、意図した文字列を完全に読み取ることができます。しかし、後で別のボタンをクリックしてもう一度送信をクリックすると、文字列は「null」に戻ります。

長いことは承知していますが、迷っているので、助けていただければ幸いです。

PS私は問題を解決しようとして遊んでいたので、私のコードのいくつかの部分は繰り返しです。

4

2 に答える 2

1

アクションイベントを個別に処理することをお勧めします。たとえば、次のようになります。

family.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            familyActionPerformed(evt);
        }
    });

次に、familyActionPerformed(evt) を実装します。

private void familyActionPerformed(java.awt.event.ActionEvent evt) {
    // every click on family radio button causes the code here to be executed
    relation1 = true;
}

また、次のように、クリックしたボタンのイベント ハンドラーを記述します。

submitButtonActionPerformed(java.awt.event.ActionEvent evt) {
    // Here test the state of each radio button
    relation1 = family.isSelected();
    relation2 = friend.isSelected();
    relation3 = relative.isSelected();
    relation4 = friendFriend.isSelected();
}

詳細編集: NetBeans で行っていることは非常に簡単です。すべてを解決するチュートリアルは次のとおりです。

  1. チュートリアル 1

  2. チュートリアル 2


解決策をもう一度説明します。

例として「ファミリ」ボタンを使用すると、GUI コンポーネントを作成して初期化したコンストラクターで次のようにします。

JRadioButton family = new JRadioButton();
// do any other thing you want to do to this button and finally..
family.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            familyActionPerformed(evt);
        }
    });

JButton submit = new JButton("Submit");
submit.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            submitActionPerformed(evt);
        }
    });

次に、これらのメソッドをどこかに作成します。

private void familyActionPerformed(java.awt.event.ActionEvent evt){
    // each time family is selected, you code processes the lines below:
    ...
}

private void submiteActionPerformed(java.awt.event.ActionEvent evt){
    relation1 = family.isSelected();
    relation2 = friend.isSelected();
    relation3 = relative.isSelected();
    relation4 = friendFriend.isSelected();
}

残りの RadioButton についても同様のことを行います。

于 2012-12-09T04:01:02.817 に答える
1

あなたは物事を複雑にしすぎていると思います。押された JRadioButton の文字列だけが必要な場合は、ButtonGroup を使用して取得します。選択した JRadioButton の ButtonModel を返すことができ (いずれかが選択されている場合)、そこから actionCommand 文字列を抽出できますが、JRadioButton を作成するときにこれを忘れずに設定する必要があります。

例えば:

import java.awt.event.ActionEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class JRadioExample extends JPanel {
   private static final String[] RADIO_TITLES = { "Family", "Friend",
         "Relative", "Friend or Relative" };
   private ButtonGroup btnGrp = new ButtonGroup();

   public JRadioExample() {
      for (int i = 0; i < RADIO_TITLES.length; i++) {
         JRadioButton rBtn = new JRadioButton(RADIO_TITLES[i]);
         rBtn.setActionCommand(RADIO_TITLES[i]); // ***** this is what needs to
                                                 // be set
         btnGrp.add(rBtn);
         add(rBtn);
      }

      add(new JButton(new BtnAction("Get Chosen Selection")));
   }

   private class BtnAction extends AbstractAction {

      public BtnAction(String name) {
         super(name);
      }

      @Override
      public void actionPerformed(ActionEvent evt) {
         ButtonModel model = btnGrp.getSelection();
         if (model != null) {
            String actionCommand = model.getActionCommand();
            System.out.println("Selected Button: " + actionCommand);
         } else {
            System.out.println("No Button Selected");
         }    
      }
   }

   private static void createAndShowGui() {
      JRadioExample mainPanel = new JRadioExample();

      JFrame frame = new JFrame("JRadioExample");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
于 2012-12-09T04:05:47.610 に答える