gpt4 book ai didi

java限制窗口/Jpanel的切换

转载 作者:行者123 更新时间:2023-11-30 03:06:11 26 4
gpt4 key购买 nike

我有 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();
}

最佳答案

问题中的代码块没有提供太多细节,但据我了解,您需要使用 VetoableChangeListener 来禁止焦点更改。

这里是来自 Java2s 的示例:

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

但是,我想得越多,也许使用 InputVerifierpublic boolean shouldYieldFocus(JComponent input)更合适。请参阅 "How to Use the Focus Subsystem" 中的“验证输入” Java 教程。

关于java限制窗口/Jpanel的切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34726674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com