首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >键入特定值时更改背景色(jNumberField)

键入特定值时更改背景色(jNumberField)
EN

Stack Overflow用户
提问于 2021-01-26 08:44:48
回答 2查看 200关注 0票数 2

我试图根据输入的数字更改数字字段的背景颜色。就像在数字字段中键入一个字母时,它会变成红色一样。我希望当你在1以下和7以上输入数字时,它也会改变红色。我知道你可以用一个按钮来做这件事,但我希望你在输入时改变它。

这是我的密码:

代码语言:javascript
运行
复制
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class applet03 extends JApplet {
  private JButton bHoeveelheid = new JButton();
  private JNumberField nfAantal = new JNumberField();  
  private JTextArea taLijst = new JTextArea("");
    private JScrollPane taLijstScrollPane = new JScrollPane(taLijst);
 public void init() {
    Container cp = getContentPane();
    cp.setLayout(null);
    cp.setBounds(0, 0, 442, 478);
    bHoeveelheid.setBounds(224, 56, 59, 33);
    bHoeveelheid.setMargin(new Insets(2, 2, 2, 2));
    bHoeveelheid.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        bHoeveelheid_ActionPerformed(evt);
      }
    });
    cp.add(bHoeveelheid);
    nfAantal.setBounds(304, 56, 99, 36);
    nfAantal.setText("Vul getal in");
    nfAantal.setHorizontalAlignment(SwingConstants.CENTER);
    nfAantal.addFocusListener(new FocusAdapter() { 
      public void focusGained(FocusEvent evt) { 
        nfAantal_FocusGained(evt);
      }
    });
    nfAantal.addKeyListener(new KeyAdapter() { 
      public void keyPressed(KeyEvent evt) { 
        nfAantal_KeyPressed(evt);
      }
    });
    cp.add(nfAantal);
    taLijstScrollPane.setBounds(224, 136, 168, 180);
    cp.add(taLijstScrollPane);
  }
  public void bHoeveelheid_ActionPerformed(ActionEvent evt) {    
    if (nfAantal.getInt() < 1 || nfAantal.getInt() > 7) {
      nfAantal.setBackground(Color.RED);
    } else {
      //some other code (not impotant for now)
      }
  }  
  public void nfAantal_FocusGained(FocusEvent evt) {    
    if (nfAantal.getText().equals("Vul getal in")) {
      nfAantal.clear();
    }
  }  
  public void nfAantal_KeyPressed(KeyEvent evt) {
    if (nfAantal.getInt() < 1 || nfAantal.getInt() > 7) {
      nfAantal.setBackground(Color.RED);
    } else {
      //some other code (not impotant for now)
      }
  }  
}

按钮部件工作,但KeyEvent不工作。当我运行这个程序时,我会发现这些错误:

代码语言:javascript
运行
复制
Exception in thread "AWT-EventQueue-1" java.lang.NumberFormatException: empty String

但当我这么做的时候,它还挺管用的。我仍然会犯同样的错误,但它是有效的。(顺便说一句,这并不是最优的,因为它只在文本字段中添加一个键按下。):

代码语言:javascript
运行
复制
  public void nfAantal_KeyPressed(KeyEvent evt) {
    if (nfAantal.getInt() < 1 || nfAantal.getInt() > 7) {
      taLijst.append(nfAantal.getText());
    } else {
      //some other code (not impotant for now)
      }
  }  

因此,如果有人知道为什么这不起作用,或者知道更好的方法来完成这一任务。那将是非常感谢!

(顺便说一下,我使用了Java1.8)

编辑:

我现在在if语句中有了(nfAantal.getText().length() > 0) && (nfAantal.getInt() < 1 || nfAantal.getInt() > 7),这消除了错误。(感谢@Joe)

但这仍然不能解决我的问题,如何在某些价值观上使背景变红。

关于JNumberField**:**的相关信息

我认为此链接有组成JNumberField的代码,此链接包含下载到.jar文件中的JNumberField文件。

另一个编辑:

我想我自己找出了为什么它不能与JNumberfield一起工作;在代码中,如果它的值是数字的,它会将背景更改为白色,所以只有在有办法绕过代码的这一部分或更改它(我不知道该如何做)时,我的问题才能在JNumberField上得到回答,如果不是这样,那么我将使用JFormattedTextField代替。

这是需要修改或规避的代码:

代码语言:javascript
运行
复制
  protected void processKeyEvent(KeyEvent e) {
    super.processKeyEvent(e);
    if (isNumeric() || getText().equals("-") ||
        getText().equals("") || getText().equals("."))
      setBackground(Color.white);
    else
      setBackground(Color.red);
  }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-26 17:39:45

我不知道JNumberField是什么。它不是JDK的一部分,当我使用Google搜索时,它发现了几个不同的。

我也不明白你为什么要写小程序。

因此,下面的代码可能不合适,因为它是使用JFormattedTextFieldDocumentListener的独立Swing应用程序。

代码之后的解释。

代码语言:javascript
运行
复制
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.text.NumberFormat;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.NumberFormatter;

public class RedNumbr implements DocumentListener, Runnable {
    private JFormattedTextField  aantal;
    private JFrame  frame;

    @Override
    public void insertUpdate(DocumentEvent event) {
        handleDocumentEvent(event);
    }

    @Override
    public void removeUpdate(DocumentEvent event) {
        handleDocumentEvent(event);
    }

    @Override
    public void changedUpdate(DocumentEvent event) {
        // Never called for 'JFormattedTextField'
    }

    @Override
    public void run() {
        showGui();
    }

    private JPanel createNumberPanel() {
        JPanel numberPanel = new JPanel();
        NumberFormat format = NumberFormat.getIntegerInstance();
        NumberFormatter formatter = new NumberFormatter(format);
        aantal = new JFormattedTextField(formatter);
        aantal.setColumns(10);
        Document doc = aantal.getDocument();
        doc.addDocumentListener(this);
        numberPanel.add(aantal);
        return numberPanel;
    }

    private void handleDocumentEvent(DocumentEvent event) {
        Document doc = event.getDocument();
        int len = doc.getLength();
        if (len > 0) {
            try {
                String text = doc.getText(0, len);
                int number = Integer.parseInt(text);
                Color fg;
                if (number < 1  ||  number > 7) {
                    fg = Color.red;
                }
                else {
                    fg = UIManager.getColor("TextField.foreground");
                }
                aantal.setForeground(fg);
            }
            catch (BadLocationException | NumberFormatException x) {
                // Ignore.
            }
        }
    }

    private void showGui() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(createNumberPanel(), BorderLayout.CENTER);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new RedNumbr());
    }
}

每当更改JFormattedTextField的内容时,都会调用相关的DocumentListener方法。在这些方法中,我检查JFormattedTextField是否包含一个数字,如果包含,则根据您的条件更改JFormattedTextField的前景色,即如果数字小于1 (1)或大于7(7)。

请注意,NumberFormatter并不阻止输入非数字,因为JFormattedTextField会在失去焦点时处理该问题。尽管如此,它仍然处理输入正数和负数,这为您节省了一些工作。我的答案的重点是演示如何根据输入的文本改变前景颜色,我相信这将回答您的问题。

编辑

为了改变JFormattedTextField的背景,而不是前台,您只需要更改我的代码中的两行,上面的代码就可以了。

替换

代码语言:javascript
运行
复制
fg = UIManager.getColor("TextField.foreground");

使用

代码语言:javascript
运行
复制
fg = UIManager.getColor("TextField.background");

也取代了

代码语言:javascript
运行
复制
aantal.setForeground(fg);

使用

代码语言:javascript
运行
复制
aantal.setBackground(fg);
票数 2
EN

Stack Overflow用户

发布于 2021-01-27 15:44:14

我假设JNumberField是JTextField的扩展,如果是这样的话,它可能是由KeyEvent操作触发的主线程和线程之间的同步问题。要确保事件线程将被执行,请使用invokeLater对其进行编码。

代码语言:javascript
运行
复制
  public void nfAantal_KeyPressed(KeyEvent evt) {
    if (nfAantal.getText().length() > 0) && (nfAantal.getInt() < 1 || nfAantal.getInt() > 7) {
          SwingUtilities.invokeLater(new Runnable() 
          {
             public void run()
             {
                nfAantal.setBackground(Color.RED);
             }
           });
    } else {
      //some other code (not impotant for now)
      }
  }  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65898216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档