Using getValue for JFormattedText to display in another JFormattedText field
Asked Answered
W

2

5

I have a program where I calculate for either 1 of 2 variables depending on the radio button selected. I'm trying to use getValue to get a value from a JFormattedText field and display it on another JFormattedText field (eventually I will do some calculations with the number).

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");

        calculateButton.addActionListener(new CalculateMonthlyListener(loanAmountField, interestRateField, yearField, monthlyPaymentField, selection, monthlyRadioButton, loanAmountButton));


        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 double result;
        private ButtonGroup selection;
        private JRadioButton monthlyRadioButton;
        private JRadioButton loanAmountButton;

        public CalculateMonthlyListener (JFormattedTextField loanAmountField,
                                        JFormattedTextField interestRateField,
                                        JFormattedTextField yearField,
                                        JFormattedTextField monthlyPaymentField,
                                        ButtonGroup selection,
                                        JRadioButton monthlyRadioButton,
                                        JRadioButton loanAmountButton)
        {
            this.interestRateField = interestRateField;   
            this.yearField = yearField;
            this.loanAmountField = loanAmountField;
            this.selection = selection;
            this.monthlyRadioButton = monthlyRadioButton;
            this.loanAmountButton = loanAmountButton;
            this.monthlyPaymentField = monthlyPaymentField;
        }

        public void actionPerformed(ActionEvent e)
        {
            if (selection.getSelection().equals(monthlyRadioButton.getModel()))
            {
                result  = ((Double) interestRateField.getValue()).floatValue();
                monthlyPaymentField.setValue(new Double(result));
                System.out.println("You selected monthly");
            }
            else
            {
                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);
            }
        }
    }
}

My problem occurs in the snippet of code below:

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

Here, I am trying to assign the getValue to result. I've looked Oracle documentation and it seems like the code to get the value is simply interestRateField.getValue(); When I tried this though, I got an error saying Can't convert object to double so I added floatValue() and cast it to remove the error.

When I press calculate, it does not display the input from interestRateField in monthlyPaymentField.

How do I get my value (from JFormattedTextField using DecimalFormat) using getValue and then display it in a different JFormattedTextField?

Wedlock answered 25/6, 2012 at 15:35 Comment(1)
It is strongly discouraged to do Swing stuff on another thread than EDT. It can lead to a lot of problems. Just sayin'...Cavalla
P
5

Slightly adjusted the answer of Hovercraft Full Of Eels to use the getValue and setValue methods of the JFormattedTextField and skip the manual parsing/formatting

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import java.awt.event.ActionEvent;
import java.text.DecimalFormat;

public class FutureValueFrame extends JFrame {
  public static void main( String[] args ) {
    DecimalFormat format = new DecimalFormat( "####.##" );
    //in case you always want to see the 2 fraction digits
    //format.setMinimumFractionDigits( 2 );
    final JFormattedTextField field1 = new JFormattedTextField(
        format );
    final JFormattedTextField field2 = new JFormattedTextField(
        format );
    field1.setColumns( 15 );
    field2.setColumns( 15 );
    JButton btn = new JButton( new AbstractAction( "Multiply by 2" ) {

      @Override
      public void actionPerformed( ActionEvent e ) {
        Number value = ( Number ) field1.getValue();
        if ( value != null ){
          field2.setValue( 2 * value.doubleValue() );
        }
      }
    } );

    JPanel panel = new JPanel();
    panel.add( field1 );
    panel.add( btn );
    panel.add( field2 );
    JOptionPane.showMessageDialog( null, panel );
  }
}

This at least uses the JFormattedTextField as it was designed, but still has all the usability 'quirks' of the JFormattedTextField.

There is a blogpost on the tips4java site about improving the JFormattedTextField which solves the largest part of the issues and might be worth an extra look (although I still think that version can be improved, e.g. by coloring the background red as soon as invalid data is entered to give the user a visual clue.)

Preussen answered 25/6, 2012 at 21:54 Comment(1)
I've deleted my answer. Thank you for searching out and teaching us the far better solution! 1+Woodwind
F
3

Have look at, and to use DocumentListener for this job, for example

EDIT

1.your code is too close to the How to Use Formatted Text Fields

2.use ItemListener (always firing two events SELECTED / DESELECTED) for JRadioButton

3.you can not attach aggregated ActionListener for two or more JComponents,

Flavopurpurin answered 25/6, 2012 at 15:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.