Java 使用带有JFileChooser的关键字扫描器

Java 使用带有JFileChooser的关键字扫描器,java,swing,java.util.scanner,Java,Swing,Java.util.scanner,我正试图用扫描仪来扫描一组单词,正如你在下面看到的,但是我正试图用这个扫描仪,它完全冻结了我的程序,我想我已经走远了,需要一些建议 frames.get(frameNo-1).colors.add(currentColor); break; case "LINE": currentShape = new Line2D.Double(Integer.parseI

我正试图用扫描仪来扫描一组单词,正如你在下面看到的,但是我正试图用这个扫描仪,它完全冻结了我的程序,我想我已经走远了,需要一些建议

            frames.get(frameNo-1).colors.add(currentColor);             
                            break;

        case "LINE":        currentShape = new Line2D.Double(Integer.parseInt(a[1]),Integer.parseInt(a[2]),Integer.parseInt(a[3]),Integer.parseInt(a[4]));
                            frames.get(frameNo-1).shapes.add(currentShape);
                            frames.get(frameNo-1).colors.add(currentColor);             
                            break;

        default: System.out.println("Input Instruction Not Recognized");    
    }
} 

catch (RuntimeException e) {
    e.printStackTrace();
    System.out.println("Invalid input instruction on line " + lineNo);
}
您正试图使用扫描仪从键盘获取一些数据

但随后显示一个JFileChooser,让用户选择一个文件

然后尝试从扫描仪读取数据

除非你在键盘上键入什么,否则扫描器就会坐在那里等着,所以把那句话扔掉

如果要使用扫描仪读取选择器中选定的文件,则实际上需要获取选定的文件名。比如:

File file = fileChooser.getSelectedFile();
然后您可以将该文件与扫描仪一起使用


阅读Swing教程中关于如何获取文件名的更多信息和工作示例部分。

您混合了事件驱动编程范例、Swing GUI和线性控制台编程范例,两者不能很好地混合,也不应该混合。程序冻结的技术原因是Scanner的使用阻塞了Swing事件线程,因此它无法执行绘制GUI和与用户交互的基本功能

解决方案很简单:选择一个或另一个,控制台或SwingGUI,并坚持使用它

请注意,让扫描仪扫描文件是可以的,这是一种完全不同的用法,但让它与System.in一起工作是不可以的,除非在非常特定的情况下,例如在使用辅助进程时,在这种情况下,您需要在后台线程中使用扫描仪

其他问题:

命名混乱:您正在给类(例如框架和组件)命名,这些名称已经是标准JavaGUI库的一部分,这可能会让我们、您的讲师甚至您自己感到困惑。要避免这样做,请尽可能使用更多原始类名。 代码格式:您的一些代码都是左对齐的,因此很难阅读和调试。 窗口交换:您似乎正在交换GUI窗口,这是一种经常会让用户感到疲劳的GUI设计。通常最好通过CardLayout交换JPanel视图。
字符串文件名=scan.next;。提供给扫描仪的是什么?您首先关闭扫描,然后尝试调用其nextLine方法,该方法无法工作。我想向扫描仪提供我用Jfilechooser选择的文件,我已删除了关闭扫描,但它仍然无法工作。最好将代码缩减到相关部分,但您做得太过分了。您的问题是关于扫描器和JFileChooser的,但您问题中的代码现在既不包含这两个。这大大降低了给定答案的有用性。如果它有助于解决问题,请注意。我尝试过调整它,但运气不好,我在java方面不是最好的。我尝试过改变一些你建议的东西,但我仍然有问题。@Adam,我仍然有问题。-我不知道你的问题是什么,因为我不是一个读心术的人。把问题分解成几个步骤。1.创建一个显示JFileChooser并允许用户选择文件的简单程序。然后可以使用System.out.println。。。要显示文件,请选择。2接下来,创建一个程序,在使用扫描仪硬编码文件名时读取文件。3您可以结合程序1和程序2的知识,使用文件选择器动态选择文件名。如果您对任何步骤有问题,请发布一个。
File file = fileChooser.getSelectedFile();
Scanner scanner = new Scanner( file );