我试图根据输入的数字更改数字字段的背景颜色。就像在数字字段中键入一个字母时,它会变成红色一样。我希望当你在1以下和7以上输入数字时,它也会改变红色。我知道你可以用一个按钮来做这件事,但我希望你在输入时改变它。
这是我的密码:
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不工作。当我运行这个程序时,我会发现这些错误:
Exception in thread "AWT-EventQueue-1" java.lang.NumberFormatException: empty String
但当我这么做的时候,它还挺管用的。我仍然会犯同样的错误,但它是有效的。(顺便说一句,这并不是最优的,因为它只在文本字段中添加一个键按下。):
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
代替。
这是需要修改或规避的代码:
protected void processKeyEvent(KeyEvent e) {
super.processKeyEvent(e);
if (isNumeric() || getText().equals("-") ||
getText().equals("") || getText().equals("."))
setBackground(Color.white);
else
setBackground(Color.red);
}
发布于 2021-01-26 17:39:45
我不知道JNumberField
是什么。它不是JDK的一部分,当我使用Google搜索时,它发现了几个不同的。
我也不明白你为什么要写小程序。
因此,下面的代码可能不合适,因为它是使用JFormattedTextField和DocumentListener的独立Swing应用程序。
代码之后的解释。
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
的背景,而不是前台,您只需要更改我的代码中的两行,上面的代码就可以了。
替换
fg = UIManager.getColor("TextField.foreground");
使用
fg = UIManager.getColor("TextField.background");
也取代了
aantal.setForeground(fg);
使用
aantal.setBackground(fg);
发布于 2021-01-27 15:44:14
我假设JNumberField是JTextField的扩展,如果是这样的话,它可能是由KeyEvent操作触发的主线程和线程之间的同步问题。要确保事件线程将被执行,请使用invokeLater对其进行编码。
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)
}
}
https://stackoverflow.com/questions/65898216
复制相似问题