【问题标题】:How to disable automatic focus on textField如何禁用对文本字段的自动对焦
【发布时间】:2015-07-30 07:26:25
【问题描述】:

当我创建一堆JTextFields 时,我看到第一个被选中。我想取消选择它,因为我有焦点侦听器并且它会自动运行。
有什么线索吗?

SSCCE:

JTextField tf = new JTextField("hello");
tf.setForeground(Color.decode("0x8C8C8C")); // for nice comment inside the text field
textFieldKwotaWplacona.addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent e) 
        {

            if(tf.getForeground() != Color.BLACK)
            {
            tf.setText("");
            tf.setForeground(Color.BLACK);
            }
        }   @Override
        public void focusLost(FocusEvent arg0) {}});
//for deleting "nice comment" after click

tf.setBounds(//some bounds);
add(tf);

对另一个文本字段重复该过程

编辑2: 实际代码(我相信它的 sscce :P)

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JRadioButton;
import javax.swing.JTextField;


public class Main extends JFrame implements ActionListener
{
JTextField textFieldKwotaWplacona, textFieldOprocentowanie, textFieldDlugoscLokaty, textFieldKwotaOtrzymana;

Main()
{   setSize(500,300);
    setLayout(null);
    setTitle("Program do liczenia procentu składanego");
setDefaultCloseOperation(EXIT_ON_CLOSE);


    textFieldKwotaWplacona = new JTextField("Ilość pieniędzy wpłaconych");
    textFieldKwotaWplacona.setForeground(Color.decode("0x8C8C8C"));
    textFieldKwotaWplacona.addActionListener(this);
    textFieldKwotaWplacona.addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent e) 
        {

            if(textFieldKwotaWplacona.getForeground() != Color.BLACK)
            {
            textFieldKwotaWplacona.setText("");
            textFieldKwotaWplacona.setForeground(Color.BLACK);
            }
        }   @Override
        public void focusLost(FocusEvent arg0) {}});

    textFieldKwotaWplacona.setBounds(10, 10, 100, 20);
    add(textFieldKwotaWplacona);

    textFieldOprocentowanie = new JTextField("Oprocentowanie");
    textFieldOprocentowanie.setForeground(Color.decode("0x8C8C8C"));
    textFieldOprocentowanie.addActionListener(this);


    textFieldOprocentowanie.addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent e) 
        {

            if(textFieldOprocentowanie.getForeground() != Color.BLACK)
            {
            textFieldOprocentowanie.setText("");
            textFieldOprocentowanie.setForeground(Color.BLACK);
            }
        }

        @Override
        public void focusLost(FocusEvent arg0) {}});
    textFieldOprocentowanie.setBounds(10, 40, 100, 20);
    add(textFieldOprocentowanie);



}




@Override
public void actionPerformed(ActionEvent arg0) 
{
    // TODO Auto-generated method stub
}

    public static void main(String[] args) 
{
    Main a=new Main();
    a.setVisible(true);


}
}

我想将焦点设置到窗口或其他地方,以防止文本消失。

【问题讨论】:

  • want to deselect it, because I have focus listener and it's running automatically. - 我不知道那是什么意思。发布您的SSCCE 来证明问题。
  • 某些东西必须具有焦点,只需将其分配给其他组件即可。由于您没有发布 SSCCE 或 MCVE,因此我无法为您提供更多“线索”。
  • 那不是 SSCCE。我们如何编译和执行那段代码???
  • 不,抱歉,我将粘贴我的实际代码
  • 这是一个 MCVE / SSCCE(尽管 ActionListener 部分不是必需的,并且您有一些未使用的字段),很好。我假设您将有一个按钮或其他一些组件,除了文本字段之外,它们可以成为焦点。对吗?

标签: java focus jtextfield


【解决方案1】:

在您的构造函数中,您可以使用方法requestFocusInWindow()

这就是我在这里工作的原因-

创建 JFrame 后,调用frame.requestFocusinWindow();。这将确保您的文本字段没有聚焦。 然后,当您关注文本字段时,将触发该事件。

【讨论】:

  • @Jump3r,请提及“没有用”。结果如何?
  • @Pranav 文本字段中仍然没有文本,焦点没有到达窗口,或者到达它但我没有观察到
  • 将此行放在您的 main 方法的末尾-a.requestFocusInWindow() 应该可以工作。 :)
  • 文本字段上没有显示光标,但仍然没有显示文本
  • 使用提供的确切代码,似乎在这里工作。
【解决方案2】:
tf.setForeground(Color.decode("0x8C8C8C")); // for nice comment inside the text field

也许您正在尝试为文本字段设置一个提示,当文本字段获得焦点时该提示消失?

如果是这样,请查看Text Field Prompt 以获得解决方案。

如果没有,请发布正确的 SSCCE,因为我仍然无法猜测您要做什么。

【讨论】:

    【解决方案3】:

    正如 cmets 中所讨论的,我添加了一个单选按钮来代替焦点:

    public class Main extends JFrame {
    
        JTextField textFieldKwotaWplacona, textFieldOprocentowanie;
    
        Main() {
    
            setTitle("Program do liczenia procentu składanego");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setLayout(new FlowLayout());
    
            textFieldKwotaWplacona = new JTextField("Ilość pieniędzy wpłaconych");
            textFieldKwotaWplacona.setForeground(Color.decode("0x8C8C8C"));
            textFieldKwotaWplacona.addFocusListener(new FieldFocusListener(textFieldKwotaWplacona));
            add(textFieldKwotaWplacona);
    
            textFieldOprocentowanie = new JTextField("Oprocentowanie");
            textFieldOprocentowanie.setForeground(Color.decode("0x8C8C8C"));
            textFieldOprocentowanie.addFocusListener(new FieldFocusListener(textFieldOprocentowanie));
            add(textFieldOprocentowanie);
    
            JRadioButton btn = new JRadioButton("text");
            add(btn);
    
            pack();
            btn.requestFocusInWindow();
        }
    
        private class FieldFocusListener extends FocusAdapter {
    
            private JTextField field;
    
            FieldFocusListener(JTextField field) {
    
                this.field = field;
            }
    
            @Override
            public void focusGained(FocusEvent e) {
    
                if (field.getForeground() != Color.BLACK) {
                    field.setText("");
                    field.setForeground(Color.BLACK);
                }
            }
        }
    
        public static void main(String[] args) {
    
            Main a = new Main();
            a.setVisible(true);
        }
    }
    

    说明

    来自tutorial

    如果您想确保特定组件在第一次激活窗口时获得焦点,您可以在组件实现之后但在框架显示之前调用该组件的requestFocusInWindow方法。

    这意味着btn.requestFocusInWindow() 必须出现在pack() 之后和a.setVisible(true) 之前。

    你需要另一个组件来获得焦点的原因是当一个窗口获得焦点时,它里面的一个组件必须获得焦点。

    注意事项:

    • 如果您想要更好的文本字段提示,请参阅@camickr's answer
    • 不要使用null 布局。选择一个适合您的 GUI 设计(我选择 FlowLayout 只是因为它使用起来很快,但可能不是您需要的)。
    • 在添加所有组件后,pack() 不是设置框架的大小。
    • 不要为每个文本字段创建相同的焦点侦听器,只需将其创建为一个类并重用它。我展示了一种将组件传递给构造函数的方法,但您可以摆脱它并使用e.getComponent() 来获取文本字段实例。

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 2011-09-11
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2016-01-03
      • 2019-02-12
      • 1970-01-01
      • 2012-10-25
      相关资源
      最近更新 更多