2016-08-17 13 views
1

私のJavaアプリケーションでは、Android Toastと似たものが欲しかったです。私の同僚と共有し、将来的にそのコードを再利用するために、Toast-projectを独自のプロジェクトとして作成し、インポートできるライブラリにしました。ライブラリの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!"という印を付けてフィードバックしています。

誰でも知っていますが、トーストプロジェクトのメインメソッドが正しくトーストを表示していますが、ライブラリとしてインポートするのはなぜですか?

+0

* "Android Toastに似ています。私の同僚と共有し、将来的にコードを再利用するために、Toastプロジェクトを作成しました。" * Android Javaベースのアプリケーションのベースのプロジェクトです。期待どおりに動作するようにしてください。 Javaプロジェクトを最初から作成し、その方法で作業します。 –

+0

引用する場合は正しく入力してください。私は_ "私の** Javaアプリケーション**のために、私はAndroidトーストに何か**類似した**が欲しいと思った。これは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プロジェクトがインポートされたもう一方のプロジェクトでは、正しくトーストが表示されませんでした。理由:クラスコンストラクタにフィールドを設定しますが、静的メソッドでトーストを表示しようとしています。

関連する問題