我有几个问题,我发了很帖子都没有得到答案,在此归纳一下,重发帖,希望各位多多支持,顶一下,如果我得到了答案可以向我发邮件索要。问题一:如何实现系统托盘图标
在网上看了很多实现系统托盘图标的帖子,但都大同小异:借用dll动态链接库,用JAVA JNI实现。我想的是有没有用纯JAVA实现的系统图标?它应该不依赖于OS的,能在Windows下实现,在Linux下也可以运行实现的?!
问题二:监听全局热键
就像QQ一样按"Ctrl+Alt+z"组合键就显出界面的。
我尝试过添加:
Toolkit toolkit = Toolkit.getDefaultToolkit();
toolkit.addAWTEventListener(new testListener(), AWTEvent.KEY_EVENT_MASK);
监听:
class testListener implements AWTEventListener {
public void eventDispatched(AWTEvent event) {
if(){Do}
}
}
可是当窗口失去焦点后就没有反应了。
问题三:求一个组件或者方法
希望这个组件能像Windows文件浏览器一样能够实现大图标、小图标、列表、详细信息等功能,最好有监听在图标上的单击、双击、右击。用基本组件来实现的方法也可以。
问题四:改变Image的像索大小
一个图像的大小的为:100*100,格式为jpg,类为Image(其他图像类也可以)。要改变它的大小,比如要把它变为32*32大小作为图标在组件里显示出来,如在JLable里显示出来。
相信高手是不会在乎分数的,为表我的诚意我把所有的分都帖出来了,如果我得分了还会再全部加上去。
请各位多多支持,如果不方便在这里留下文件之类的欢迎给我E-mail: [email protected]
如果结帖了,说明我已经得到了答案或者一部分答案,欢迎你给我发邮件向我索要。
罗嗦了,对不起啦,请各位支持,顶~!切磋才会更快进步。
有兴趣可加群:34317592

解决方案 »

  1.   

    楼上的,我也想过。只是用什么去实现?如果用JNI+DLL动态链接库的话就违背了题意了!
      

  2.   

    系统托盘好像可以使用Java 6的API来做。Java 5及其之前版本不行(除非调用本地方法)。
      

  3.   

    原帖地址:http://community.csdn.net/Expert/topic/5420/5420770.xml?temp=.1256372
    zhuokai() 在我的另一张帖子上帖的:public class DesktopTray {
     private static Desktop desktop;
     private static SystemTray st;
     private static PopupMenu pm;
     public static void main(String[] args) {
      if(Desktop.isDesktopSupported()){//判斷目前平台是否支援Desktop類
       desktop = Desktop.getDesktop();
      }
      if(SystemTray.isSupported()){//判斷目前平台是否支援系統托盤
       st = SystemTray.getSystemTray();
       Image image = Toolkit.getDefaultToolkit().getImage("netbeans.png");//定義托盤圖示的圖片 
       createPopupMenu();
       TrayIcon ti = new TrayIcon(image, "Desktop Demo Tray", pm);
       try {
        st.add(ti);
       } catch (AWTException ex) {
        ex.printStackTrace();
       }
      }
     } public static void sendMail(String mail){
      if(desktop!=null && desktop.isSupported(Desktop.Action.MAIL)){
      try {
       desktop.mail(new URI(mail));
      } catch (IOException ex) {
       ex.printStackTrace();
      } catch (URISyntaxException ex) {
       ex.printStackTrace();
      }
     } 
    }public static void openBrowser(String url){
     if(desktop!=null && desktop.isSupported(Desktop.Action.BROWSE)){
      try {
       desktop.browse(new URI(url));
      } catch (IOException ex) {
       ex.printStackTrace();
      } catch (URISyntaxException ex) {
       ex.printStackTrace();
      }
     }
    }public static void edit(){
     if(desktop!=null && desktop.isSupported(Desktop.Action.EDIT)){
      try {
       File txtFile = new File("test.txt");
       if(!txtFile.exists()){
        txtFile.createNewFile();
       }
       desktop.edit(txtFile);
      } catch (IOException ex) {
       ex.printStackTrace();
      } 
     }
    }public static void createPopupMenu(){
     pm = new PopupMenu();
     MenuItem openBrowser = new MenuItem("Open My Blog");
     openBrowser.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
       openBrowser("http://blog.csdn.net/chinajash");
      }
     }); MenuItem sendMail = new MenuItem("Send Mail to me");
     sendMail.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
       sendMail("mailto:[email protected]");
      }
     }); MenuItem edit = new MenuItem("Edit Text File");
     sendMail.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
       edit();
      }
     }); MenuItem exitMenu = new MenuItem("&Exit");
     exitMenu.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
       System.exit(0);
      }
     });
     pm.add(openBrowser);
     pm.add(sendMail);
     pm.add(edit);
     pm.addSeparator();
     pm.add(exitMenu); 
    }
    }
      

  4.   

    lixiaoxue85(蛮野蛮)在帖http://community.csdn.net/Expert/topic/5420/5420770.xml?temp=.1256372中回复:JDK6.0的系统托盘的雏形其实是个开源的JDIC,其实现原理就是不同的系统调用不同的JNI
    不是象LZ那样想的,可以在任何平台上跑,所以也是分支持不支持的,LZ可以用JDK1.6或JDIC
    package csdn;import java.awt.AWTException;
    import java.awt.MenuItem;
    import java.awt.PopupMenu;
    import java.awt.SystemTray;
    import java.awt.TrayIcon;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    /**
     * Java1.6.0实现系统托盘技术演示
     *
    摘要:Java1.6.0实现系统托盘技术演示:本演示程序实现了点击按钮窗体关闭,
    托盘图标挂于系统托盘上,鼠标双击托盘图标,窗体显示,托盘图标消失,在托盘图标上点右键可弹出选择菜单
    (显示窗口,退出系统,Author),分别能完成不同的任务要求。
     * @author 五斗米 <如转载请保留作者和出处>
     * @blog http://blog.csdn.net/mq612
     */
    public class TrayDemo extends JFrame {
        private JPanel pane = null;
        private JButton button = null; // 启动托盘图标的按钮
        private JLabel label = null; // 用来显示系统是否支持托盘的信息
        private TrayIcon trayIcon = null; // 托盘图标
        private SystemTray tray = null; // 本操作系统托盘的实例    public TrayDemo() {
            super("Java1.6.0托盘技术演示");
            try {
                // 将LookAndFeel设置成Windows样式
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            pane = new JPanel();
            button = new JButton("缩小到托盘");
            button.setEnabled(false);
            label = new JLabel("本操作系统不支持托盘");
            pane.add(label);
            pane.add(button);
            if(SystemTray.isSupported()){ // 如果操作系统支持托盘
                this.tray();
            }
            this.getContentPane().add(pane);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setSize(300, 200);
            this.setVisible(true);
        }
        /**
         * 托盘相关代码
         */
        private void tray(){
            label.setText("本操作系统支持托盘");
            button.setEnabled(true);
            tray = SystemTray.getSystemTray(); // 获得本操作系统托盘的实例
            ImageIcon icon = new ImageIcon("images/icon.gif"); // 将要显示到托盘中的图标
            PopupMenu pop = new PopupMenu(); // 构造一个右键弹出式菜单
            MenuItem show = new MenuItem("显示窗口");
            MenuItem exit = new MenuItem("退出演示");
            MenuItem author = new MenuItem("Author");
            /**
             * TrayIcon有三个构造
             * TrayIcon(Image image) 用“图标”来构造
             * TrayIcon(Image image, String tooltip) 用“图标”和“ToolTip”构造
             * TrayIcon(Image image, String tooltip, PopupMenu popup) 用“图标”,“ToolTip”,“弹出菜单”来构造一个托盘图标
             */
            trayIcon = new TrayIcon(icon.getImage(), "Java1.6.0托盘技术演示", pop);
            // 点击本按钮后窗口被关闭,托盘图标被添加到系统的托盘中
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    try {
                        tray.add(trayIcon); // 将托盘图标添加到系统的托盘实例中
                        setVisible(false); // 使窗口不可视
                    } catch (AWTException ex) {
                        ex.printStackTrace();
                    }
                }
            });
            /**
             * 添加鼠标监听器,当鼠标在托盘图标上双击时,默认显示窗口
             */
            trayIcon.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    if(e.getClickCount()==2){ // 鼠标双击
                        tray.remove(trayIcon); // 从系统的托盘实例中移除托盘图标
                        setVisible(true); // 显示窗口
                    }
                }
            });
            show.addActionListener(new ActionListener() { // 点击“显示窗口”菜单后将窗口显示出来
                public void actionPerformed(ActionEvent e) {
                    tray.remove(trayIcon); // 从系统的托盘实例中移除托盘图标
                    setVisible(true); // 显示窗口
                }
            });
            exit.addActionListener(new ActionListener() { // 点击“退出演示”菜单后退出程序
                public void actionPerformed(ActionEvent e) {
                    System.exit(0); // 退出程序
                }
            });
            author.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    showMessage();
                }
            });
            pop.add(show);
            pop.add(exit);
            pop.add(author);
        }
        /**
         * 显示信息
         */
        private void showMessage(){
            JOptionPane.showMessageDialog(this, new JLabel("<html>作者:mq612(五斗米)<br>Blog:http://blog.csdn.net/mq612</html>"), "五斗米", JOptionPane.INFORMATION_MESSAGE);
        }    public static void main(String[] args) {
            new TrayDemo();
        }}在这里感谢他们,解决了问题一。
      

  5.   

    学习下/.....
    java 6 还没有过
      

  6.   

    问题四,现成写了一个截屏的.保存时可以自己设定大小.
    public class CopyScreen {

    private int screenWidth = 0;
    private int screenHeight = 0;
    private BufferedImage image = null;

    public CopyScreen() {
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

    screenWidth = dim.width;
    screenHeight = dim.height;
    }

    public int getScreenWidth() throws Exception {
    if (screenWidth >= 0)
    return screenWidth;
    else
    throw new Exception("Width is zero!");
    }

    public int getScreenHeight() throws Exception {
    if (screenHeight >= 0)
    return screenHeight;
    else
    throw new Exception("Height is zero!");
    }

    public BufferedImage getScreenImage(int x,int y, int width, int height)
    throws AWTException {
    if (image == null)
    this.readScreen(x,y,width,height);
    if (image != null)
    return image;
    else
    return null;
    }

    public void rest() {
    image = null;
    }

    public InputStream writeToFile(File filename, String fileType)
    throws IOException {
    if (image == null)
    return null;


    boolean ok = ImageIO.write(image,fileType, filename);
    if (ok) {
    return new DataInputStream(
    new FileInputStream(filename));
    } else {
    return null;
    }
    }

    public boolean writeToStream(OutputStream outStream, String type)
    throws IOException {
    if (image == null)
    return false;

    return ImageIO.write(image,type,outStream);
    }

    public void setSize(Rectangle rect) throws Exception {

    /* BufferedImage newImage = null;
    if (image != null) {
    newImage = new BufferedImage(
    rect.width,rect.height,BufferedImage.TYPE_INT_RGB);
    int width = newImage.getWidth();
    int height = newImage.getHeight();

    //Graphics draw = newImage.createGraphics();
    //draw.drawRect(rect.x,rect.y,rect.width,rect.height);
    //draw.drawImage(image,rect.x,rect.y,rect.width,rect.height,null);
    image = newImage;
    } else {
    throw new Exception("Image is null!");
    }*/

    if (image != null) {
    double ratio = 0.0;
    int newWidth = rect.width;
    int newHeight = rect.height;
    if (newWidth > newHeight) {
    ratio = new Integer(newWidth).doubleValue() / image.getWidth();
    } else {
    ratio = new Integer(newHeight).doubleValue() / image.getHeight();
    }

    AffineTransformOp op = new AffineTransformOp
          (AffineTransform.getScaleInstance(ratio, ratio), null);
          image = op.filter(image,null);
    }
    }

    protected void readScreen(int x, int y , int width, int height)
    throws AWTException {
    image = 
    new Robot().createScreenCapture(
    new Rectangle(x,y,width,height));
    }

    public static void main(String[] args) throws Exception {
    CopyScreen screen = new CopyScreen();
    screen.getScreenImage(0,0,screen.getScreenWidth(), screen.getScreenHeight());
    screen.setSize(new Rectangle(0,0,800,600));
    InputStream in = screen.writeToFile(new File("c:/screen1.jpg"),"JPG");

    screen.rest();
    screen.getScreenImage(0,0,screen.getScreenWidth(), screen.getScreenHeight());
    screen.setSize(new Rectangle(0,0,800,600));
    in = screen.writeToFile(new File("c:/screen2.png"),"PNG");
    }
    }
      

  7.   

    TrayIcon 可以解决你的托盘问题,当然他不仅仅是在1.5或者1.6中,1.4也可以的,它是个小项目。你可以在网上搜一下。
    问题三,你说的这个叫 查看文件方式,这个和平台有关,我做过,但是不理想,所以就不献丑了,你解决了告诉我一下。
    至于问题二,建议你把它做成系统服务看怎么样,应为Java目前做不到那么底层去,呵呵,
    希望尽快解决这些问题,让大家见见世面。
      

  8.   

    $ zz╭ ╮╭ ﹌╮.       $
    $   z(o-.-o)(o-.-o) .      $
    $ ┏~﹊︸ ̄~﹊︸ ̄~┓      $
    $ IT者-IT开发者的网站--    $
    $ 10万篇技术资料--天天更新 $
    $ -----www.itzhe.cn-----   $
      

  9.   

    楼主不会是只会java吧。操作系统应该学过吧。1、2不调用系统资源根本就不可能做到。
      

  10.   

    楼上的,看帖又不看清:事实上问题一在本帖中已经解决了(纯JAVA)。
    除问题二以外的其他问题也已经解决了,目前只留下问题二了。第二个问题有解决的方式:JNI+DLL,可是我不愿意,我也想用纯JAVA来解决。
      

  11.   

    JavaService,把JAVA程序注册成windowNT系统服务.
    google一下,应该就有教程.
      

  12.   

    JavaService
    下载地址:http://javaservice.objectweb.org/
      

  13.   

    问题一:如何实现系统托盘图标
    Java6支持系统托盘图标,之前的版本只能使用JNI问题二:监听全局热键
    说实话我也不会,但我敢肯定常规的方法肯定不行,在窗口失去焦点时就不行了。不知道这里使用JNI是否可行,也有可能JVM有相关的钩子给我们使用问题三:求一个组件或者方法
    这个比较复杂,不过也就是IO文件系统 + Swing/SWT实现问题四:改变Image的像索大小
    这个你不需要去修改图像文件数据,只需要在组件中显示图片的时候设置组件的大小。如JLabel的size...当然,图像的大小别太离谱,1024 * 768的图你非要在一个10 * 10的组件上显示...
      

  14.   

    哎,楼上你是典型回帖不看帖。就算我知道JAVA6支持托盘,可是不知道类还是白搭(这个问题已经有达人回答了);
    问题三,其实我也知道这样去实现,关键是有没有简捷的方法;
    问题四,我估计你没有去操作过,如果操作过你不会说出这样的话,组件里的图像大小是不受组件的大小约束的,不信你试试。
      

  15.   

    我不懒。只是不是高手。。上来MARK!
      

  16.   

    有一个“加速器”的概念不知道可不可以用!“加速器”就是在不打开菜单的情况下选择菜单项的快捷键。通过setAccelerator方法可以将加速器关联到一个菜单项eg:
    ......
    JMenuItem open = new JMenuItem("open");
    open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));
    ......
      

  17.   

    问题二是不可能用纯java解决的
    问题一也不过是sun公司帮你实现了各个系统平台的底层调用   所谓的纯java也不过是封装了底层调用这种全局监听肯定要注册到系统的快捷键里面去   在win下面 不用jni 怎么注册进去  
    要按你的想法的话 估计win上的jvm也要用纯java实现
      

  18.   

    这不是一般的高手能回答的
    除了up还是up~~!
      

  19.   

    撇开程序实现细节不谈,先谈谈你的需求
    需求一,在各种平台上实现托盘图标
    托盘图标是Windows的独有特征,你所说的Linux也有,可能说的是GNOME或者KDE的外形类似的
    GUI,但是,实现方式,以及编程实现方式是不同的,我没有做过所以不对实现细节多说,就算
    LINUX的Xwindow都实现托盘图标这个UI元素,API也会因为设计的不同有很多不同,你所说的Java OS-independant不错,但是他的Independant是以OS共同特性,或者说计算机的相同特性为基础的,不是完全的跨平台,这点你要搞清楚需求二类似,不多说了希望各位批评指正。
      

  20.   


    说几句离题远一点的话:鲁迅先生说:世界上本没有路,走的人多了也就成了路。
    给楼上的angelleecash(感觉用汉语拼音打字倍儿有面子) 和insiku(tmd 结帖啊!!!) 举个反例,如果哪一个OS不支持TCP/IP,也就是说让JAVA的socket不能用,是不是就是说JAVA的socket方便实现就都不是纯JAVA实现的?
    我把话撂在这儿:不是!!!它就是纯JAVA实现的。这些类似某些平台不支持的功能模块只要JAVA里面有,那么证明是受官方支持的,只是现在支持得不够全面。JAVA的很多貌似纯JAVA的东西并不是用JAVA写的,那它也是纯JAVA的东西。绝不会因为API里声明了底层调用就说它不是纯JAVA的东西。也可能只是我们认同的概念不同,实质是一样的。说话有些偏激,大夥见谅,不对的地方敬请斧正。
      

  21.   

    JAVA的很多貌似纯JAVA的东西并不是用JAVA写的,那它也是纯JAVA的东西。绝不会因为API里声明了底层调用就说它不是纯JAVA的东西。=======================什么是纯java的概念你就搞错了  纯java的概念是相对于可移植性来说的
    你写一句 Runtime.getRuntime().exec("cmd /c rd c:\temp");
    这算纯java的吗?
    你移植到非windows的平台下 可以运行吗?  这个已经抛弃了java的可移植性 已经不算纯java了
    我记得文档里面有一个东西是不建议使用 使用了会失去移植性 具体忘记了
    并不是说不是用java写的东西 就不是纯java 那所有的东西都是建立在操作硬件的基础上的 那难道就没有纯的东西了?