0

マウスのクリックで強調表示する JFormattedTextField を取得しようとしましたが、うまくいきませんでした。フィールドをタブで移動しながら正常に動作させることができましたが、クリックするとすべてを強調表示したいと思います。

テキストフィールドをクリックして約1.5〜2秒間保持した場合にのみ、マウスクリックで強調表示できます。理由がわかりません。

クラスの拡張を含むいくつかの修正を検索して試しました。

class HFTextField extends JFormattedTextField
{
    HFTextField(MaskFormatter formatter)
    {
        super(formatter);
    }

    @Override
    protected void processFocusEvent(FocusEvent e)
    {
        super.processFocusEvent(e);
        if (e.getID() == FocusEvent.FOCUS_GAINED)
        {
            this.selectAll();
        }
    }
}

また、SwingUtilities.invokelater を使用する (かなり冗長な!) FocusListener も定義しています。

public static FocusListener CreateHighlightTextFieldFocusListener(final JTextField text_field)
    {
        FocusListener fl =
                new FocusAdapter()
                {
                    public void focusGained(FocusEvent evt)
                    {
                        SwingUtilities.invokeLater(new Runnable()
                        {
                            @Override
                            public void run()
                            {
                                text_field.selectAll();
                            }
                        });
                    }
                };

        return fl;
    }

これは、書式設定されたテキスト フィールドを作成する関数です。

public static JTextField CreateFormattedTextField(int x, int y, int width, int height,
                            Method action_method, Method changed_method, Method remove_method,
                            Method update_method, String mask_formatter, String banned_chars)
    {
        MaskFormatter formatter = null;

        try {

            formatter = new MaskFormatter(mask_formatter);

        } catch (ParseException e) {
            assert(false);
        }

        if(banned_chars != null)
            formatter.setInvalidCharacters(banned_chars);

        JTextField text_field = new HFTextField(formatter);

        text_field.setBounds(x, y, width, height);

        if(action_method != null)
        {
            text_field.addActionListener(CreateTextFieldActionListener(action_method, text_field));
        }

        text_field.getDocument().addDocumentListener(
                CreateTextFieldDocumentListener(changed_method, remove_method,
                                                update_method, text_field));

        text_field.addFocusListener(CreateHighlightTextFieldFocusListener(text_field));

        return text_field;

どんな助けでも大歓迎です!

4

5 に答える 5

1

EDTに問題があるかもしれません。

JTextField にどのように使用するか、どのように値を追加したか

JTextField、JFormateddTextField、JComboBox、および AutoCompleted 関数http://www.java2s.com/Code/Java/Swing-JFC/AutocompleteTextField.htmで動作します

   private FocusListener focsListener = new FocusListener() {

    @Override
    public void focusGained(FocusEvent e) {
        dumpInfo(e);
    }

    @Override
    public void focusLost(FocusEvent e) {
        //dumpInfo(e);
    }

    private void dumpInfo(FocusEvent e) {
        //System.out.println("Source  : " + name(e.getComponent()));
        //System.out.println("Opposite : " + name(e.getOppositeComponent()));
        //System.out.println("Temporary: " + e.isTemporary());
        Component c = e.getComponent();
        if (c instanceof JFormattedTextField) {
            ((JFormattedTextField) c).requestFocus();
            ((JFormattedTextField) c).setText(((JFormattedTextField) c).getText());
            ((JFormattedTextField) c).selectAll();
        } else if (c instanceof JTextField) {
            ((JTextField) c).requestFocus();
            ((JTextField) c).setText(((JTextField) c).getText());
            ((JTextField) c).selectAll();
        }
    }

    private String name(Component c) {
        return (c == null) ? null : c.getName();
    }
};
于 2011-04-29T07:24:02.543 に答える
1

簡単な答えは言いたくないのですが、MouseListener インターフェイス (または MouseAdapter クラス) を使ってみましたか?

次のようなことを試しましたか:

fieldName.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            JTextComponent text = (JTextComponent) e.getSource();
            text.selectAll();
        }      
    });

また、これを非同期で行うことはお勧めしません。

于 2011-04-28T17:35:18.773 に答える
1

マウス クリックに特化した動作が必要な場合は、MouseAdapter を JTextFiled に追加し、mouseClicked イベント ハンドラで背景を明示的に変更します。

于 2011-04-28T17:36:33.340 に答える
1

基本的に、このコードを使用できます (各フォーマッタと入力マスクについてはわかりません) が、Number、Date、および String については、この JFormattedTextField が AutoCompleted を実装していないことを確認して、次を使用できます。

    myTextField.addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent e) {
            myTextField.requestFocus();
            myTextField.setText(myTextField.getText());
            myTextField.selectAll();
        }

        @Override
        public void focusLost(FocusEvent e) {
        }
    });

それをInvokeLateにパックできることを確認してください...

于 2011-04-28T19:00:50.223 に答える
1

次のコードを試してください

 yourTextField.addFocusListener(new java.awt.event.FocusAdapter() {
                public void focusGained(java.awt.event.FocusEvent evt) {
                    SwingUtilities.invokeLater( new Runnable() {
                                    @Override
                                    public void run() {
                                            yourTextField.selectAll();              
                                    }
                            });
                }
            });
于 2011-04-28T17:34:23.907 に答える