都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{// 判断是否被点中@Overridepublic boolean contains(int x, int y) {return super.contains(x, y);}//绘制逻辑@Overridepublic 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{@Overridepublic 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);}@Overridepublic int getIconWidth() {return 64;}//获取大小信息@Overridepublic int getIconHeight() {return 64;}
}

ImageIcon支持gif

JFrame重绘

validate();//更新完组件  必须更新 一下 否则 显示会出问题
repaint();//重新绘制

计时器

Timer timer = new Timer(1000, new AbstractAction() {@Overridepublic 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{@Overridepublic void undo() throws CannotUndoException {System.out.println("undo");}//在动作中完成撤销重做  逻辑@Overridepublic 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() {@Overridepublic 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);//必须设置透明否则遮盖内容}@Overrideprotected 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() {@Overridepublic 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() {//设置文件视图@Overridepublic String getName(File f) {return "TEST";}@Overridepublic 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  跟数据模型返回选择那一个  若选择不做改变 直接返回-1public int selectionForKey(char key, ComboBoxModel model) {return 0;}
});
box.setEditor(new ComboBoxEditor() {//设置对应的编辑器(待查)@Overridepublic Component getEditorComponent() {return new JButton("TEST");}@Overridepublic void setItem(Object anObject) {System.out.println(anObject);}@Overridepublic Object getItem() {return null;}@Overridepublic void selectAll() {System.out.println("selectAll");}@Overridepublic void addActionListener(ActionListener l) {}@Overridepublic 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@Overridepublic int getRowCount() {return 100;}//返回行列@Overridepublic int getColumnCount() {return 4;}@Overridepublic 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;}@Overridepublic Object getValueAt(int rowIndex, int columnIndex) {return Boolean.TRUE;}//获取设置值@Overridepublic void setValueAt(Object aValue, int rowIndex, int columnIndex) {System.out.println("setValueAt");}@Overridepublic 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;}@Overridepublic Object getCellEditorValue() {return Boolean.FALSE;}@Overridepublic boolean isCellEditable(EventObject anEvent) {return false;}@Overridepublic boolean shouldSelectCell(EventObject anEvent) {return false;}@Overridepublic boolean stopCellEditing() {return false;}@Overridepublic void cancelCellEditing() {}@Overridepublic void addCellEditorListener(CellEditorListener l) {}@Overridepublic 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() {@Overridepublic void valueChanged(TreeSelectionEvent e) {}
});//设置常用监听器
tree.addTreeExpansionListener(new TreeExpansionListener() {@Overridepublic void treeExpanded(TreeExpansionEvent event) {}@Overridepublic void treeCollapsed(TreeExpansionEvent event) {}
});
tree.addTreeWillExpandListener(new TreeWillExpandListener() {@Overridepublic void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {}@Override//可以在监视器中抛出异常 终止事件public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException {throw new ExpandVetoException(event,"不能展开");}
});

提供了大量操作节点的方法

定制显示与编辑器

tree.setCellRenderer(new TreeCellRenderer() {@Overridepublic 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;}@Overridepublic Object getCellEditorValue() {return null;}@Overridepublic boolean isCellEditable(EventObject anEvent) {return false;}@Overridepublic boolean shouldSelectCell(EventObject anEvent) {return false;}@Overridepublic boolean stopCellEditing() {return false;}@Overridepublic void cancelCellEditing() {}@Overridepublic void addCellEditorListener(CellEditorListener l) {}@Overridepublic 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() {//添加按键回调@Overridepublic void actionPerformed(ActionEvent e) {System.out.println(e);}
});

设置文本域选择文本设置

获取Document对文本进行操作(可以获取,添加移除等)

Document document = area.getDocument();
area.setFont(new Font());//设置文本字体
document.addUndoableEditListener(new UndoableEditListener() {@Overridepublic void undoableEditHappened(UndoableEditEvent e) {}
});//可以添加各种监听器
document.addDocumentListener(new DocumentListener() {@Overridepublic void insertUpdate(DocumentEvent e) {}@Overridepublic void removeUpdate(DocumentEvent e) {}@Overridepublic void changedUpdate(DocumentEvent e) {}
});
area.setCaret(new DefaultCaret(){//设置光标样式@Overridepublic void paint(Graphics g) {super.paint(g);g.drawString("OK",0,0);}
});
area.setHighlighter(new DefaultHighlighter(){//设置选中样式@Overridepublic 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() {@Overridepublic 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);
}

JavaSwing编程总结相关推荐

  1. JavaSwing实现简陋计算器和出题器

    1.概要 使用JavaSwing进行界面搭建,使用Java提供的特定函数来实现解析表达式运算的目的,使用Math.rondom()方法来实现随机出题,不考虑什么性能和安全之类,咱就是说功能先给他弄出来 ...

  2. 【年度盘点】最受欢迎的5大Java练习项目

    5. SSM + easyUI 搭建简易的人事管理系统 当前学习采用 SSM + easyUI 来开发一个比较简易的人事管理系统,让大家能够通过实际项目掌握 SSM 项目的开发.项目当前学习人数:16 ...

  3. java中用swing实现绘画_【年度盘点】最受欢迎的5大Java练习项目

    5. SSM + easyUI 搭建简易的人事管理系统 当前学习采用 SSM + easyUI 来开发一个比较简易的人事管理系统,让大家能够通过实际项目掌握 SSM 项目的开发.项目当前学习人数:16 ...

  4. 学Java开发到底能做什么工作?

    "听说程序员工资很高,想学Java语言,但不知道它到底能做什么?" 随着全民编程热的到来,Java技术已经无处不在,学Java的人也越来越多了,那么学Java开发到底能做什么工作? ...

  5. java读书心得_java夜未眠读书心得

    java夜未眠读书心得篇1 最近我在慧桥上java的培训课,老师推荐了本不错的java教材 看书要学会做笔记,才会有更大收获,每天读30分钟,希望能坚持下去 今天重新翻了第一章 introductio ...

  6. 在java中在包com.db_java基础试题及其答案 (1)

    java基础试题及其答案 (1) (16页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 1Java试题1)java程序中,main方法的格 ...

  7. 华为技能鉴定java_华为Java笔试题

    华为Java笔试题+数据库题 一. 单项选择题 1.Java是从( )语言改进重新设计. A.Ada B.C++ C.Pasacal D.BASIC 2.下列语句哪一个正确( ) A. Java程序经 ...

  8. Java工程师可以从事哪些工作?

    如今,"Java"作为所有编程语言中最热门的技术,也是第一编程语言,可以说它几乎无处不在.目前全球有着数十亿的设备正在运行着Java,很多服务器程序都是用Java编写,用以处理每天 ...

  9. Java图形编程实验总结_实验二java图形界面编程2015级.doc

    实验二java图形界面编程2015级.doc 实验二JAVA图形界面编程一.实验目的熟悉JAVA运行环境,编程掌握JAVASWING组件的图形界面编程.二.实验环境微机,软件MYECLIPSE,JDK ...

最新文章

  1. 对示波器测量正弦波幅值和相位仿真实验
  2. linux下安装和卸载vmware产品
  3. leetcode 452. Minimum Number of Arrows to Burst Balloons | 452. 用最少数量的箭引爆气球(左程云:最大线段重合问题)
  4. 超级计算机阿波罗11,Apollo 8000推进超算科学发展
  5. 字符串表示形式—字符数组和字符指针的区别
  6. adb shell 修改文件名_shell修改文件名(一)
  7. Ubuntu安装完后设置root密码-转
  8. java web服务器cpu占用过高的处理 (2014-07-21 17:17:36)
  9. 网页上的即时聊天--nodejs学习笔记
  10. 程序员修炼之道(二)
  11. linux flash 存储寿命,关于 Flash 存储,你应该知道的一些事情
  12. Android手机便携式wifi的使用及无线数据传输(主要针对XP系统)
  13. IT运维外包甩不掉的包袱
  14. mand-mobile TabPicker 多级联动选择
  15. 澳大利亚域名_AU域名,澳大利亚域名,注册AU域名,au域名注册
  16. 黑客技术入门|“知已知彼,百战不殆”——踩点
  17. 一元享移动怎么样_移动终于良心了?月费6元享46G流量,网友:后悔携号转网了!...
  18. Hugo作者、Go核心团队成员Steve Francia谈诞生13年的Go语言:生态系统、演化与未来[译]...
  19. 计算机附件计算器的用法,计算机附件中的计算器使用方法.doc
  20. g团最多的服务器,艾泽拉斯服务器 5人BWL G团赏析(二)

热门文章

  1. 2022 年第十二届 MathorCup 高校数学建模挑战赛思路
  2. Pycharm环境下调用Qt desinger 常见问题以及解决方法
  3. Spring Boot 容器选择 Undertow 而不是 Tomcat Spring Boot 内嵌容器Unde
  4. 今日学习在线编程题:弓形半径
  5. cdr对象管理器怎么用_CDR新手必看之对象管理的方法
  6. 一个Word中的样式导入另一个Word
  7. 阿里云人机验证(无痕)完整流程以及注意事项
  8. vue集成汉字转拼音插件
  9. 概率论考点之指数分布,泊松分布及积分(一维随机变量内容)
  10. 十二章 Python入门系列之字典