2012-06-25 13 views
5

Seçilmiş olan radyo düğmesine bağlı olarak 2 değişkenden birini hesapladığım bir programım var. Bir JFormattedText alanından bir değer almak için getValue kullanmaya çalışıyorum ve başka bir JFormattedText alanı (sonunda sayı ile bazı hesaplamalar yapacağım) alanında görüntülemeye çalışıyorum.Başka bir JFormattedText alanında görüntülemek üzere JFormattedText için getValue kullanma

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

Benim sorunum aşağıda kod snippet'te oluşur:

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

İşte, getValue sonuçlanması atamak çalışıyorum. Ben Oracle belgelerine baktım ve değeri almak için kod gibi görünüyor sadece interestRateField.getValue(); Bunu denediğimde, Can't convert object to double söyleyerek bir hata var, bu yüzden floatValue() ekledi ve hatayı kaldırmak için döktüm.

Hesaplama tuşuna bastığımda, monthlyPaymentField içinde interestRateField girişini görüntülemez.

nasıl getValue kullanarak (DecimalFormat kullanılarak JFormattedTextField itibaren) benim değerini alırım ve sonra farklı JFormattedTextField görüntülemek?

+0

Swing malzemelerini EDT'den başka bir konu üzerinde yapmak kesinlikle tavsiye edilmez. Çok sorunlara yol açabilir. Sadece şunu söyle ... –

cevap

5

Biraz Eels Of Hoverkraft Full cevabı

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

biçimlendirme/JFormattedTextField arasında getValue ve setValue yöntemleri kullanmak ve manuel ayrıştırmayı atlamak için ayarlanmış Bu, en az JFormattedTextField kullanır tasarlandığı gibi, ancak hala JFormattedTextField'un tüm kullanılabilirlik 'quirks'leri vardır. yaklaşık sorunların büyük kısmını çözer ve hala sürüm geliştirilebilir düşünüyorum rağmen (ekstra bir göz değer olabilir improving the JFormattedTextField, arka plan boyama örneğin kısa sürede geçersiz veriler kırmızı the tips4java site bir blog gönderisi bulunmaktadır

kullanıcıya görsel bir ipucu vermek için girilir.)

+0

Cevabımı sildim. Bizi aramak ve çok daha iyi bir çözümü öğretmek için teşekkür ederiz! 1+ –

İlgili konular