簡體   English   中英

如何禁用對textField的自動聚焦

[英]How to disable automatic focus on textField

當我創建一堆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);

對另一個文本字段重復該過程

EDIT2:實際代碼(我相信它的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);


}
}

我想將焦點設置為窗口或其他,以防止文本消失。

在構造函數中,可以使用requestFocusInWindow()方法。

這就是在這里為我工作的

創建JFrame之后,調用frame.requestFocusinWindow(); 這將確保您的文本字段不集中。 然后,當您專注於文本字段時,將觸發該事件。

正如評論中所討論的,我添加了一個單選按鈕來代替焦點:

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

說明

教程

如果要確保特定組件在第一次激活窗口時獲得焦點,則可以在實現組件之后但在顯示框架之前在組件上調用requestFocusInWindow方法。

這意味着btn.requestFocusInWindow()必須出現在pack()a.setVisible(true)之前。

您需要另一個組件來獲得焦點的原因是,當窗口被聚焦時,其內部的組件必須獲得焦點。

筆記:

  • 如果您想要更好的文本字段提示,請參閱@camickr的答案
  • 不要使用null布局。 選擇一個可以為您的GUI設計服務的設備(我之所以選擇FlowLayout只是因為它使用起來很快,盡管可能不是您所需要的)。
  • 添加所有組件之后,使用pack()代替設置框架的大小。
  • 不必為每個文本字段創建相同的焦點偵聽器,而只需將其創建為類並重用即可。 我展示了一種將組件傳遞給構造函數的方法,但是您可以擺脫它,而使用e.getComponent()來獲取文本字段實例。
tf.setForeground(Color.decode("0x8C8C8C")); // for nice comment inside the text field

也許您正在嘗試為該文本字段設置提示,當該文本字段獲得焦點時該提示會消失?

如果是這樣,請查看“ 文本字段提示 ”以獲取解決方案。

如果沒有,請發布適當的SSCCE,因為我仍然無法猜出您正在嘗試做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM