📄 trayiconapp.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 + -