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
?
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.)
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
,
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With