Как поместить курсор мыши на кнопку OPEN в JFileChooser?

Я пытаюсь навести курсор мыши на кнопку утверждения по умолчанию в JFileChooser, но нигде не могу найти примеров, где это было сделано раньше. Я пытался использовать жестко закодированные позиции x, y, но это бесполезно, когда я запускаю свое приложение на другом компьютере. Буду признателен за любую помощь, мой код выглядит следующим образом:

FileOpenDialog fileChooser = new FileOpenDialog(index);
fileChooser.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
    }
});

// Need to snap mouse cursor to OPEN button here somehow or within overidden
// method of showOpenDialog???

int returnVal = fileChooser.showOpenDialog(mainFrame);
System.out.println("Return Value is " + returnVal);

if (returnVal == FileOpenDialog.APPROVE_OPTION) {
    setFileIndex(index);
    setInputFile(fileChooser.getSelectedFile());
}

class FileOpenDialog extends JFileChooser {

    public String fileName;
    public String dialogTitle;

    public FileOpenDialog(int index) {
        initComponent(index);
    }

    private void initComponent(int index) {
        setBackground(Color.lightGray);
        setAcceptAllFileFilterUsed(false);

        CustomFileFilter myFilter = new CustomFileFilter();
        setFileFilter(myFilter);

        switch (index) {
        case 0:
            setFileName("\\MelbCupHorses.txt");
            setDialogTitle("Please Choose Horses File");
            break;
        case 1:
            setFileName("\\MelbCupEntrants.txt");
            setDialogTitle("Please Choose Employees File");
            break;
        }

        System.out.println(getCurrentDirectory().toString() + fileName);

        File file = new File(getCurrentDirectory().toString() + fileName);
        setSelectedFile(file);
    }


    /**
     * @return the dialogTitle
    */
    @Override
    public String getDialogTitle() {
        return dialogTitle;
    }

    /**
     * @param dialogTitle the dialogTitle to set
    */
    @Override
    public void setDialogTitle(String dialogTitle) {
        this.dialogTitle = dialogTitle;
    }
}

Благодарю вас.


person nufanme    schedule 10.06.2014    source источник
comment
Я пытаюсь навести курсор мыши на кнопку подтверждения по умолчанию в JFileChooser Зачем это делать, а не просто убедиться, что у него есть фокус? И как именно пользователь может использовать JFileChooser таким образом, чтобы никогда не нужно было нажимать ни одну кнопку, кроме одной? В этом случае File всегда должен быть одним и тем же файлом, а средство выбора кажется излишним.   -  person Andrew Thompson    schedule 10.06.2014
comment
Я согласен с @AndrewThompson и добавляю, что кнопка утверждения по умолчанию - это не только кнопка по умолчанию JRootPane, но обычно также имеет связанную с ней мнемонику клавиатуры, позволяющую пользователю двумя действиями с клавиатурой вызывать кнопку одобрения по умолчанию   -  person MadProgrammer    schedule 10.06.2014
comment
Я подумал, что было бы лучше предложить пользователю имя файла по умолчанию, местоположение и параметр кнопки мыши, потому что это приложение, управляемое мышью. Я понимаю, о чем вы говорите, спасибо за ваше понимание   -  person nufanme    schedule 11.06.2014
comment
@nufanme Вы будете удивлены, узнав, сколько пользователей используют клавиатуру вместо мыши даже в графическом интерфейсе. Для пользователей, использующих систему, это на самом деле быстрее. Я больше не нажимаю на значок проводника, я использую [Окно]+[E], так как это быстрее и проще, например ;)   -  person MadProgrammer    schedule 11.06.2014


Ответы (1)


Из-за модального состояния диалога это может быть немного сложно, но с использованием WindowListener и java.awt.Robot, это может быть достигнуто

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.HeadlessException;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class FileChooserExample {

    public static void main(String[] args) {
        new FileChooserExample();
    }

    public FileChooserExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                FileOpenDialog dialog = new FileOpenDialog(0);
                dialog.showOpenDialog(null);

            }
        });
    }

    class FileOpenDialog extends JFileChooser {

        public String fileName;
        public String dialogTitle;

        public FileOpenDialog(int index) {
            initComponent(index);
        }

        @Override
        protected JDialog createDialog(Component parent) throws HeadlessException {
            JDialog dialog = super.createDialog(parent);
            dialog.addWindowListener(new WindowAdapter() {

                @Override
                public void windowOpened(WindowEvent e) {
                    JDialog dialog = (JDialog) e.getWindow();
                    JButton button = dialog.getRootPane().getDefaultButton();
                    Point pos = button.getLocationOnScreen();
                    Dimension size = button.getSize();
                    pos.x += (size.width / 2);
                    pos.y += (size.height / 2);

                    try {
                        Robot bot = new Robot();
                        bot.mouseMove(pos.x, pos.y);
                    } catch (AWTException ex) {
                        ex.printStackTrace();
                    }
                }

            });
            return dialog;
        }

        private void initComponent(int index) {
            setBackground(Color.lightGray);
            setAcceptAllFileFilterUsed(false);

            System.out.println(getCurrentDirectory().toString() + fileName);

            File file = new File(getCurrentDirectory().toString() + fileName);
            setSelectedFile(file);
        }

        /**
         * @return the dialogTitle
         */
        @Override
        public String getDialogTitle() {
            return dialogTitle;
        }

        /**
         * @param dialogTitle the dialogTitle to set
         */
        @Override
        public void setDialogTitle(String dialogTitle) {
            this.dialogTitle = dialogTitle;
        }
    }
}

Следующий вопрос: почему ты возишься с моей мышкой?

person MadProgrammer    schedule 10.06.2014
comment
Это именно то, что я искал @MadProgrammer, но мне просто не хватило опыта, чтобы углубиться в JFileChooer. Потрясающий ответ, за который я бы проголосовал, если бы мог :) И чья это мышь на самом деле??? - person nufanme; 11.06.2014
comment
Это пользователи, произвольно перемещающиеся, мягко говоря, сбивают с толку. Раньше я пробовал программное обеспечение, которое автоматически перемещает мышь на кнопку диалога по умолчанию ... это длилось около 10 минут, прежде чем стало разочаровывать ... просто говорю ... не связывайтесь с ожиданиями пользователя;) - person MadProgrammer; 11.06.2014
comment
хорошо, да, я понимаю, как это может раздражать. Я полагаю, я просто привык, что этот параметр установлен по умолчанию в Windows, поэтому я, вероятно, предвзят. Еще раз спасибо за ваши молниеносные ответы и опыт. Любые жалобы пользователей, и я позволю вам сказать, что я сказал вам так LOL! - person nufanme; 11.06.2014
comment
Все пользователи разные ;) - person MadProgrammer; 11.06.2014