2016-08-17 61 views
1

对于我的Java应用程序,我想要类似于Android Toast的东西。为了与我的同事分享并在将来重新使用该代码片段,我将Toast项目创建为自己的项目,成为可导入的库。无法显示库的JFrame

我没有与吐司项目本身的问题。实际上,它可以像预期的那样工作,直接在Eclipse的主要方法中进行测试。

之后,我将其作为库(jar)导出,并将其导入到我的主项目(具有Swing GUI)的类中。我打电话给特定的方法,它应该显示敬酒,但没有任何反应。没有错误信息,只是没有。 我添加了一些println的来查看我是否达到了代码,我确实做了什么。所以从我的库中调用的方法应该被执行,但不知何故它不会。吐司是一个简单,未装饰和半透明的JFrame。因此,敬酒,代码非常简单:

// class extends JFrame 
    public Toast(String msg, int x, int y, int width, int height, Font font, Color background, Color foreground) { 

    setUndecorated(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setAlwaysOnTop(true); 
    setBackground(new Color(0f, 0f, 0f, 1f/3f)); 
    setBounds(x, y, width, height); 
    contentPane = new ToastPane(background); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    SpringLayout sl_contentPane = new SpringLayout(); 
    contentPane.setLayout(sl_contentPane); 
    JLabel label = new JLabel(msg); 
    label.setFont(font); 
    label.setForeground(foreground); 
    sl_contentPane.putConstraint(SpringLayout.WEST, label, 5, SpringLayout.WEST, contentPane); 
    sl_contentPane.putConstraint(SpringLayout.SOUTH, label, 85, SpringLayout.NORTH, contentPane); 
    sl_contentPane.putConstraint(SpringLayout.EAST, label, 385, SpringLayout.WEST, contentPane); 
    label.setHorizontalAlignment(SwingConstants.CENTER); 
    sl_contentPane.putConstraint(SpringLayout.NORTH, label, 5, SpringLayout.NORTH, contentPane); 
    getContentPane().add(label); 
} 

这是用来显示来自外部的吐司(从我的主要项目)的方法:

public static void showToast(String msg, int x, int y, int width, int height, Font font, Color background, Color foreground, int displayTime) 
{ 
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice gd = ge.getDefaultScreenDevice(); 
    boolean isPerPixelTranslucencySupported = gd.isWindowTranslucencySupported(PERPIXEL_TRANSLUCENT); 

    if(!isPerPixelTranslucencySupported) 
    { 
     System.out.println("Per-pixel translucency is not supported"); 
     System.exit(0); 
    } 

    Toast toast = new Toast(msg, x, y, width, height, font, background, foreground); 
    toast.setVisible(true); 

    closeToast(displayTime, toast); 
} 

最后一个方法处置的JFrame的一定量的毫秒数后的吐司:

private static void closeToast(int displayTime, Toast toast) 
{ 
    final Timer timer = new Timer(displayTime, null); 

    timer.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      toast.dispose(); 

     } 
    }); 

    timer.start(); 
} 

我的主要项目是调用敬酒方式如下:

public void showToast() 
{ 
    EventQueue.invokeLater(new Runnable(){ 
     public void run() 
     { 
      try 
      { 
      System.out.println("Going to show the toast!"); 
      Toast.showToast(message, x, y, width, height, font, background, foreground, displayTime); 
      } catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

println给我的反馈,我打印出"Going to show the toast!"达到Toast.showToast(...)行。

有没有人知道,为什么吐司项目的主要方法是正确显示吐司,但将其作为库导入不?

+0

*“类似于Android Toast。为了与我的同事分享并在将来重新使用该代码片段,我创建了我的Toast项目..”*我怀疑你可以创建一个Android基于Java的应用程序的基于项目。并按预期工作。用start&work的方式创建一个Java项目。 –

+0

如果您引用,请正确填写。我写了_“对于我的Java应用程序**,我希望与Android Toast类似**。这是一个基于Java的应用程序。就像我在我的帖子中所说的,我的“Toast-project”是一个带有未修饰的透明JFrame(Swing)的Java应用程序。它仅与Android Toast类似,因为它是一个黑色的小透明盒子,里面有文字,它会在5秒内消失。我没有使用Android Toast。我创建了一个自己的“Java-Toast”。所以从一开始它就是一个Java项目。 – KJaeg

+0

为了更快得到更好的帮助,请发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 –

回答

0

我发现并解决了这个问题。

问题是在方法之前使用了static。将方法从static更改,稍微修改代码以适应删除关键字static

虽然它在Toast项目的主要方法中直接测试时工作正常,但导入Toast项目的另一个项目未正确显示Toast。原因:在类构造函数中设置字段,但试图通过静态方法显示吐司。