Использование getValue для JFormattedText для отображения в другом поле JFormattedText

У меня есть программа, в которой я вычисляю одну из двух переменных в зависимости от выбранного переключателя. Я пытаюсь использовать getValue, чтобы получить значение из поля JFormattedText и отобразить его в другом поле JFormattedText (в конце концов я сделаю некоторые вычисления с числом).

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

Моя проблема возникает в фрагменте кода ниже:

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

Здесь я пытаюсь присвоить getValue результату. Я просмотрел документацию Oracle, и кажется, что код для получения значения просто interestRateField.getValue(); Когда я попробовал это, я получил сообщение об ошибке Can't convert object to double, поэтому я добавил floatValue() и привел его, чтобы удалить ошибку.

Когда я нажимаю «Рассчитать», он не отображает ввод из interestRateField в monthlyPaymentField.

Как мне получить свое значение (из JFormattedTextField с использованием DecimalFormat) с помощью getValue, а затем отобразить его в другом JFormattedTextField?


person Huy    schedule 25.06.2012    source источник
comment
Настоятельно не рекомендуется выполнять действия Swing в другом потоке, кроме EDT. Это может привести к множеству проблем. Просто говорю'...   -  person Radu Murzea    schedule 25.06.2012


Ответы (2)


Немного скорректирован ответ Hovercraft Full Of Eels, чтобы использовать методы getValue и setValue метода JFormattedTextField и пропустить ручной разбор/форматирование.

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

Это, по крайней мере, использует JFormattedTextField в том виде, в каком он был разработан, но все еще имеет все «причуды» удобства использования JFormattedTextField.

На сайте tip4java есть запись в блоге о улучшение JFormattedTextField, которое решает большую часть проблем и, возможно, заслуживает дополнительного внимания (хотя я все еще думаю, что эту версию можно улучшить, например, окрасив фон в красный цвет). как только будут введены неверные данные, чтобы дать пользователю визуальную подсказку.)

person Robin    schedule 25.06.2012
comment
Я удалил свой ответ. Спасибо, что нашли и научили нас гораздо лучшему решению! 1+ - person Hovercraft Full Of Eels; 26.06.2012

Посмотрите и используйте DocumentListener для этого задания, для примера

РЕДАКТИРОВАТЬ

1. ваш код слишком близок к Как использовать форматированные текстовые поля< /а>

2. Используйте ItemListener (всегда запуская два события SELECTED / DESELECTED ) для JRadioButton

3. нельзя прикреплять агрегированные ActionListener для двух и более JComponents,

person mKorbel    schedule 25.06.2012