当我的应用程序加载时,它是使用netbean制作的,第一个JTextField会自动聚焦,在这个JTextField中,我写了“输入您的用户名”,当用户点击这个字段时它会消失,但是当应用程序加载时,这个字段是聚焦的,意味着我看不到“输入您的用户名”,如何在启动时取消聚焦?
使用requestFocusInWindow()
将焦点设置在其他组件上,而不是首先设置JTextfield
。
但是我建议不要改变本机的焦点系统,而是在构造函数中调用
initComponents()
之后在JTextField上调用
setText(String s)
(假定在netbeans中)。
更多可选阅读:如何使用焦点子系统
textField.setFocusable(false);
textField.setFocusable(true);
当且仅当文本字段具有焦点时,TAB顺序中的下一个组件将自动获得焦点。效果与TAB印刷机相同。
(未在只有一个可聚焦组件的GUI中测试:))
登录最好是在模态对话框中完成,但这会带来问题,因为在组件可见后必须调用方法请求焦点窗口()
,但这被对话框是模态的事实所阻止!
本例使用Rob Camick的RequestFocusListener
(如Dialog Focus中所示)在对话框可见后管理焦点。
注意:在用户做任何事情之前,它就是这样出现的。默认情况下,密码字段是聚焦的。
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
public class LoginRequired {
LoginRequired() {
JFrame f = new JFrame("Login Required");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setResizable(false);
f.setSize(400, 300); // not recommended, but used here for convenience
f.setLocationByPlatform(true);
f.setVisible(true);
showLogin(f);
}
private void showLogin(JFrame frame) {
JPanel p = new JPanel(new BorderLayout(5,5));
JPanel labels = new JPanel(new GridLayout(0,1,2,2));
labels.add(new JLabel("User Name", SwingConstants.TRAILING));
labels.add(new JLabel("Password", SwingConstants.TRAILING));
p.add(labels, BorderLayout.LINE_START);
JPanel controls = new JPanel(new GridLayout(0,1,2,2));
JTextField username = new JTextField("Joe Blogs");
controls.add(username);
JPasswordField password = new JPasswordField();
password.addAncestorListener(new RequestFocusListener(false));
controls.add(password);
p.add(controls, BorderLayout.CENTER);
JOptionPane.showMessageDialog(
frame, p, "Log In", JOptionPane.QUESTION_MESSAGE);
System.out.println("User Name: " + username.getText());
System.out.println("Password: " + new String(password.getPassword()));
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new LoginRequired();
});
}
}
/**
* Convenience class to request focus on a component.
*
* When the component is added to a realized Window then component will
* request focus immediately, since the ancestorAdded event is fired
* immediately.
*
* When the component is added to a non realized Window, then the focus
* request will be made once the window is realized, since the
* ancestorAdded event will not be fired until then.
*
* Using the default constructor will cause the listener to be removed
* from the component once the AncestorEvent is generated. A second constructor
* allows you to specify a boolean value of false to prevent the
* AncestorListener from being removed when the event is generated. This will
* allow you to reuse the listener each time the event is generated.
*/
class RequestFocusListener implements AncestorListener
{
private boolean removeListener;
/*
* Convenience constructor. The listener is only used once and then it is
* removed from the component.
*/
public RequestFocusListener()
{
this(true);
}
/*
* Constructor that controls whether this listen can be used once or
* multiple times.
*
* @param removeListener when true this listener is only invoked once
* otherwise it can be invoked multiple times.
*/
public RequestFocusListener(boolean removeListener)
{
this.removeListener = removeListener;
}
@Override
public void ancestorAdded(AncestorEvent e)
{
JComponent component = e.getComponent();
component.requestFocusInWindow();
if (removeListener)
component.removeAncestorListener( this );
}
@Override
public void ancestorMoved(AncestorEvent e) {}
@Override
public void ancestorRemoved(AncestorEvent e) {}
}
问题内容: 我让我的游戏在没有鼠标的情况下运行,因此不能使用指针。当玩家输球时将显示高分菜单。 这是我的代码 我努力了 但仍然没有专注于我的。 如何聚焦呢? 问题答案: 如果希望在GUI显示时集中精力,可以使用以下方法: 哪里会是你和你的。
在我的Java Swing应用程序中,我有多个用于日期的JTextField,单击时会有一个JButton,它会打开日历来选择日期,并且日期字符串应该插入其中一个JTextField,所以我想设计程序,让用户先点击一个日期JTextField,他想输入一个日期[关注该字段并记住它],程序将JTextField保存为目标组件,然后将该组件传递给calendar对象以输入拾取的日期。到目前为止,我可以
问题内容: 我有以下代码将ActionListener添加到JTextField中: 现在,由于该函数需要一个参数,如何使用删除此MouseListener ? 问题答案: 您可以考虑3种方法: 1)在添加引用之前,请先保存对监听器的引用,以便以后删除它: 2)您可以使用相应的方法获取所有某些事件侦听器,例如: 要么 这是第一种和第二种方法的javadocs 。如果您可以在所有侦听器中确定要删除的
问题内容: 当鼠标单击该文本字段时,我需要使该程序清除文本字段中的文本。我已经尝试了一些方法,但是还没有一个对我有用。 这是完整的代码: 问题答案: TL; DR 无论如何,注册和替代对我有用, 我希望这个例子能使您正确地开始!
问题内容: 我有 JTextField 显示文件名。如果文件无效,我想 删除 文本。怎么办呢?我尝试了html,但没有运气。 问题答案: 我敢肯定,除了设置字体外,您无法在中设置文本的样式。我认为您要么必须创建自己的支持样式的子类,要么创建一个并将其设置为类似的行为。 这里有一些很好的文档:http : //download.oracle.com/javase/tutorial/uiswing/c
问题内容: 我想将焦点放在作为对象消息传递给JOptionPane的特定JTextField上。这是我的代码(我希望焦点在txt2上,但焦点始终在txt1上): 问题答案: 一旦覆盖,您可以让组件请求焦点。像这样: 这是程序的完整功能/经过测试的版本: