都2021年了,还有人用JavaSwing?这只是我的一个爱好,我喜欢做界面开发,但是又只有Java还学的不错,大部分Java书籍中对JavaSwing介绍的都比较一般,我便找了《Java2图形设计卷IISwing》介绍的还算不错,正好中秋节有点时间,学习整理了一下,整本书约1000页,肯定没有全部记录,记录了一下我感觉比较好玩的,若你热爱JavaGUI编程,全部看下来一定有所收获
Swing组件类以J开头
Swing设置JFrame风格(必须在显示前调用)
// Metal风格 (默认)
String lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
// Windows10风格
String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
// Windows Classic 98 风格
String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
// Motif风格
String lookAndFeel = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
//当前系统的风格
String lookAndFeel = UIManager.getSystemLookAndFeelClassName();
UIManager.setLookAndFeel(lookAndFeel);
默认BorderLayout
add(new JButton("TEST"),BorderLayout.SOUTH);
//可以设置为null 使用绝对布局管理器
//JPanel 默认流式布局
关闭窗口事件
DO_NOTHING_ON_CLOSE//什么也不做
HIDE_ON_CLOSE//隐藏对应窗口(默认值)
DISPOSE_ON_CLOSE//销毁对于窗口并不退出程序
EXIT_ON_CLOSE//直接退出
可以通过setPreferredSize设置JScrollPane显示的内容大小
myPanel.setPreferredSize(new Dimension(2000,2000));//若要想出现滑动条内部元素必须设置的最够大
添加使用子窗体
JInternalFrame frame = new JInternalFrame("内部窗体",true);
frame.setSize(100,100);
frame.setVisible(true);//设置内部窗体信息
JDesktopPane desktopPane = new JDesktopPane();
desktopPane.add(frame);//添加进它可以活动的容器内
add(desktopPane);//添加容器(容器背景默认为黑色)
desktopPane.getAllFrames();//获取所有窗体 //默认desktopPane使用绝对布局管理器
desktopPane.getSelectedFrame();//获取选中窗体
Swing线程不安全
SwingUtilities工具类
SwingUtilities.invokeLater(() -> {
//把任务放到任务队列就返回
});
SwingUtilities.invokeAndWait(() -> {
//把任务放到队列会阻塞直到启动了
});
监听组件属性变化
addPropertyChangeListener(evt -> {//监听所有属性变化
System.out.println(evt.getPropertyName()+":"+evt.getOldValue()+"->"+evt.getNewValue());
});
addPropertyChangeListener("属性名", evt -> {//监听指定属性变化
});
自定义UI组件
class MyButton extends JButton{
// 判断是否被点中
@Override
public boolean contains(int x, int y) {
return super.contains(x, y);
}
//绘制逻辑
@Override
public void paint(Graphics g) {
super.paint(g);
}
@Override// 更加不同鼠标位置 设置提示语 仍需要先使用setToolTipText("");开启功能
public String getToolTipText(MouseEvent event) {
if(event.getX()<50){
return "PPPPPPPP";
}else {
return "OOOOOOOOOOOOO";
}
}
@Override//设置提示显示的位置
public Point getToolTipLocation(MouseEvent event) {
return new Point(0,0);
}
}
开启日志
myPanel.setDebugGraphicsOptions(DebugGraphics.LOG_OPTION);//开启组件Debug
//LOG_OPTION 打开日志
//BUFFERED_OPTION
//FLASH_OPTION 重绘区域闪烁
//NONE_OPTION
工具提示
// 设置工具提示 设置null使其失效
list.setToolTipText("OKKKKKKKKKKKK");
JLabel按键事件
myPanel.setFocusable(true);//默认JLabel没有获取交点无法响应一些按键事件
焦点切换
默认使用Tab切换焦点,Tab+Shift切换到上一个焦点
边框
setBorder(new TitledBorder("PPPP"));//设置边框
//BorderFactory.createTitledBorder("");//实际与上面的一致
//public static TitledBorder createTitledBorder(String title) {
// return new TitledBorder(title);
//}
自定义边框
class MyBorder extends AbstractBorder{
@Override
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
g.drawLine(x,y,x+width,y+height);
}
}
边框默认绘制在内容下面
自定义图标
class MyIcon implements Icon{
@Override//绘制图标
public void paintIcon(Component c, Graphics g, int x, int y) {
g.drawRect(x,y,64,64);
}
@Override
public int getIconWidth() {
return 64;
}//获取大小信息
@Override
public int getIconHeight() {
return 64;
}
}
ImageIcon支持gif
JFrame重绘
validate();//更新完组件 必须更新 一下 否则 显示会出问题
repaint();//重新绘制
计时器
Timer timer = new Timer(1000, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("OKKKKKKKKKKK");
}
});
timer.setRepeats(false);//默认是反复重复的
timer.start();
SwingUtilities常用方法
集合计算
坐标转换
事件辅助判断
BoxLayout(类似线性布局)
JPanel panel = new JPanel();//使用方式有点奇怪
panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));//也可以指定排列方向
GridBagLayout网格布局
GridBagLayout layout = new GridBagLayout();
setLayout(layout);
GridBagConstraints constraints = new GridBagConstraints();//创建约束条件
constraints.fill=GridBagConstraints.BOTH;//NONE:不调整组件大小 VERTICAL:高度匹配 HORIZONTAL宽度匹配 BOTH:都匹配
constraints.gridx=0;//设置所在网格初始化位置
constraints.gridy=0;
constraints.weightx=2;//设置占用网格数 总网格数 是看最终布局决定的 例如这里是 2*2的网格
constraints.weighty=2;
JButton button = new JButton("OK");
layout.setConstraints(button,constraints);//应用约束
add(button);
ProgressMonitor
ProgressMonitor monitor = new ProgressMonitor(this, "进度", "OKKKK", 0, 100);
monitor.setProgress(i);//更新进度
ProgressMonitorInputStream stream = new ProgressMonitorInputStream(this, "TEST",
new FileInputStream("E:\\IDEA\\MyTest3\\src\\main\\resources\\test.gif"));//与上面类似 自动关联进度组件的输入流
undo与redo
UndoManager manager=new UndoManager();//管理动作
MyEdit myEdit = new MyEdit();
myEdit.redo();
manager.addEdit(myEdit);//添加以执行动作
manager.undo();//撤销
manager.redo();//重做
class MyEdit extends AbstractUndoableEdit{
@Override
public void undo() throws CannotUndoException {
System.out.println("undo");
}//在动作中完成撤销重做 逻辑
@Override
public void redo() throws CannotRedoException {
System.out.println("redo");
}
}
UIManager(操作可以立即生效,动态修改)
UIManager.put("Tree.background",Color.BLACK);//设置组件默认设置
Object o = UIManager.get("");//获取默认设置
String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);//设置样式
设置属性
button.putClientProperty("","");//设置单个组件的属性
JLabel设置文本与图片
JLabel label = new JLabel("TEST", new ImageIcon("E:\\IDEA\\MyTest3\\src\\main\\resources\\test.gif"),
SwingConstants.RIGHT);
label.setVerticalTextPosition(SwingConstants.BOTTOM);//设置文本 图片相对位置
label.setHorizontalTextPosition(SwingConstants.CENTER);
label.setIconTextGap(23);//设置间距
为组件设置快捷键
button.setMnemonic('M');
JToggleButton使用
JToggleButton test = new JToggleButton("TEST");
test.addChangeListener(e -> {
});
按钮组
ButtonGroup group = new ButtonGroup();
for (int i = 0; i < 5; i++) {
JToggleButton button = new JToggleButton("TEST" + i);
group.add(button);
add(button);
}//这三种都可以添加到按钮组形成互斥条件
for (int i = 0; i < 5; i++) {
JCheckBox box = new JCheckBox("TEST");
group.add(box);
add(box);
}
for (int i = 0; i < 5; i++) {
JRadioButton button = new JRadioButton("TEST");
group.add(button);
add(button);
}
JMenuBar与JToolBar
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("TEST");
menu.addSeparator();//添加分割线
JMenuItem item = new JMenuItem("TEST1");
menu.add(item);//为按键设置组合快捷键
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
menuBar.add(menu);
setJMenuBar(menuBar);//添加菜单条
JToolBar toolBar = new JToolBar("TEST");
toolBar.add("TEST1",new JButton("TEST"));
add(toolBar);//添加工具条 注意是add
右键弹出菜单
JPopupMenu popupMenu = new JPopupMenu("TEST");
popupMenu.add("TEST1");//弹出菜单适合做代码提示工具
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(e.getButton()==MouseEvent.BUTTON3){//必须手动调用显示方法
popupMenu.show(Test5.this,e.getX(),e.getY());
}
}
});
Swing不是线程安全的
SwingUtilities.invokeLater();//若其他线程有事件推荐使用该方法 延时处理
JProgressBar
JProgressBar progressBar = new JProgressBar(0, 100);
progressBar.setValue(23);
progressBar.setStringPainted(true);// 想要 绘制文本 不仅要指定文本 还要指定开启绘制
progressBar.setString(String.valueOf(i));
JSlider
JSlider slider = new JSlider(0, 100);//还可以为刻度自定义标签
slider.setPaintLabels(true);//可以设置标签或刻度必须指定绘制
slider.setMajorTickSpacing(20);//若需要动态修改需要调用 slider.revalidate(); 进行重绘
button.setPreferredSize(new Dimension(i*5,20));
button.revalidate();//所有组件都可以在修改后调用revalidate()进行重绘
玻璃窗格
MyPanel my=new MyPanel();
setGlassPane(my);//专门用于处理点击事件的位于所有组件之上 默认内部会设置为不显示
button1.addChangeListener(e -> {
JToggleButton source = (JToggleButton) e.getSource();
my.setVisible(source.isSelected());//动态控制是否可见 可以在玻璃窗格显示注解等内容
});
class MyPanel extends JPanel{
public My() {
setOpaque(false);//必须设置透明否则遮盖内容
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("OOOOOOOOOOO",100,100);
}
}
可以分层显示的Pane
JLayeredPane layeredPane = new JLayeredPane();
JButton button2 = new JButton("EEEE");
layeredPane.setLayer(button2,JLayeredPane.DRAG_LAYER);//设置分层
layeredPane.add(button2);//添加
add(layeredPane);
JTabbedPane选项卡使用
JTabbedPane tabbedPane = new JTabbedPane(SwingConstants.BOTTOM);//还可以指定选项卡的位置
tabbedPane.add("TEST1",new JPanel());
add(tabbedPane);
JSplitPane使用
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
splitPane.setLeftComponent(new JPanel());//切割左右对象
splitPane.setRightComponent(new JPanel());
splitPane.setDividerLocation(200);//添加距一边的边距
JViewport使用(滚动视图的基础)
JViewport viewport = new JViewport();
MyPanel panel = new MyPanel();
panel.setPreferredSize(new Dimension(1000,1000));//内部视图必须足够大
viewport.setView(panel);//设置内部视图
JButton button = new JButton("移动");
button.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
Point point = viewport.getViewPosition();//获取视图位置
point.x+=5;
point.y+=5;
viewport.setViewPosition(point);//设置视图位置
}
});
JScrollPane设置内容头信息
JScrollPane pane = new JScrollPane(panel);
pane.setColumnHeaderView(new JLabel(
new ImageIcon("E:\\IDEA\\MyTest3\\src\\main\\resources\\1.png")));//设置横竖内容头信息
pane.setRowHeaderView(new JLabel(
new ImageIcon("E:\\IDEA\\MyTest3\\src\\main\\resources\\2.png")));
//pane.setRowHeader(new JViewport());//也可以设置JViewport实现单元格锁定行/列的效果
JTextArea设置自动换行
JTextArea area = new JTextArea("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
area.setLineWrap(true);
没有专门的状态条通过JLable实现
add(new JLabel("TEST"),BorderLayout.SOUTH);
JWindow使用
JWindow window = new JWindow();//使用类似 JFrame 不过只有一个简单的窗体
window.add(new JLabel(new ImageIcon("E:\\IDEA\\MyTest3\\src\\main\\resources\\test.gif")));
window.setSize(300,300);
window.setVisible(true);
window.dispose();//释放资源也一样
JOptionPane工具类(会阻塞线程)
JOptionPane pane = new JOptionPane("AAAAAAAAAAAAAAA");
add(pane);//也可以直接创建 作为组件添加
DefaultDesktopManager
调整组件触发窗口事件工具类
JFileChooser使用
JFileChooser chooser = new JFileChooser();
chooser.setFileFilter(new FileNameExtensionFilter("txt"));//设置选择过滤器
//chooser.resetChoosableFileFilters();//重置过滤器
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);//设置选择模式
chooser.setMultiSelectionEnabled(true);//设置是否可以多选
chooser.setFileView(new FileView() {//设置文件视图
@Override
public String getName(File f) {
return "TEST";
}
@Override
public Icon getIcon(File f) {
return super.getIcon(f);
}
});
设置预览
MyLabel label = new MyLabel();
chooser.setAccessory(label);//设置显示预览
chooser.addPropertyChangeListener(label);//通过监听属性变化更改显示
class MyLabel extends JLabel implements PropertyChangeListener {
@Override//可以根据类型进行各种显示
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getPropertyName().equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)){
System.out.println(evt.getNewValue());
}
}
}
JList
// 默认会调用对象的toString()方法显示
JList<String> list = new JList<>("aaa,a,a,a,a,,a,a,a,a,a,asds,a".split(","));
//ListModel<String> listModel=new DefaultListModel<>();//数据也可以使用ListModel可以动态添加或移除
//listModel.addElement(""); //添加移除元素
//listModel.remove(1);
JScrollPane scrollPane = new JScrollPane(list);
list.setVisibleRowCount(3);
list.setCellRenderer((list1, value, index, isSelected, cellHasFocus) -> new JLabel(value));//自定义渲染样式
list.setPrototypeCellValue("AAAAA");//设置list默认选择值 会扩展JList宽度(需要的话)
JComboBox
JComboBox<String> box = new JComboBox<>("A,SD,DFG,SDF,SD,G,DSFG".split(","));
box.setEditable(true);//默认不可编辑
box.addItem("AAA");//允许创建后继续添加
box.removeAllItems();
box.setRenderer((list, value, index, isSelected, cellHasFocus) -> new JLabel(value));//也允许自定义渲染器
box.setKeySelectionManager(new JComboBox.KeySelectionManager() {
@Override//根据输入的key 跟数据模型返回选择那一个 若选择不做改变 直接返回-1
public int selectionForKey(char key, ComboBoxModel model) {
return 0;
}
});
box.setEditor(new ComboBoxEditor() {//设置对应的编辑器(待查)
@Override
public Component getEditorComponent() {
return new JButton("TEST");
}
@Override
public void setItem(Object anObject) {
System.out.println(anObject);
}
@Override
public Object getItem() {
return null;
}
@Override
public void selectAll() {
System.out.println("selectAll");
}
@Override
public void addActionListener(ActionListener l) {
}
@Override
public void removeActionListener(ActionListener l) {
}
});
box.showPopup();//指定展开下拉项
JTable使用
String[] headers={"TEST1","TEST2","TEST3","TEST4"};
Integer[][] data={//数据会默认调用toString()
{12,345,456,34},
{12,345,456,34},
{12,345,456,34}
};
JTable table = new JTable(data, headers);
DefaultTableModel model=new DefaultTableModel();
String[] items = "TEST1,TEST2,TEST3,TEST4".split(",");
for (int i = 0; i < items.length; i++) {
model.addColumn(items[i]);//必须先添加列
}
for (int i = 0; i < 10; i++) {
model.addRow("A,B,V,C".split(","));
}
JTable table = new JTable(model);//也可以使用TableModel 推荐使用使用更加灵活
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);//设置左右调整单元格时的模式
table.setDefaultRenderer(Integer.class, new TableCellRenderer() {
@Override//更加类型设置默认渲染器
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
return new JLabel(value.toString());
}
});
table.getColumnModel().setColumnMargin(12);//设置列间距
有各种操作表格的方法
还可以添加监听事件
class MyTableModel implements TableModel{//自定义TableModel
@Override
public int getRowCount() {
return 100;
}//返回行列
@Override
public int getColumnCount() {
return 4;
}
@Override
public String getColumnName(int columnIndex) {
return "TEST"+columnIndex;//返回列名
}
@Override//对应返回不同的类型有不同的视图对应
public Class<?> getColumnClass(int columnIndex) {
return Boolean.class;
}
@Override//是否可以编辑
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return Boolean.TRUE;
}//获取设置值
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
System.out.println("setValueAt");
}
@Override
public void addTableModelListener(TableModelListener l) {}
@Override//监听器相关
public void removeTableModelListener(TableModelListener l) {}
}
冻结首列的方法
创建两个表,作为首列的表通过scrollPane.setRowHeaderView();设置为固定头部
设置各种选择模式
table.setColumnSelectionAllowed(true);
table.setRowSelectionAllowed(true);
table.setCellSelectionEnabled(true);
为指定列设置渲染器与编辑器
TableColumn column = table.getColumnModel().getColumn(1);//获取对应列
column.setCellEditor(new TableCellEditor() {
@Override//设置编辑器对编辑处理
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
return null;
}
@Override
public Object getCellEditorValue() {
return Boolean.FALSE;
}
@Override
public boolean isCellEditable(EventObject anEvent) {
return false;
}
@Override
public boolean shouldSelectCell(EventObject anEvent) {
return false;
}
@Override
public boolean stopCellEditing() {
return false;
}
@Override
public void cancelCellEditing() {
}
@Override
public void addCellEditorListener(CellEditorListener l) {
}
@Override
public void removeCellEditorListener(CellEditorListener l) {
}
});
column.setCellRenderer(new TableCellRenderer() {
@Override//设置渲染器 渲染指定组件
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
return null;
}
});
JTree的使用
DefaultMutableTreeNode root=new DefaultMutableTreeNode("ROOT");
for (int i = 0; i < 100; i++) {
root.add(new DefaultMutableTreeNode("TEST"+i));
}
JTree tree = new JTree(root);
tree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
}
});//设置常用监听器
tree.addTreeExpansionListener(new TreeExpansionListener() {
@Override
public void treeExpanded(TreeExpansionEvent event) {
}
@Override
public void treeCollapsed(TreeExpansionEvent event) {
}
});
tree.addTreeWillExpandListener(new TreeWillExpandListener() {
@Override
public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
}
@Override//可以在监视器中抛出异常 终止事件
public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException {
throw new ExpandVetoException(event,"不能展开");
}
});
提供了大量操作节点的方法
定制显示与编辑器
tree.setCellRenderer(new TreeCellRenderer() {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
return null;
}
});
tree.setCellEditor(new TreeCellEditor() {
@Override//定制编辑器
public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) {
return null;
}
@Override
public Object getCellEditorValue() {
return null;
}
@Override
public boolean isCellEditable(EventObject anEvent) {
return false;
}
@Override
public boolean shouldSelectCell(EventObject anEvent) {
return false;
}
@Override
public boolean stopCellEditing() {
return false;
}
@Override
public void cancelCellEditing() {
}
@Override
public void addCellEditorListener(CellEditorListener l) {
}
@Override
public void removeCellEditorListener(CellEditorListener l) {
}
});
也可以使用默认的自己定制化
文本使用HTML
JLabel label = new JLabel("<html><h1>HelloWorld</h1></html>");//必须使用 html 标签包裹
添加Keymap
JTextArea area = new JTextArea();
Keymap keymap = area.getKeymap();//获取快捷键映射
keymap.addActionForKeyStroke(KeyStroke.getKeyStroke('A', InputEvent.CTRL_DOWN_MASK),
new AbstractAction() {//添加按键回调
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e);
}
});
设置文本域选择文本设置
获取Document对文本进行操作(可以获取,添加移除等)
Document document = area.getDocument();
area.setFont(new Font());//设置文本字体
document.addUndoableEditListener(new UndoableEditListener() {
@Override
public void undoableEditHappened(UndoableEditEvent e) {
}
});//可以添加各种监听器
document.addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent e) {
}
});
area.setCaret(new DefaultCaret(){//设置光标样式
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawString("OK",0,0);
}
});
area.setHighlighter(new DefaultHighlighter(){//设置选中样式
@Override
public void paintLayeredHighlights(Graphics g, int p0, int p1, Shape viewBounds, JTextComponent editor, View view) {
super.paintLayeredHighlights(g, p0, p1, viewBounds, editor, view);
}
});
area.write();//提供了直接的流操作
area.read();
JPasswordField设置回显字符
JPasswordField password=new JPasswordField();
password.setEchoChar('?');
JEditorPane显示网页(不过效果较差)
JEditorPane editorPane = new JEditorPane();
editorPane.setPage("file:E:\\IDEA\\MyTest3\\src\\main\\resources\\一封家书1.html");
editorPane.addHyperlinkListener(new HyperlinkListener() {
@Override//监听超链接事件
public void hyperlinkUpdate(HyperlinkEvent e) {
}
});
JTextPane允许图文混排
JTextPane textPane = new JTextPane();
textPane.insertIcon(new ImageIcon("E:\\IDEA\\MyTest3\\src\\main\\resources\\1.png"));//插入图片
Toolkit使用
Toolkit toolkit = Toolkit.getDefaultToolkit();
Cursor cursor = toolkit.createCustomCursor(ImageIO.read(new File("E:\\IDEA\\MyTest3\\src\\main\\resources\\2.png")),new Point(), "");//创建光标
setCursor(cursor);//使用光标
Image image = toolkit.createImage("");//获取图片资源
Dimension screenSize = toolkit.getScreenSize();//获取屏幕尺寸
Clipboard clipboard = toolkit.getSystemClipboard();//获取系统剪切板
toolkit.beep();//产生蜂鸣
使用系统托盘
if(SystemTray.isSupported()){//判断当前系统是否支持托盘
SystemTray tray = SystemTray.getSystemTray();//获取系统托盘管理对象
PopupMenu menu = new PopupMenu("TEST");//组装右键菜单
MenuItem item = new MenuItem("TEST1");
item.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e);
}
});
menu.add(item);//添加信息到托盘 注意 图片大小有要求 否则显示不完整
tray.add(new TrayIcon(ImageIO.read(
new File("E:\\IDEA\\MyTest3\\src\\main\\resources\\1.png")),"TEST",menu));
}
其他JFrame特性
setUndecorated(true);//去除JFrame边框
setAlwaysOnTop(true);//设置总是最前
setType(Type.UTILITY);//取消下面的图标显示
setBackground(new Color(0,0,0,0));//设置背景色为透明
public void paint(Graphics g) {//可以与上面的组合使用 JFrame的paint 只绘制不透明部分
super.paint(g);//必须调用用于清空绘图板
g.drawImage(image,x,y,null);
}