⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trayiconapp.java

📁 Code to create a windows tray icon with java.
💻 JAVA
字号:

package org.trayiconapp;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Checkbox;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

import org.apache.log4j.FileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.jtapi.PhoneListener;

import com.jeans.trayicon.TrayIconCallback;
import com.jeans.trayicon.TrayIconException;
import com.jeans.trayicon.TrayIconPopup;
import com.jeans.trayicon.TrayIconPopupSimpleItem;
import com.jeans.trayicon.WindowsTrayIcon;

public class TrayIconApp extends Frame implements Runnable{

    /**
	 * 
	 */
	private static final long serialVersionUID = 731189811085552991L;
	public final static int ENABLE_ITEM = 0;
    public final static int BOLD_ITEM = 1;
    public final static int CHECK_ITEM = 2;


	private static TrayIconButton icon;
	public static Logger logger = Logger.getRootLogger();
	private static String logFileName  = "./phonecallrecorder.log";
	private boolean running = true;
	
	public TrayIconApp() throws TrayIconException, InterruptedException {
		// Set callback method to send windows messages through Tray Icon library (see WindowsMessageCallback)
		WindowsTrayIcon.setWindowsMessageCallback(new WindowsMessageCallback());
		
		icon = new TrayIconButton("Phone Call Recorder",loadImage("rec.gif"),16,16);
		icon.setVisible(true);
		icon.icon.setVisible(true);
		icon.setPopup(makePopup());
	}

	// Create the popup menu for each Tray Icon (on right mouse click)
	public TrayIconPopup makePopup() {
		// Make new popup menu
		TrayIconPopup popup = new TrayIconPopup();

//		 Add exit item
		TrayIconPopupSimpleItem item = new TrayIconPopupSimpleItem("E&xit");
		item.addActionListener(new ExitListener());
		popup.addMenuItem(item);
		return popup;
	}
	
	public static void createLog() {
		   FileAppender fileAppender = new FileAppender();
		   fileAppender.setFile(logFileName);
		   fileAppender.setLayout(new PatternLayout() );
		   fileAppender.activateOptions();
		   logger.addAppender( fileAppender );
	}

	// Load a gif image (used for loading the 16x16 icon gifs)
	public static Image loadImage(String fileName) {
		return Toolkit.getDefaultToolkit().getImage(System.getProperty("java.library.path")+ File.separator + fileName);
	}
	
	public static void centerDialog(Window frame) {
		Dimension dialogSize = frame.getSize();
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		frame.setLocation(screenSize.width/2 - dialogSize.width/2,
		                  screenSize.height/2 - dialogSize.height/2);
	} 
	
// Main proc
	public static void main(String[] args) throws IOException, TrayIconException, InterruptedException {
	    createLog();
		String appName = "PhoneCallRecorder";
		long result = WindowsTrayIcon.sendWindowsMessage(appName, 1234);
		if (result != -1) {
			logger.info("Already running other instance of " + appName + " (returns: " + result + ")");
			return;
		}
		WindowsTrayIcon.initTrayIcon(appName);
		TrayIconApp app = new TrayIconApp();
		TrayIconApp.centerDialog(app);
		app.setVisible(false);
		Thread th = new Thread(app,"TrayIconApp");
		th.start();
	}
	
    public void doExit() {	
		// Free all Tray Icon resources - always call this on exit
		WindowsTrayIcon.cleanUp();
        // Exit application
		running = false;
    }

        
	// Callback listener handles incomming windows messages. In this demo, a windows message is send when the
	// user tries to start a second instance of the demo app. You can try this one by opening two MS-DOS prompts
	// and say in each one "java demo.awt.TestTrayIcon"
	// MS-DOS 1:
	// 	C:\TrayIcon>java demo.awt.TestTrayIcon
	//	...
	//	Other instance started (parameter: 1234)
	//
	// MS-DOS 2:
	// 	C:\TrayIcon>java demo.awt.TestTrayIcon
	// 	Already running other instance of TestTray (returns: 4321)
	private class WindowsMessageCallback implements TrayIconCallback {

		public int callback(int param) {
			// Param contains the integer value send with sendWindowsMessage(appName, param)
			// Return integer value to other process
			return 4321;
		}

	}

	// Callback listener handles exit button / exit popup menu
	private class ExitListener implements ActionListener {

		public void actionPerformed(ActionEvent evt) {
		    doExit();
		}
	}
	

	// Callback listener handles restore (click left on any icon / show popup menu)
	
// Panel with checkbox, string and icon
class TrayIconButton extends Panel {

	/**
		 * 
		 */
		private static final long serialVersionUID = -8988723264136594198L;
	// The checkbox for enabling this Tray Icon
	Checkbox button;
	// The Tray Icon's class
	WindowsTrayIcon icon;
	
	public TrayIconButton(String name, Image image, int wd, int hi) throws TrayIconException, InterruptedException {
		setLayout(new BorderLayout(3,3));
		// Add icon image in ImageDisplayer
		add(new ImageDisplayer(image, wd, hi), BorderLayout.EAST);
		// Add checkbox for enabling Tray Icon
		add(button = new Checkbox(name), BorderLayout.CENTER);
	//	button.addItemListener(new ToggleListener());
		// Create Tray Icon and set tooltip
		icon = new WindowsTrayIcon(image, wd, hi);
		icon.setToolTipText(name);
	}

	// Add popup menu to Tray Icon
	public void setPopup(TrayIconPopup popup) {
		icon.setPopup(popup);
	}

	// Add action listener to Tray Icon
	public void addActionListener(ActionListener listener) {
		icon.addActionListener(listener);
	}

	// Icon visible?
	public boolean testVisible() {
		return icon.isVisible();
	}

	// Listener for checkbox
	// Make icon visible/invisible depending on checkbox state
/*	private class ToggleListener implements ItemListener {

		public void itemStateChanged(ItemEvent evt) {
			icon.setVisible(evt.getStateChange() == ItemEvent.SELECTED);
		}

	}*/
}


	public void run() {
		PhoneListener phoneListener = new PhoneListener();
		try {
			phoneListener.prepareListener();
			Thread th = new Thread(phoneListener, "PhoneListener");
			th.start();
			while ( running ){
				try {
					Thread.sleep(200);
				} catch (InterruptedException ignored) {}
			}
			
		} catch (Exception e) {
			logger.error(e);
		}
		finally{
			phoneListener.setRunning(false);
		}
	}
}

// Canvas for displaying images with given size
class ImageDisplayer extends Canvas {

	/**
	 * 
	 */
	private static final long serialVersionUID = -6000706128902651881L;
	// The image to display
	Image image;
	// The images size
	int wd, hi;

	// Create new canvas with given image and size
	public ImageDisplayer(Image image, int wd, int hi) {
		this.image = image;
		this.wd = wd;
		this.hi = hi;
	}

	// Pref size for layout manager
	public Dimension getPreferredSize() {
		return new Dimension(wd, hi);
	}

	// Min size for layout manager
	public Dimension getMinimumSize() {
		return new Dimension(wd, hi);
	}

	// Redraw image (don't clear background first!)
	public void update(Graphics g) {
		paint(g);
	}

 	// Redraw image
	public void paint(Graphics g) {
		g.drawImage(image, 0, 0, this);
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -