2016-08-17 5 views
1

Для моего приложения Java мне нужно нечто похожее на Android Toast. Чтобы поделиться им с моими сотрудниками и повторно использовать эту часть кода в будущем, я создал свой проект Toast как собственный проект, чтобы быть библиотекой, которую можно импортировать.Невозможно показать библиотеку JFrame

У меня нет проблем с самим проектом тоста. На самом деле он работает, как и ожидалось, при тестировании непосредственно в Eclipse в его основном методе.

После этой положительной обратной связи я экспортировал ее как библиотеку (jar) и импортировал ее в класс моего основного проекта (имеет графический интерфейс Swing). Я назвал конкретный метод, который должен показывать тост, но ничего не происходит. Нет сообщения об ошибке, просто ничего. Я добавил несколько 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 дает мне обратную связь, что я добираюсь до линии Toast.showToast(...), распечатывая "Going to show the toast!".

Кто-нибудь знает, почему основной метод тоста-проекта показывает тост правильно, но импортировать его в качестве библиотеки нет?

+0

* «.. похоже на Android Toast. Чтобы поделиться им с моими сотрудниками и повторно использовать эту часть кода в будущем, я создал свой проект Toast ..» * Я сомневаюсь, что вы могли бы создать Android основанный на Java-приложении. и пусть он работает должным образом. Создайте проект Java с самого начала и работы. –

+0

Если вы цитируете, пожалуйста, сделайте это правильно. Я написал _ «Для моего ** Java-приложения ** я хотел что-то ** похожее на Android Toast» _. Это приложение на основе Java. Как я уже сказал в своем сообщении, мой «Toast-project» - это Java-приложение с неразделенным, полупрозрачным JFrame (Swing). Он похож только на Android Toast, потому что он немного черный, полупрозрачный, с текстом в нем, и он исчезнет через 5 секунд. Я НЕ использовал Android Toast. Я создал собственный «Java-Toast». Так что это проект Java с самого начала. – KJaeg

+0

Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

ответ

0

Я нашел и решил проблему.

Проблема заключалась в использовании методов static. Изменили методы из static, изменив код немного, чтобы он соответствовал удалению static -keyword.

В то время как он работал нормально, когда тестировался непосредственно в основном методе проекта Toast, другой проект, в который был импортирован проект Toast, с другой стороны, не показывал тост правильно. Причина: установка полей в классе-конструкторе, но попытка показать тост поверх статического метода.

Смежные вопросы