2014-10-27 58 views
0

我在Eclipse中使用WindowBuilder来帮助我的GUI设计。我想在用户输入一个带有整数的文本文件后弹出一个Jlist弹出窗口,或者如果他们输入的文件不存在,他们从JFileChooser中选择一个带有整数的文件。我现在遇到的问题是,当选择文件时,没有任何反应。当我输入一个存在的文件时,该程序似乎也无法识别,它只是默认为JFileChooser。任何关于我做错了什么和/或如何使Jlist出现在输入适当文件后?当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()); 
      } 
     }); 
    } 
} 

回答

2

Scanner#nextLine似乎总是在第一行,只要返回true因为有一些文字。

所以在该格式的文件...

1 2 3 4 5 6 

将有Scanner#nextLine回报true。相反,您应该首先检查hasNextInt,然后跳过以显示JFileChooser

避免使用null布局,像素完美的布局是现代UI设计中的幻想。影响组件的个体大小的因素太多,其中没有一个可以控制。 Swing旨在与布局管理人员一起工作,放弃这些将导致问题和问题无法结束,您将花费越来越多的时间来尝试纠正

+0

我按建议替换了'hasNextLine',但'JFileChooser'当我输入一个确实存在的文件时仍会弹出。 – ninjachris16 2014-10-27 21:27:30

+0

并只包含数字? – MadProgrammer 2014-10-27 22:53:07

+0

似乎对我来说工作得很好.. – MadProgrammer 2014-10-27 23:00:35

相关问题