Java 如何使我的应用程序图标在Mac dock中反弹
我正在用Java编写一个IRC客户端,我想知道是否有办法在触发nickalert(或任何其他相关通知)时使我的应用程序图标在dock中反弹Java 如何使我的应用程序图标在Mac dock中反弹,java,macos,Java,Macos,我正在用Java编写一个IRC客户端,我想知道是否有办法在触发nickalert(或任何其他相关通知)时使我的应用程序图标在dock中反弹 如果Windows也有某种通知系统,我也想了解它。在MacOS下,尝试使用类似 nb-我没有试过这个,我很抱歉 用示例更新 从 请求用户注意此应用程序(通常通过跳转) 停靠图标)。关键请求将继续跳转到Dock 图标,直到应用程序被激活。已处于活动状态的应用程序 请求注意没有任何作用 这意味着,如果应用程序有焦点,那么该方法将什么也不做 在Mac OSX 10
如果Windows也有某种通知系统,我也想了解它。在MacOS下,尝试使用类似 nb-我没有试过这个,我很抱歉 用示例更新 从 请求用户注意此应用程序(通常通过跳转) 停靠图标)。关键请求将继续跳转到Dock 图标,直到应用程序被激活。已处于活动状态的应用程序 请求注意没有任何作用 这意味着,如果应用程序有焦点,那么该方法将什么也不做 在Mac OSX 10.7.5、Java 1.7.0_07上进行测试
import com.apple.eawt.Application;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestMacIcon {
public static void main(String[] args) {
new TestMacIcon();
}
public TestMacIcon() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
final Application application = Application.getApplication();
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
System.out.println("clicked");
application.requestUserAttention(true);
application.setDockIconImage(ImageIO.read(getClass().getResource("/Java.png")));
application.setDockIconBadge("Blah");
application.requestUserAttention(true);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
Timer time = new Timer(2000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!SwingUtilities.getWindowAncestor(TestPane.this).hasFocus()) {
((Timer)e.getSource()).stop();
System.out.println("Pay attention!!");
application.requestUserAttention(true);
}
}
});
time.setRepeats(true);
time.setCoalesce(true);
time.start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}
Ps请确保您不关注应用程序;) Windows 7有一个通知系统,任务图标可以通过该系统闪烁,但这两个系统都不能通过纯Java获得,您需要在Mac OS下使用JNI/JNA解决方案,尝试使用看起来很有前途的方法,它似乎不起作用。。。我会用这门课来做其他事情,谢谢!事实上,的确如此。如果您阅读了JavaDocs,它会说如果应用程序有焦点,那么这个方法什么也不做。尝试我包含的示例,但请确保单击其他内容;)嗯,我没有集中精力就试过了,但没用。。。我给你举一个例子。好吧,我成功地(正确地)实现了它,它工作了!谢谢!我无法使swt应用程序的图标反弹,因为它可以很好地用于纯java应用程序pfa
import com.apple.eawt.Application;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestMacIcon {
public static void main(String[] args) {
new TestMacIcon();
}
public TestMacIcon() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
final Application application = Application.getApplication();
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
System.out.println("clicked");
application.requestUserAttention(true);
application.setDockIconImage(ImageIO.read(getClass().getResource("/Java.png")));
application.setDockIconBadge("Blah");
application.requestUserAttention(true);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
Timer time = new Timer(2000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!SwingUtilities.getWindowAncestor(TestPane.this).hasFocus()) {
((Timer)e.getSource()).stop();
System.out.println("Pay attention!!");
application.requestUserAttention(true);
}
}
});
time.setRepeats(true);
time.setCoalesce(true);
time.start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}