java限制窗口/Jpanel的切换
我有java限制窗口/Jpanel的切换,java,swing,focuslistener,Java,Swing,Focuslistener,我有JFrame和3个JPanel(基本上有三个选项卡)。其中一个面板有一个文本框。文本框上有值限制。这意味着,用户只能在其中输入1-1000个数字。如果他输入的数字大于1000,则会抛出警告消息。 现在,我使用focuslistener在输入的数字失去焦点时立即保存它。但是,如果用户输入1200并单击另一个选项卡(面板),它会给我预期的警告消息,但也会转到另一个选项卡。我需要保持在同一个面板,如果有警告框。我不想失去当前面板的焦点 mMaxLabelLength = new JTextFiel
JFrame
和3个JPanel
(基本上有三个选项卡)。其中一个面板有一个文本框。文本框上有值限制。这意味着,用户只能在其中输入1-1000个数字。如果他输入的数字大于1000,则会抛出警告消息。
现在,我使用focuslistener在输入的数字失去焦点时立即保存它。但是,如果用户输入1200并单击另一个选项卡(面板),它会给我预期的警告消息,但也会转到另一个选项卡。我需要保持在同一个面板,如果有警告框。我不想失去当前面板的焦点
mMaxLabelLength = new JTextField();
mMaxLabelLength.addActionListener(this);
public void focusGained(FocusEvent fe)
{
// do NOTHING
}
@Override
public void focusLost(FocusEvent fe)
{
saveActions();
}
public void actionPerformed(ActionEvent e)
{
//Do something
}
private void saveActions()
{
// error message
JOptionPane.showMessageDialog(this,
"Please enter an integer value between 1 and 1000.",
"Invalid Entry", JOptionPane.INFORMATION_MESSAGE);
SwiftApplication APP = SwiftApplication.getInstance();
int nMaxLabel = APP.getMaxPieLabel();
mMaxLabelLength.setText(new Integer(nMaxLabel).toString());
mMaxLabelLength.requestFocus();
}
看起来你在找一个新的工作 允许通过焦点机制进行输入验证的抽象类。当试图从包含输入验证器的组件转移焦点时,焦点不会放弃,直到验证器满意为止 正如所描述的,它可以用来编写自己的验证器,这些验证器拒绝无效的输入,同时将焦点放在相关的
JComponent
上
因此,您只需要做两件事:
InputVerifier
,例如MyVerifier
,或者从现有的验证器中选择一个并创建它的实例。(下面是一个完整的可验证的小示例)JComponent
上注册验证器实例InputVerifier
调用JComponent
类的setInputVerifier
方法。例如,InputVerificationDemo
具有以下代码:
注意由于某种原因,我现在找不到该链接的来源,该链接似乎已断开
小型可验证完整示例(来自)
问题中的代码块没有提供太多细节,但据我所知,您需要使用
vetoablechangeelistener
来禁止焦点更改
以下是一个例子:
但是,我想得越多,也许使用
InputVerifier
就越合适。请参阅Java教程的第页中的“验证输入”。嗯,@isi更快:-)这种情况通常发生在我身上。如何将InputVerifier与addFocusListener一起使用。我尝试了“mMaxLabelLength.addFocusListener(this);mMaxLabelLength.setInputVerifier(new PassVerifier());”,但这没有帮助。两者的组合可能会产生一些冲突,请查看哪一个组合了两者。一个重要的添加是MyInputVerifier
子类中的shouldYieldFocus
方法。但是,这两个实例都使用焦点或验证方法。我猜安装侦听器的顺序可能也会有影响,但我对此不太确定。我知道这将允许我限制在同一面板中键入或选择某些内容,但我在JFrame中有多个面板作为选项卡。而且它不会阻止我选择另一个选项卡(即使值是错误的),看起来这个问题已经被称为bug和错误。此外,关于可移植性还有一个可能的解释。但是,我找不到一个真正的解决方案,但这里似乎是使用方法。考虑使用<代码> JSpinner <代码>。
private MyVerifier verifier = new MyVerifier();
...
amountField.setInputVerifier(verifier);
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
// This program demonstrates the use of the Swing InputVerifier class.
// It creates two text fields; the first of the text fields expects the
// string "pass" as input, and will allow focus to advance out of it
// only after that string is typed in by the user.
public class VerifierTest extends JFrame {
public VerifierTest() {
JTextField tf1 = new JTextField ("Type \"pass\" here");
getContentPane().add (tf1, BorderLayout.NORTH);
tf1.setInputVerifier(new PassVerifier());
JTextField tf2 = new JTextField ("TextField2");
getContentPane().add (tf2, BorderLayout.SOUTH);
WindowListener l = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
addWindowListener(l);
}
class PassVerifier extends InputVerifier {
public boolean verify(JComponent input) {
JTextField tf = (JTextField) input;
return "pass".equals(tf.getText());
}
}
public static void main(String[] args) {
Frame f = new VerifierTest();
f.pack();
f.setVisible(true);
}
}
import java.awt.Component;
import java.awt.KeyboardFocusManager;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
public class Main {
public static void main(String[] argv) {
KeyboardFocusManager.getCurrentKeyboardFocusManager().addVetoableChangeListener(
new FocusVetoableChangeListener());
}
}
class FocusVetoableChangeListener implements VetoableChangeListener {
public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
Component oldComp = (Component) evt.getOldValue();
Component newComp = (Component) evt.getNewValue();
if ("focusOwner".equals(evt.getPropertyName())) {
if (oldComp == null) {
System.out.println(newComp.getName());
} else {
System.out.println(oldComp.getName());
}
} else if ("focusedWindow".equals(evt.getPropertyName())) {
if (oldComp == null) {
System.out.println(newComp.getName());
} else {
System.out.println(oldComp.getName());
}
}
boolean vetoFocusChange = false;
if (vetoFocusChange) {
throw new PropertyVetoException("message", evt);
}
}
}