Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > сворачивание окон в трэй


Автор: sith 11.2.2007, 18:47
как можно реализовать сворачивание окон в трэй...?

Автор: powerOn 11.2.2007, 19:14
Данная функциональность присутствует, опять же, либо  Java 6 либо в JDIC. 

Автор: sith 11.2.2007, 19:53
а как ее реализовать в ява 6?

Автор: powerOn 11.2.2007, 21:22
http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/systemtray/

Автор: sith 11.2.2007, 21:46
powerOn, а нет случайно этой инфы... на родном и могучем языке...

Автор: powerOn 11.2.2007, 21:54
Цитата(sith @  11.2.2007,  21:46 Найти цитируемый пост)
powerOn, а нет случайно этой инфы... на родном и могучем языке... 

Я не встречал.

Автор: val 12.2.2007, 14:25
Решение этой задачи завит от типа графической библиотеки, которую вы используете. В AWT до шестой версии версии JRE такой возможности нет, тем не менее,  если использовать, скажем, SWT, то работа с треем там поддерживается очень давно, да и трей получается нативным.

Автор: sith 17.2.2007, 01:15
не могли бы вы выложить небольшой код в котором в трей сворачиваеться фрэйм... или хотябы апи по данному классу... а то на официальном сайте явы... ссылки на апи мертвы...

Автор: LSD 17.2.2007, 13:44
Работа с системным треем в JDK 1.6

В JDK 1.6 появилась возможность работать с системным треем. В часности можно реализовать сворачивание окон в системный трей.

Основной класс представляющий системный трей это  - java.awt.SystemTray. Он позволяет добавлять и удалять иконки в трей (add()/remove()) и получить размер иконки в трее (systemTray.getTrayIconSize()).
Для показа иконки используется класс java.awt.TrayIcon. У этого класса есть методы для задания картинки показываемой в трее, задания ее tool tip, и меню показываемого по правой кнопке мыши. У TrayIcon есть возможность добавить ActionListener который будет срабатывать по двойному щелчку мыши на иконке в трее. Так же в TrayIcon есть возможность показать небольшой диалог рядом с треем (displayMessage()).

Вот пример приложения, которое при минимизации будет сворачиваться в трей и показывать информационный диалог. Восстановить приложение можно двойным щелчком мыши по иконке в трее.
Код
import javax.swing.*;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class TrayTest extends JFrame
{
  private SystemTray systemTray = SystemTray.getSystemTray();
  private TrayIcon trayIcon;

  public TrayTest() throws IOException
  {
    super("Tray test");
    getContentPane().add(new JColorChooser());
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    trayIcon = new TrayIcon(ImageIO.read(new File("ico.gif")), "Tray test application");

    trayIcon.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        setVisible(true);
        setState(JFrame.NORMAL);
        removeTrayIcon();
      }
    });
    addWindowStateListener(new WindowStateListener()
    {
      public void windowStateChanged(WindowEvent e)
      {
        if(e.getNewState() == JFrame.ICONIFIED)
        {
          setVisible(false);
          addTrayIcon();
        }
      }
    });
  }

  private void removeTrayIcon()
  {
    systemTray.remove(trayIcon);
  }

  private void addTrayIcon()
  {
    try
    {
      systemTray.add(trayIcon);
      trayIcon.displayMessage("Tray test", "Window minimised to tray, double click to show", TrayIcon.MessageType.INFO);
    }
    catch(AWTException ex)
    {
      ex.printStackTrace();
    }
  }

  public static void main(String[] args) throws IOException
  {
    TrayTest trayTest = new TrayTest();
    trayTest.pack();
    trayTest.setLocationRelativeTo(null);
    trayTest.setVisible(true);
  }
}


Пример окна которое не отображается в панели задач, а только в трее (по правой кнопке мыши показывается меню):
Код
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class TrayWindow extends JDialog
{
  private SystemTray systemTray = SystemTray.getSystemTray();

  public TrayWindow() throws IOException, AWTException
  {
    getContentPane().add(new JColorChooser());
    setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

    TrayIcon trayIcon = new TrayIcon(ImageIO.read(new File("ico.gif")), "Tray test application");

    trayIcon.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        if(!isVisible())
          setVisible(true);
      }
    });
    PopupMenu popupMenu = new PopupMenu();
    MenuItem item = new MenuItem("Exit");
    item.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        dispose();
        System.exit(0);
      }
    });
    popupMenu.add(item);
    trayIcon.setPopupMenu(popupMenu);
    systemTray.add(trayIcon);
  }

  public static void main(String[] args) throws IOException, AWTException
  {
    TrayWindow trayWindow = new TrayWindow();
    trayWindow.pack();
    trayWindow.setLocationRelativeTo(null);
    trayWindow.setVisible(true);
  }
}

Автор: skhilkov 22.3.2007, 15:09
Эх....... в КДЕ 3.55 под Ubuntu не хочет работать...... ни картинка не рисуется ни менюшка не показывается....... только пустое место добавляется под значок   smile 

Автор: RebornCrusader 23.3.2007, 03:19
А пиктограммка точно "правильная"?

Автор: Samuil 23.3.2007, 04:45
skhilkov, ты хоть картиночку сунул то?
Код

 trayIcon = new TrayIcon(ImageIO.read(new File([color=red]"ico.gif"[/color])), "Tray test application");

Если нет то так и должно быть как у тебя  smile 

Автор: skhilkov 23.3.2007, 12:17
Забыл написать, под виндой запускал - все окей, при этом я картинку не из ресурсов брал а просто рисовал, под виндой все окей, а вот кде подкачал........

Автор: RebornCrusader 26.3.2007, 03:48
Под правильностью я понимаю глубину цвета и размер. Соответствуют ли они рекомендациям Sun и жизненным реалиям KDE? ;)

Автор: _Michael 1.7.2007, 16:14
Цитата(powerOn @ 11.2.2007,  19:14)
Данная функциональность присутствует, опять же, либо  Java 6 либо в JDIC.

Есть еще возможность использовать JNI. Т-е написать небольшую dll-ку, в которой будет одна функция которой в качестве параметра можно передать нужную иконку, которую она будет рисовать в трее. smile

Автор: LSD 1.7.2007, 16:25
Цитата(_Michael @  1.7.2007,  17:14 Найти цитируемый пост)
Есть еще возможность использовать JNI. Т-е написать небольшую dll-ку, в которой будет одна функция которой в качестве параметра можно передать нужную иконку, которую она будет рисовать в трее.

Только нафига нужен свой велосипед, если именно так в JDIC и сделано?

Автор: _Michael 1.7.2007, 21:24
Ну наверное потому что в jdic помимо иконки в трее, реализованны  и другие возможности, которых автору етой темы не надобно будет скорее всего, а так написал свою длл-ку маленькую по размеру и все тут. В принцыпе то тут дело вкуса, размер здесь наверное не принципыален. Но ради интереса можно попробовать jni поюзать smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)