【问题标题】:JFrame low performanceJFrame 性能低下
【发布时间】:2016-02-07 12:30:47
【问题描述】:

JOptionPane.ShowInputDialog 输入缓慢。反映到文本框的用户键操作之间有半秒的间隔。

此外,应用程序(.jar 文件)占用更多内存,大约75mb(应用程序使用 JNA Windows 低级 Keyhook 事件)。

如何优化!

Robot robot = new Robot();
BufferedImage bi=robot.createScreenCapture(new Rectangle(0,25,1366,744));
JFrame frame = new JFrame();
frame.toFront();
frame.requestFocus();
frame.setAlwaysOnTop(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String name = JOptionPane.showInputDialog(frame, "Enter file name");
frame.dispose();
String fileName= dovalidateFile(name);
FileNameExtensionFilter filter = new FileNameExtensionFilter("PNG", ".png");
fileChooser.setFileFilter(filter);
fileChooser.setSelectedFile(new File (fileName));
int returnVal = fileChooser.showSaveDialog(null);
if ( returnVal == JFileChooser.APPROVE_OPTION )
{
    File file = fileChooser.getSelectedFile();
    file = validateFile(file);
    System.out.println(file);
    ImageIO.write(bi, "png", file);
}

【问题讨论】:

  • 你是在摇摆事件调度线程上运行这个吗?
  • 不,不是。它在 switch 语句中。每当从键盘按下 PrtSc 时,此代码就会运行。
  • How can I optimize! 这可能应该发布在 CodeReview 上,因此您正在寻找优化。你不觉得吗?

标签: java jframe bufferedimage joptionpane awtrobot


【解决方案1】:
new Thread(){
    public void run(){
        Robot robot = new Robot();
        BufferedImage bi=robot.createScreenCapture(new Rectangle(0,25,1366,744));
        JFrame frame = new JFrame();
        frame.toFront();
        frame.requestFocus();
        frame.setAlwaysOnTop(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        String name = JOptionPane.showInputDialog(frame, "Enter file name");
        frame.dispose();
        String fileName= dovalidateFile(name);
        FileNameExtensionFilter filter = new FileNameExtensionFilter("PNG", ".png");
        fileChooser.setFileFilter(filter);
        fileChooser.setSelectedFile(new File (fileName));
        int returnVal = fileChooser.showSaveDialog(null);
        if ( returnVal == JFileChooser.APPROVE_OPTION )
        {
            File file = fileChooser.getSelectedFile();
            final File validatedFile = validateFile(file);
            System.out.println(file);
            try{
                ImageIO.write(bi, "png", validatedFile);
            }catch(Excepion e){
                e.printStackTrace();
            }

        }
    }
}.start();

【讨论】:

  • @Dmitry。感谢您的回答。关键字 final 给出错误。 file = validateFile(file);方法validateFile验证文件
  • 已修复 - 使用 validatedFile 而不是 file
  • 谢谢。但是输入仍然加载到输入框很慢。我应该去找任何替代文本框吗?
  • 已修复。这可能是因为robot.createScreenCapture 方法。只需用new Thread() 包裹所有东西。
  • @Scitech What should I do when someone answers my question?:如果答案解决了您的问题,请检查问题左上角的✔。我查看了您所有的问题,但您没有一次接受答案。这不是在 StackOverflow 上完成的方式。承认解决了您的问题的答案,或者如果给出了更多答案,则以最好的方式这样做。
猜你喜欢
  • 2011-06-15
  • 2011-11-03
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多