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);
        }
      }
    }