1

選択したラジオボタンに応じて、2つの変数のいずれかを計算するプログラムがあります。何らかの理由で、isSelected()がtrueまたはfalseを返していません。以下にコードを投稿します。

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.text.DecimalFormat;

public class FutureValueFrame extends JFrame {
  public FutureValueFrame() {
    setTitle("Sample App");
    setSize(400,400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}


public static void main(String[] args) {

    JFrame f = new FutureValueFrame();

    //GUI and BUTTONS
    JRadioButton monthlyRadioButton = new JRadioButton("Monthly Payment");
    JRadioButton loanAmountButton = new JRadioButton("Loan Amount");
    ButtonGroup selection = new ButtonGroup();
    selection.add(monthlyRadioButton);
    selection.add(loanAmountButton);

    JFormattedTextField loanAmountField = new JFormattedTextField(new DecimalFormat("####.##"));
    JFormattedTextField interestRateField = new JFormattedTextField(new DecimalFormat("####.##"));
    JFormattedTextField yearField = new JFormattedTextField(new DecimalFormat("####.##"));
    JFormattedTextField monthlyPaymentField = new JFormattedTextField(new DecimalFormat("####.##"));


    JPanel menuPanel = new JPanel();
    menuPanel.setLayout(new GridLayout(1,2));

    //ACTION LISTENER FOR RADIO BUTTONS
    monthlyRadioButton.addActionListener(new SelectionListener(monthlyRadioButton, loanAmountButton, loanAmountField, monthlyPaymentField));
    loanAmountButton.addActionListener(new SelectionListener(monthlyRadioButton, loanAmountButton, loanAmountField, monthlyPaymentField));

    JPanel topPanel = new JPanel();
    topPanel.setLayout(new GridLayout(1,2));
    topPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    topPanel.add(monthlyRadioButton);
    topPanel.add(loanAmountButton);

    JPanel botPanel = new JPanel();
    botPanel.setLayout(new GridLayout(4,2));

    botPanel.add(new JLabel("Loan Amount:"));
    botPanel.add(loanAmountField);

    botPanel.add(new JLabel("Yearly Interest Rate:"));
    botPanel.add(interestRateField);

    botPanel.add(new JLabel("Number of Years:"));
    botPanel.add(yearField);

    botPanel.add(new JLabel("Monthly Payment:"));
    botPanel.add(monthlyPaymentField);

    JPanel container = new JPanel();
    container.setLayout(new GridLayout(3,1));
    container.add(topPanel);
    container.add(botPanel);
    container.add(menuPanel);

    f.add(container);

    JButton calculateButton = new JButton("Calculate");

    if (monthlyRadioButton.isSelected()){
        calculateButton.addActionListener(new CalculateMonthlyListener(loanAmountField, interestRateField, yearField, monthlyPaymentField));
    }
    if (loanAmountButton.isSelected()){
        calculateButton.addActionListener(new CalculateLoanListener(loanAmountField, interestRateField, yearField, monthlyPaymentField));
    }

    JButton exitButton = new JButton("Exit");
    exitButton.addActionListener(new ExitListener());

    menuPanel.add(calculateButton);
    menuPanel.add(exitButton);     

    f.setVisible(true);
    f.setLocationRelativeTo(null);

    }

    class CalculateMonthlyListener implements ActionListener {

private JFormattedTextField loanAmountField;
private JFormattedTextField monthlyPaymentField;
private JFormattedTextField interestRateField;
private JFormattedTextField yearField; 
private float result;

 public CalculateMonthlyListener (JFormattedTextField loanAmountField, JFormattedTextField interestRateField, JFormattedTextField yearField, JFormattedTextField monthlyPaymentField)
{
  this.interestRateField = interestRateField;   
  this.yearField = yearField;
  this.loanAmountField = loanAmountField;
  this.monthlyPaymentField = monthlyPaymentField;
}

public void actionPerformed(ActionEvent event){

        monthlyPaymentField.setValue(new Double(12.22));
        System.out.println("You selected monthly");

}
}


class CalculateLoanListener implements ActionListener {

private JFormattedTextField loanAmountField;
private JFormattedTextField monthlyPaymentField;
private JFormattedTextField interestRateField; 
private JFormattedTextField yearField;
private float result;

public CalculateLoanListener (JFormattedTextField loanAmountField, JFormattedTextField interestRateField, JFormattedTextField yearField, JFormattedTextField monthlyPaymentField)
{
  this.interestRateField = interestRateField;   
  this.yearField = yearField;
  this.loanAmountField = loanAmountField;
  this.monthlyPaymentField = monthlyPaymentField;
}

public void actionPerformed(ActionEvent event){

   loanAmountField.setValue(new Double(12.22));

   System.out.println("You selected loan");



}
}

class ExitListener implements ActionListener {
public void actionPerformed(ActionEvent event){
    //f.dispose();
    System.exit(0);
    //System.out.println("You clicked exit");
}
}

class SelectionListener implements ActionListener {

private JRadioButton monthlyRadioButton;
private JRadioButton loanAmountButton;
private JFormattedTextField loanAmountField;
private JFormattedTextField monthlyPaymentField;


public SelectionListener (JRadioButton monthlyRadioButton, JRadioButton loanAmountButton, JFormattedTextField loanAmountField, JFormattedTextField monthlyPaymentField)
{
    this.monthlyRadioButton = monthlyRadioButton;   
    this.loanAmountButton = loanAmountButton;
    this.loanAmountField = loanAmountField;
    this.monthlyPaymentField = monthlyPaymentField;

}

public void actionPerformed(ActionEvent event){
      if(event.getSource() == monthlyRadioButton){
        loanAmountField.setEditable(false);
        monthlyPaymentField.setEditable(true);
      }
      else {
        monthlyPaymentField.setEditable(false);
        loanAmountField.setEditable(true);

      }
}
}



}

このスニペットで問題が発生すると思います。

    if (monthlyRadioButton.isSelected()){
        calculateButton.addActionListener(new CalculateMonthlyListener(loanAmountField, interestRateField, yearField, monthlyPaymentField));
    }
    if (loanAmountButton.isSelected()){
        calculateButton.addActionListener(new CalculateLoanListener(loanAmountField, interestRateField, yearField, monthlyPaymentField));
    }

isSelectedはtrueを返していません。intiを作成して1に設定してみました。各条件でi==1をチェックしたところ、正しく実行されました。

洞察はありますか?

4

3 に答える 3

4

選択に基づいてボタンにアタッチするアクションリスナーを決定するのではなく、ボタンにアタッチされた単一のアクションリスナーに選択チェックコードを配置する必要があります。

問題の原因であると思われるコードを次のように置き換えます。

calculateButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        if (selection.getSelection().equals(monthlyRadioButton.getModel())) {
             monthlyPaymentField.setValue(new Double(12.22));
            System.out.println("You selected monthly");
        } else {
            loanAmountField.setValue(new Double(12.22));
            System.out.println("You selected loan");
        }
    }
});

これをコンパイルするには、上記のアクションリスナーでアクセスされる変数をfinalにする必要があります。または、CalculateMonthlyListenerとCalculateLoanListenerの両方を、上記と同じように実行する単一のクラスに置き換えます。

私は直接使用しなかっJRadioButton.isSelected()たが、代わりにあなたのを使用したことに注意してくださいButtonGroup.getSelection()。ラジオボタン自体を確認することもできます。

于 2012-06-22T07:26:47.107 に答える
3
  • isSelected行われJRadioButtonた後に解雇されますActionListener

それから

  • /ItemListenerをチェックするために(常に2回起動)を使用しますSELECTEDDESELECTED

  • に入れJRadioButtonsて、ButtonGroup値をActionCommand返しStringます
于 2012-06-22T07:37:20.637 に答える
2

calculateButton次の2つの理由により、リスナーが割り当てられていません。

  1. 最初は、両方のラジオボタンが選択されていません。1つを選択済みとして設定すると、適切なcalculateButtonリスナーが適切なifステートメントで割り当てられます。
  2. actionPerformedあなたの方法では、新しいリスナーSelectionListenerを設定しません。calculateButtonそれを変更します。
于 2012-06-22T06:44:29.940 に答える