Java Swing How to - Highlight JFormattedTextField for larger value








Question

We would like to know how to highlight JFormattedTextField for larger value.

Answer

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.font.TextAttribute;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Map;
/*  w  w w.j av a2s . c o  m*/
import javax.swing.JFormattedTextField;
import javax.swing.JFormattedTextField.AbstractFormatter;
import javax.swing.JFormattedTextField.AbstractFormatterFactory;
import javax.swing.JFrame;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.InternationalFormatter;

public class Main {

  public static void main(String args[]) {
    JFrame frame = new JFrame();
    final JFormattedTextField textField1 = new JFormattedTextField(new Float(
        10.01));
    textField1.setFormatterFactory(new AbstractFormatterFactory() {
      @Override
      public AbstractFormatter getFormatter(JFormattedTextField tf) {
        NumberFormat format = DecimalFormat.getInstance();
        format.setMinimumFractionDigits(2);
        format.setMaximumFractionDigits(2);
        format.setRoundingMode(RoundingMode.HALF_UP);
        InternationalFormatter formatter = new InternationalFormatter(format);
        formatter.setAllowsInvalid(false);
        formatter.setMinimum(0.0);
        formatter.setMaximum(1000.00);
        return formatter;
      }
    });
    Map attributes = (new Font("Serif", Font.BOLD, 16)).getAttributes();
    attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
    final JFormattedTextField textField2 = new JFormattedTextField(new Float(
        10.01));
    textField2.setFormatterFactory(new AbstractFormatterFactory() {

      @Override
      public AbstractFormatter getFormatter(JFormattedTextField tf) {
        NumberFormat format = DecimalFormat.getInstance();
        format.setMinimumFractionDigits(2);
        format.setMaximumFractionDigits(2);
        format.setRoundingMode(RoundingMode.HALF_UP);
        InternationalFormatter formatter = new InternationalFormatter(format);
        formatter.setAllowsInvalid(false);
        formatter.setMinimum(0.0);
        formatter.setMaximum(1000.00);
        return formatter;
      }
    });
    textField2.getDocument().addDocumentListener(new DocumentListener() {

      @Override
      public void changedUpdate(DocumentEvent documentEvent) {
        printIt(documentEvent);
      }

      @Override
      public void insertUpdate(DocumentEvent documentEvent) {
        printIt(documentEvent);
      }

      @Override
      public void removeUpdate(DocumentEvent documentEvent) {
        printIt(documentEvent);
      }

      private void printIt(DocumentEvent documentEvent) {
        DocumentEvent.EventType type = documentEvent.getType();
        double t1a1 = (((Number) textField2.getValue()).doubleValue());
        if (t1a1 > 100) {
              textField2.setFont(new Font(attributes));
              textField2.setForeground(Color.red);
        } else {
              textField2.setFont(new Font("Serif", Font.BOLD, 16));
              textField2.setForeground(Color.black);
        }
      }
    });
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(textField1, BorderLayout.NORTH);
    frame.add(textField2, BorderLayout.SOUTH);
    frame.setVisible(true);
    frame.pack();
  }
}