我有一个程序,我根据所选的单选按钮计算2个变量中的任何一个。我正在尝试使用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
? < / p>
答案 0 :(得分:5)
稍微调整Hovercraft Full Of Eels的答案,使用getValue
的{{1}}和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
的所有可用性“怪癖”。
the tips4java site上有一篇关于improving the JFormattedTextField
的博客文章,它解决了问题的大部分内容,可能值得额外看一下(尽管我仍然认为版本可以改进,例如通过着色背景输入无效数据后立即显示红色,以便为用户提供直观的线索。)
答案 1 :(得分:3)
修改
1.您的代码太靠近How to Use Formatted Text Fields
了2. ItemListener
使用JRadioButton(始终为两个事件SELECTED
/ DESELECTED
)
3.您无法为两个或更多JComponents
附加汇总的ActionListener,