2017-05-01 2 views
1

Ich habe den Beispielcode unten, und ich habe Probleme, es zu verstehen. So würde Ich mag zwei fragen 2 Fragen:Wie funktioniert dieses JFormattedTextField?

  1. Warum JFormattedTextField haben einen "Wert" (getValue(), setValue()) und ein JTextField nicht?

  2. Im propertyChange() Methode, warum ist es ausreichend, zu schreiben:

    amount = ((Number)amountField.getValue()).doubleValue();

    die Menge zu aktualisieren, so dass es der richtige Weg angezeigt wird, aber für die paymentField Ich habe die setValue() Methode aufrufen ?

Beispiel: "(getValue(), setValue()) und eine JTextField nicht "

/* 
* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. 
* 
* Redistribution and use in source and binary forms, with or without 
* modification, are permitted provided that the following conditions 
* are met: 
* 
* - Redistributions of source code must retain the above copyright 
*  notice, this list of conditions and the following disclaimer. 
* 
* - Redistributions in binary form must reproduce the above copyright 
*  notice, this list of conditions and the following disclaimer in the 
*  documentation and/or other materials provided with the distribution. 
* 
* - Neither the name of Oracle or the names of its 
*  contributors may be used to endorse or promote products derived 
*  from this software without specific prior written permission. 
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
*/ 



import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.text.*; 

import java.beans.PropertyChangeListener; 
import java.beans.PropertyChangeEvent; 

import java.text.*; 

/** 
* FormattedTextFieldDemo.java requires no other files. 
* 
* It implements a mortgage calculator that uses four 
* JFormattedTextFields. 
*/ 
public class FormattedTextFieldDemo extends JPanel 
            implements PropertyChangeListener { 
    //Values for the fields 
    private double amount = 100000; 
    private double rate = 7.5; //7.5% 
    private int numPeriods = 30; 

    //Labels to identify the fields 
    private JLabel amountLabel; 
    private JLabel rateLabel; 
    private JLabel numPeriodsLabel; 
    private JLabel paymentLabel; 

    //Strings for the labels 
    private static String amountString = "Loan Amount: "; 
    private static String rateString = "APR (%): "; 
    private static String numPeriodsString = "Years: "; 
    private static String paymentString = "Monthly Payment: "; 

    //Fields for data entry 
    private JFormattedTextField amountField; 
    private JFormattedTextField rateField; 
    private JFormattedTextField numPeriodsField; 
    private JFormattedTextField paymentField; 

    //Formats to format and parse numbers 
    private NumberFormat amountFormat; 
    private NumberFormat percentFormat; 
    private NumberFormat paymentFormat; 

    public FormattedTextFieldDemo() { 
     super(new BorderLayout()); 
     setUpFormats(); 
     double payment = computePayment(amount, 
             rate, 
             numPeriods); 

     //Create the labels. 
     amountLabel = new JLabel(amountString); 
     rateLabel = new JLabel(rateString); 
     numPeriodsLabel = new JLabel(numPeriodsString); 
     paymentLabel = new JLabel(paymentString); 

     //Create the text fields and set them up. 
     amountField = new JFormattedTextField(amountFormat); 
     amountField.setValue(new Double(amount)); 
     amountField.setColumns(10); 
     amountField.addPropertyChangeListener("value", this); 

     rateField = new JFormattedTextField(percentFormat); 
     rateField.setValue(new Double(rate)); 
     rateField.setColumns(10); 
     rateField.addPropertyChangeListener("value", this); 

     numPeriodsField = new JFormattedTextField(); 
     numPeriodsField.setValue(new Integer(numPeriods)); 
     numPeriodsField.setColumns(10); 
     numPeriodsField.addPropertyChangeListener("value", this); 

     paymentField = new JFormattedTextField(paymentFormat); 
     paymentField.setValue(new Double(payment)); 
     paymentField.setColumns(10); 
     paymentField.setEditable(false); 
     paymentField.setForeground(Color.red); 

     //Tell accessibility tools about label/textfield pairs. 
     amountLabel.setLabelFor(amountField); 
     rateLabel.setLabelFor(rateField); 
     numPeriodsLabel.setLabelFor(numPeriodsField); 
     paymentLabel.setLabelFor(paymentField); 

     //Lay out the labels in a panel. 
     JPanel labelPane = new JPanel(new GridLayout(0,1)); 
     labelPane.add(amountLabel); 
     labelPane.add(rateLabel); 
     labelPane.add(numPeriodsLabel); 
     labelPane.add(paymentLabel); 

     //Layout the text fields in a panel. 
     JPanel fieldPane = new JPanel(new GridLayout(0,1)); 
     fieldPane.add(amountField); 
     fieldPane.add(rateField); 
     fieldPane.add(numPeriodsField); 
     fieldPane.add(paymentField); 

     //Put the panels in this panel, labels on left, 
     //text fields on right. 
     setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); 
     add(labelPane, BorderLayout.CENTER); 
     add(fieldPane, BorderLayout.LINE_END); 
    } 

    /** Called when a field's "value" property changes. */ 
    public void propertyChange(PropertyChangeEvent e) { 
     Object source = e.getSource(); 
     if (source == amountField) { 
      amount = ((Number)amountField.getValue()).doubleValue(); 
     } else if (source == rateField) { 
      rate = ((Number)rateField.getValue()).doubleValue(); 
     } else if (source == numPeriodsField) { 
      numPeriods = ((Number)numPeriodsField.getValue()).intValue(); 
     } 

     double payment = computePayment(amount, rate, numPeriods); 
     paymentField.setValue(new Double(payment)); 
    } 

    /** 
    * Create the GUI and show it. For thread safety, 
    * this method should be invoked from the 
    * event dispatch thread. 
    */ 
    private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame frame = new JFrame("FormattedTextFieldDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Add contents to the window. 
     frame.add(new FormattedTextFieldDemo()); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     //Schedule a job for the event dispatch thread: 
     //creating and showing this application's GUI. 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       //Turn off metal's use of bold fonts 
      UIManager.put("swing.boldMetal", Boolean.FALSE); 
       createAndShowGUI(); 
      } 
     }); 
    } 

    //Compute the monthly payment based on the loan amount, 
    //APR, and length of loan. 
    double computePayment(double loanAmt, double rate, int numPeriods) { 
     double I, partial1, denominator, answer; 

     numPeriods *= 12;  //get number of months 
     if (rate > 0.01) { 
      I = rate/100.0/12.0;   //get monthly rate from annual 
      partial1 = Math.pow((1 + I), (0.0 - numPeriods)); 
      denominator = (1 - partial1)/I; 
     } else { //rate ~= 0 
      denominator = numPeriods; 
     } 

     answer = (-1 * loanAmt)/denominator; 
     return answer; 
    } 

    //Create and set up number formats. These objects also 
    //parse numbers input by user. 
    private void setUpFormats() { 
     amountFormat = NumberFormat.getNumberInstance(); 

     percentFormat = NumberFormat.getNumberInstance(); 
     percentFormat.setMinimumFractionDigits(3); 

     paymentFormat = NumberFormat.getCurrencyInstance(); 
    } 
} 

Antwort

0

" Warum hat eine JFormattedTextField ein" Wert

Die Textattribute von JTextField und JFormattedTextField sind der tatsächliche Text, der von jedem angezeigt wird. Aber JFormattedTextField zeigt nicht nur etwas Text, den Sie ihm geben. Es übersetzt mit Hilfe eines von Ihnen bereitgestellten Formatierers zwischen einem Objekt - in diesem Fall einer Zahl - und der praktischen lesbaren Textdarstellung, die Sie auf dem Bildschirm sehen. Das Objekt, dessen Wert Sie anzeigen, ist der "Wert" des JFormattedTextField, wie es auf dem Bildschirm aussieht, ist der "Text". Ein regulärer JTextField hingegen zeigt einfach den Text an, den Sie ihm zeigen, und gibt zurück, was immer Sie eintippen, so dass kein separates Wertattribut benötigt wird, da es immer mit dem "Text" identisch wäre.

"Warum ist es ausreichend zu schreiben" Betrag = ((Anzahl) BetragField.getValue()). DoubleValue(); die setValue-Methode? "

Sie sind nicht

amount = ((Number)amountField.getValue()).doubleValue(); 

amountField zu aktualisieren schreiben, tun Sie es, was in amountField getippt Benutzer herauszufinden. amountField aktualisiert sich selbst als Antwort auf Benutzereingaben, weil das JFormattedTextField s tut.

nun gelernt haben, was der Benutzer in amountField eingegeben, können Sie den Zahlungsbetrag neu berechnen und die paymentField sagen, die neue Zahlung zu zeigen, indem sie ihre setValue Methode aufrufen.

+0

Vielen Dank! :) So wird das Betragsfeld aktualisiert, denn wenn der Benutzer die Eingabetaste drückt, wird standardmäßig die commitEdit() - Methode aufgerufen. Weil ich dies auf der Site von Oracle gefunden habe: "Die Methode commitEdit legt den Wert auf jedes Objekt fest, das der Formatierer bestimmt, wird durch den Feldtext dargestellt. Die Methode commitEdit wird automatisch aufgerufen, wenn eine der folgenden Bedingungen eintritt: Wenn der Benutzer die Eingabetaste drückt während das Feld den Fokus hat. Standardmäßig, wenn das Feld den Fokus verliert. " –