Мне нужно всплывающее окно Jlist, когда файл с целыми числами либо вводится, либо выбирается из JFileChooser

Я использую WindowBuilder в Eclipse, чтобы помочь в разработке моего графического интерфейса. Я пытаюсь создать всплывающее окно Jlist после того, как пользователь либо вводит текстовый файл с целыми числами, либо, если они вводят файл, который не существует, они выбирают файл с целыми числами в нем из JFileChooser. Моя проблема, с которой я сталкиваюсь сейчас, заключается в том, что при выборе файла ничего не происходит. Программа также, похоже, не распознает, когда я вхожу в существующий файл, она просто по умолчанию использует JFileChooser. Любые идеи относительно того, что я делаю неправильно и/или как заставить Jlist появляться после ввода соответствующего файла?

Вот код:

    import java.awt.EventQueue;

    import javax.swing.JFrame;
    import javax.swing.JTextPane;

    import java.awt.BorderLayout;

    import javax.swing.JList;
    import javax.swing.JScrollPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.ListSelectionModel;

    import java.awt.Font;

    import javax.swing.JButton;

    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.io.*;
    import java.util.Scanner;

    import javax.swing.JFileChooser;
    import javax.swing.plaf.FileChooserUI;
    import javax.swing.JPopupMenu;

    import java.awt.Component;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;

    public class GUI {

    private JFrame frame;
    private JTextField txtEnterFileName;
    private JTextField textField;
    private JFileChooser fileChooser;
    private JList list;
    private JList list_1;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    GUI window = new GUI();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public GUI() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        txtEnterFileName = new JTextField();
        txtEnterFileName.setFont(new Font("Tahoma", Font.PLAIN, 15));
        txtEnterFileName.setEditable(false);
        txtEnterFileName.setText("Enter File Name Below and Press Button");
        txtEnterFileName.setBounds(72, 11, 304, 41);
        frame.getContentPane().add(txtEnterFileName);
        txtEnterFileName.setColumns(10);

        textField = new JTextField();
        textField.setBounds(113, 63, 221, 25);
        frame.getContentPane().add(textField);
        textField.setColumns(10);

        JButton btnNewButton = new JButton("Button");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                int number;
                boolean endOfFile = false;
                File userF;

                userF = new File(textField.getText());

                if(!userF.exists()){
                    fileChooser = new JFileChooser();
                    fileChooser.setBounds(107, 153, 200, 50);
                    frame.getContentPane().add(fileChooser);
                    fileChooser.setCurrentDirectory(new File(System.getProperty("user.home") + "/desktop"));
                    int result = fileChooser.showOpenDialog(frame);
                    if (result == JFileChooser.APPROVE_OPTION) {
                        userF = fileChooser.getSelectedFile();
                    }
                }
                else if(userF.exists()){
                    try {

                        Scanner inFile = new Scanner(userF);
                        if(inFile.hasNextLine()){
                            inFile.close();
                            fileChooser = new JFileChooser();
                            fileChooser.setBounds(107, 153, 200, 50);
                            frame.getContentPane().add(fileChooser);
                            fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
                            int result = fileChooser.showOpenDialog(frame);
                            if (result == JFileChooser.APPROVE_OPTION) {
                                userF = fileChooser.getSelectedFile();
                            }
                        }
                        else if(inFile.hasNextInt()){
                            String label[] = {"Smallest Number", "Largest Number", "Count", "Average", "Median", "Quit"};
                            list = new JList(label);
                            list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
                            list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
                            list.setVisibleRowCount(-1);
                        }
                    } catch (FileNotFoundException e) {

                        e.printStackTrace();
                    }

                }

            }
        });
        btnNewButton.setBounds(174, 99, 89, 23);
        frame.getContentPane().add(btnNewButton);


    }
    private static void addPopup(Component component, final JPopupMenu popup) {
        component.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                if (e.isPopupTrigger()) {
                    showMenu(e);
                }
            }
            public void mouseReleased(MouseEvent e) {
                if (e.isPopupTrigger()) {
                    showMenu(e);
                }
            }
            private void showMenu(MouseEvent e) {
                popup.show(e.getComponent(), e.getX(), e.getY());
            }
        });
    }
}

person ninjachris16    schedule 27.10.2014    source источник


Ответы (1)


Scanner#nextLine всегда возвращает true, если в первой строке есть какой-то текст.

Итак, файл в формате ...

1 2 3 4 5 6

Придется Scanner#nextLine вернуть true. Вместо этого вы должны сначала проверить hasNextInt, а затем перейти к отображению JFileChooser

Избегайте использования макетов null, макеты с точностью до пикселя — это иллюзия в современном дизайне пользовательского интерфейса. Существует слишком много факторов, влияющих на размер отдельных компонентов, и ни один из них вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в основе, отказ от них приведет к бесконечным проблемам и проблемам, которые вы будете тратить все больше и больше времени, пытаясь исправить

person MadProgrammer    schedule 27.10.2014
comment
Я заменил «hasNextLine», как было предложено, но «JFileChooser» по-прежнему появляется, когда я ввожу файл, который существует. - person ninjachris16; 28.10.2014
comment
И содержит только цифры? - person MadProgrammer; 28.10.2014