JavaSwing编程总结

都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));//若要想出现滑动条内部元素必须设置的最够大

image-20210920142839034

添加使用子窗体

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();//获取选中窗体

image-20210920143818905

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);
    }
}

image-20210920170030061

边框默认绘制在内容下面

自定义图标

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常用方法

image-20210920172801467

集合计算

image-20210920172902854

坐标转换

image-20210920173310352

事件辅助判断

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);//更新进度

image-20210920223703256

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实现单元格锁定行/列的效果

image-20210921142544555

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工具类(会阻塞线程)

image-20210921150430068

JOptionPane pane = new JOptionPane("AAAAAAAAAAAAAAA");
add(pane);//也可以直接创建  作为组件添加

DefaultDesktopManager

image-20210921162145137

调整组件触发窗口事件工具类

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();//指定展开下拉项

image-20210921192808062

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);//设置列间距

image-20210922081553249

有各种操作表格的方法

image-20210922081705462

还可以添加监听事件

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,"不能展开");
    }
});

image-20210922094747545

image-20210922094801398

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

定制显示与编辑器

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) {
    }
});

image-20210922095406879

也可以使用默认的自己定制化

文本使用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);
    }
});

image-20210922113318569

设置文本域选择文本设置

image-20210922113757135

获取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"));//插入图片

image-20210922122525949

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);
}
  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值