是什么会导致Swing应用程序不一致地引发null指针异常?

埃里克·朗

我有一个两类项目,一个类读取一个文件,并对照一个网站检查该文件中的每个条目,并将返回数据发布到另一个文件中。

例如,如果返回数据为true,则文件中的数据点将在屏幕上闪烁。此功能有效。

我在while循环中通过以下if语句调用此方法。

if (!query.text().contains("unavailable") && !query.text().contains("at least 3 characters long to acquire.") && line != null) {

            HitBox h = new HitBox(line); //GUI Class.

            fos.write(query.text().getBytes());
            fos.write("\n".getBytes());

            fos.flush();

        }

下面是我的GUI类。

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIManager;

public class HitBox {
    private Timer t;
    JWindow frame = new JWindow();
    public HitBox(String s) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager
                            .getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                frame.setAlwaysOnTop(true);

                t = new Timer(1000 * 5, new ActionListener() {
                    public void actionPerformed(ActionEvent e2) {
                        SwingUtilities.getWindowAncestor(frame.getComponent(0))
                        .dispose();
                    }
                });

            }

        });
        frame.setBackground(new Color(0, 0, 0, 0));
        TranslucentPane tp = new TranslucentPane(s);
        frame.setContentPane(tp);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        t.start();

    }


}
class TranslucentPane extends JPanel {

    public TranslucentPane(String s) {
        add(new JLabel(s));
        setOpaque(false);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setComposite(AlphaComposite.SrcOver.derive(0.85f));
        g2d.setColor(getBackground());
        g2d.fillRect(0, 0, getWidth(), getHeight());


    }

}

即使我重写了Web查询,并且只返回了一个设定值,@在运行时中的一个随机点,也会使用同一组输入数据发生这种情况,将出现一个JWindow,将抛出一个空指针(@我对start方法的调用我的计时器对象)。

这使我相信我错误地实现了计时器。我对如何使用一致的数据以及返回的结果很感兴趣,因为它抛出了空指针。

Exception in thread "main" java.lang.NullPointerException
at HitBox.<init>(HitBox.java:51)
at OriginalGangster.main(OriginalGangster.java:38)
充满鳗鱼的气垫船

您不是在GUI线程上启动GUI。您需要将其移入Runnable,并确保在构造计时器之后启动它。

例如,

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;
import javax.swing.Timer;
import javax.swing.UIManager;

public class TestHitBox {
   public static void main(String[] args) {
      String text = "Hello world! This is Hovercraft!";
      int seconds = 5;
      float composite = 0.85f;
      float points = 48f;
      HitBox.showMessage(text, seconds, composite, points);
   }
}

class HitBox {

   public static void showMessage(final String text, final int seconds, final float composite, final float points) {
      EventQueue.invokeLater(new Runnable() {
         @Override
         public void run() {
            try {
               UIManager.setLookAndFeel(UIManager
                     .getSystemLookAndFeelClassName());
            } catch (Exception ex) {
               ex.printStackTrace();
            }
            final JWindow frame = new JWindow();
            frame.setBackground(new Color(0, 0, 0, 0));
            TranslucentPane tp = new TranslucentPane(text, composite, points);
            frame.setContentPane(tp);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);

            frame.setAlwaysOnTop(true);
            new Timer(1000 * seconds, new TimerListener(frame)).start();
         }
      });
   }
}

class TimerListener implements ActionListener {
   private JWindow frame;

   public TimerListener(JWindow frame) {
      this.frame = frame;
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      frame.dispose();
      ((Timer) e.getSource()).stop();
   }
}

@SuppressWarnings("serial")
class TranslucentPane extends JPanel {
   private float composite;

   public TranslucentPane(String s, float composite, float points) {
      this.composite = composite;
      JLabel label = new JLabel(s);
      label.setFont(label.getFont().deriveFont(Font.BOLD, points));
      add(label);
      setOpaque(false); // this breaks a rule
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2d = (Graphics2D) g.create();
      g2d.setComposite(AlphaComposite.SrcOver.derive(composite));
      g2d.setColor(getBackground());
      g2d.fillRect(0, 0, getWidth(), getHeight());
      g2d.dispose(); // dispose of any graphics we create
   }
}

代码已更新。

  • 主要代码已移至公共静态方法,因为这似乎是向用户显示消息且不与其他任何代码共享状态的代码,类似于JOptionPane消息,所以我使它的行为像JOptionPane。
  • Timer的ActionListener出于构造简洁性而移出了构造函数。
  • 添加了用于alpha合成,显示时间和消息字体磅值的参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么字节转换会不一致地炸毁golang?

来自分类Dev

为什么使用Capybara,Poltergeist和Javascript的RSpec功能规范会不一致地失败?

来自分类Dev

PDB不一致地识别变量

来自分类Dev

IResultFilter不一致地写入响应

来自分类Dev

append()不一致地添加内容

来自分类Dev

Jekyll在Github Pages上不一致地应用CSS样式

来自分类Dev

AngularJS应用的量角器测试不一致地通过/失败

来自分类Dev

访问查询不一致地将空字符串视为null

来自分类Dev

访问查询不一致地将空字符串视为null

来自分类Dev

为什么文件校验和会不一致地失败?

来自分类Dev

为什么Excel vba不一致地复制到剪贴板?

来自分类Dev

为什么在使用等宽字体时ImageFont.getsize()不一致地测量字符?

来自分类Dev

为什么 iOS 文件管理不一致地使用字符串(路径)和 URL?

来自分类Dev

AutoMapper不一致地自动解析字符串-> DateTime

来自分类Dev

服务器GUI不一致地冻结,中断或未正确返回

来自分类Dev

编码的UI测试-不一致地找到HtmlDocument

来自分类Dev

Windows Server 2008 IIS7 CSS不一致地工作

来自分类Dev

Rails不一致地为资产服务

来自分类Dev

矩阵在R中不一致地删除列名称

来自分类Dev

Perl不一致地打印包含'%'特定组合的字符串

来自分类Dev

MFMailComposeViewController的UINavigationBar不一致地显示正确的图像/颜色

来自分类Dev

在Firebase中不一致地无法将键命名为整数

来自分类Dev

Excel不一致地更改DATE单元格的格式

来自分类Dev

Pdf.js在画布上不一致地呈现文本

来自分类Dev

在缩进中不一致地使用制表符和空格???(Python)

来自分类Dev

为什么从类中取消设置变量会导致结果不一致

来自分类Dev

为什么从类中取消设置变量会导致结果不一致

来自分类Dev

是什么导致条件查询结果不一致?

来自分类Dev

Firebase文档中用于创建应用程序的不一致(?)

Related 相关文章

  1. 1

    为什么字节转换会不一致地炸毁golang?

  2. 2

    为什么使用Capybara,Poltergeist和Javascript的RSpec功能规范会不一致地失败?

  3. 3

    PDB不一致地识别变量

  4. 4

    IResultFilter不一致地写入响应

  5. 5

    append()不一致地添加内容

  6. 6

    Jekyll在Github Pages上不一致地应用CSS样式

  7. 7

    AngularJS应用的量角器测试不一致地通过/失败

  8. 8

    访问查询不一致地将空字符串视为null

  9. 9

    访问查询不一致地将空字符串视为null

  10. 10

    为什么文件校验和会不一致地失败?

  11. 11

    为什么Excel vba不一致地复制到剪贴板?

  12. 12

    为什么在使用等宽字体时ImageFont.getsize()不一致地测量字符?

  13. 13

    为什么 iOS 文件管理不一致地使用字符串(路径)和 URL?

  14. 14

    AutoMapper不一致地自动解析字符串-> DateTime

  15. 15

    服务器GUI不一致地冻结,中断或未正确返回

  16. 16

    编码的UI测试-不一致地找到HtmlDocument

  17. 17

    Windows Server 2008 IIS7 CSS不一致地工作

  18. 18

    Rails不一致地为资产服务

  19. 19

    矩阵在R中不一致地删除列名称

  20. 20

    Perl不一致地打印包含'%'特定组合的字符串

  21. 21

    MFMailComposeViewController的UINavigationBar不一致地显示正确的图像/颜色

  22. 22

    在Firebase中不一致地无法将键命名为整数

  23. 23

    Excel不一致地更改DATE单元格的格式

  24. 24

    Pdf.js在画布上不一致地呈现文本

  25. 25

    在缩进中不一致地使用制表符和空格???(Python)

  26. 26

    为什么从类中取消设置变量会导致结果不一致

  27. 27

    为什么从类中取消设置变量会导致结果不一致

  28. 28

    是什么导致条件查询结果不一致?

  29. 29

    Firebase文档中用于创建应用程序的不一致(?)

热门标签

归档