目录
前言:
关于Swing进行一些创作和样品设计,不过笔者还是更加推荐去网上寻找一些视频教程,这里直接看代码的话会比较的蒙,建议初学者以视频讲解类的内容为主。
目标:
下图是使用以下代码实现的成品结构图。
实现:
导入包:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
组件文本准备:
创建相关的容器主键,这里文本中有了一定的注释,具体还有那里不懂可以私聊笔者进行询问。
JFrame f = new JFrame("测试Swing基本操作");
//声明菜单相关的组件
JMenuBar menuBar = new JMenuBar();
// 创建组件
JMenu fileMenu = new JMenu("文件");
JMenu editMenu = new JMenu("编辑");
JMenuItem auto = new JMenuItem("字动换行");
JMenuItem copy = new JMenuItem("复制");
JMenuItem paste = new JMenuItem("粘贴");
JMenu formatMenu = new JMenu("格式");
JMenuItem comment = new JMenuItem("注释");
JMenuItem cancelComment = new JMenuItem("取消注释");
// 声明文本域 8行20列
JTextArea ta = new JTextArea(8,20);
String[] colors= {"红色","绿色","蓝色"};
// 声明列表框
JList<String> colorList = new JList<String>(colors);
// 声明选择相关组件
JComboBox<String> colorSelect = new JComboBox<String>();
// 设置男女按钮 默认选中女
ButtonGroup bg = new ButtonGroup();
JRadioButton male = new JRadioButton("男",false);
JRadioButton female = new JRadioButton("女",true);
// 设置结婚勾选方框,默认勾选
JCheckBox isMarried = new JCheckBox("是否已婚?",true);
// 声明底部
// 文本框
JTextField tf = new JTextField(40);
// 确定按钮
JButton ok = new JButton("确定");
// 声明右键菜单
JPopupMenu JPopupMenu = new JPopupMenu();
// 按钮组(右击)
ButtonGroup poupButtonBg = new ButtonGroup();
JRadioButtonMenuItem metal = new JRadioButtonMenuItem("Metal 风格");
JRadioButtonMenuItem nimbus = new JRadioButtonMenuItem("Nimbus 风格");
JRadioButtonMenuItem windows = new JRadioButtonMenuItem("Windows 风格");
JRadioButtonMenuItem windowsClassic = new JRadioButtonMenuItem("WindowsClassic 风格");
JRadioButtonMenuItem motif = new JRadioButtonMenuItem("Motif 风格");
初始化界面:
初始化界面也就是对组件进行一定的封装,将小的组件封装到容器中并实现。
// 组装视图
// 组装底部
JPanel bottomPanel = new JPanel();
bottomPanel.add(tf);
bottomPanel.add(ok);
f.add(bottomPanel, BorderLayout.SOUTH);
// 组装选择相关组件
JPanel selectPanel = new JPanel();
colorSelect.addItem("红色");
colorSelect.addItem("绿色");
colorSelect.addItem("蓝色");
selectPanel.add(colorSelect);
bg.add(male);
bg.add(female);
selectPanel.add(male);
selectPanel.add(female);
selectPanel.add(isMarried);
// 组装文本域和相关组件
Box topLeft = Box.createVerticalBox();
topLeft.add(ta);
topLeft.add(selectPanel);
// 组装顶部
Box top = Box.createHorizontalBox();
top.add(topLeft);
top.add(colorList);
f.add(top);
// 组装顶部菜单
formatMenu.add(comment);
formatMenu.add(cancelComment);
editMenu.add(auto);
// 分割线添加方式
editMenu.addSeparator();
editMenu.add(copy);
editMenu.add(paste);
editMenu.addSeparator();
editMenu.add(formatMenu);
// 往菜单中加入文件和编辑组件
menuBar.add(fileMenu);
menuBar.add(editMenu);
f.setJMenuBar(menuBar);
//组装右键菜单
poupButtonBg.add(metal);
poupButtonBg.add(nimbus);
poupButtonBg.add(windows);
poupButtonBg.add(windowsClassic);
poupButtonBg.add(motif);
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//当前选择的是哪一个风格
String actionCommand = e.getActionCommand();
try {
changeFlavor(actionCommand);
} catch (UnsupportedLookAndFeelException | IllegalAccessException | InstantiationException | ClassNotFoundException ex) {
ex.printStackTrace();
}
}
};
metal.addActionListener(listener);
nimbus.addActionListener(listener);
windows.addActionListener(listener);
windowsClassic.addActionListener(listener);
motif.addActionListener(listener);
JPopupMenu.add(metal);
JPopupMenu.add(nimbus);
JPopupMenu.add(windows);
JPopupMenu.add(windowsClassic);
JPopupMenu.add(motif);
// 不需要在监听鼠标事件了
ta.setComponentPopupMenu(JPopupMenu);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
风格改变类:
这里是改变窗口风格,这里需要死记硬背记住格式,每个风格后边的都不相同。
public void changeFlavor(String command) throws UnsupportedLookAndFeelException, ClassNotFoundException, InstantiationException, IllegalAccessException {
switch (command){
case "Metal 风格":
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
break;
case "Nimbus 风格":
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
break;
case "Windows 风格":
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
break;
case "WindowsClassic 风格":
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");
break;
case "Motif 风格":
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
break;
}
// 刷新组件的外观
SwingUtilities.updateComponentTreeUI(f.getContentPane());
SwingUtilities.updateComponentTreeUI(menuBar);
SwingUtilities.updateComponentTreeUI(JPopupMenu);
}
总代码:
接下来就是完整的代码实现了
package com.swing01;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Demo01 {
JFrame f = new JFrame("测试Swing基本操作");
//声明菜单相关的组件
JMenuBar menuBar = new JMenuBar();
// 创建组件
JMenu fileMenu = new JMenu("文件");
JMenu editMenu = new JMenu("编辑");
JMenuItem auto = new JMenuItem("字动换行");
JMenuItem copy = new JMenuItem("复制");
JMenuItem paste = new JMenuItem("粘贴");
JMenu formatMenu = new JMenu("格式");
JMenuItem comment = new JMenuItem("注释");
JMenuItem cancelComment = new JMenuItem("取消注释");
// 声明文本域 8行20列
JTextArea ta = new JTextArea(8,20);
String[] colors= {"红色","绿色","蓝色"};
// 声明列表框
JList<String> colorList = new JList<String>(colors);
// 声明选择相关组件
JComboBox<String> colorSelect = new JComboBox<String>();
// 设置男女按钮 默认选中女
ButtonGroup bg = new ButtonGroup();
JRadioButton male = new JRadioButton("男",false);
JRadioButton female = new JRadioButton("女",true);
// 设置结婚勾选方框,默认勾选
JCheckBox isMarried = new JCheckBox("是否已婚?",true);
// 声明底部
// 文本框
JTextField tf = new JTextField(40);
// 确定按钮
JButton ok = new JButton("确定");
// 声明右键菜单
JPopupMenu JPopupMenu = new JPopupMenu();
// 按钮组(右击)
ButtonGroup poupButtonBg = new ButtonGroup();
JRadioButtonMenuItem metal = new JRadioButtonMenuItem("Metal 风格");
JRadioButtonMenuItem nimbus = new JRadioButtonMenuItem("Nimbus 风格");
JRadioButtonMenuItem windows = new JRadioButtonMenuItem("Windows 风格");
JRadioButtonMenuItem windowsClassic = new JRadioButtonMenuItem("WindowsClassic 风格");
JRadioButtonMenuItem motif = new JRadioButtonMenuItem("Motif 风格");
//初始化界面
public void init(){
// 组装视图
// 组装底部
JPanel bottomPanel = new JPanel();
bottomPanel.add(tf);
bottomPanel.add(ok);
f.add(bottomPanel, BorderLayout.SOUTH);
// 组装选择相关组件
JPanel selectPanel = new JPanel();
colorSelect.addItem("红色");
colorSelect.addItem("绿色");
colorSelect.addItem("蓝色");
selectPanel.add(colorSelect);
bg.add(male);
bg.add(female);
selectPanel.add(male);
selectPanel.add(female);
selectPanel.add(isMarried);
// 组装文本域和相关组件
Box topLeft = Box.createVerticalBox();
topLeft.add(ta);
topLeft.add(selectPanel);
// 组装顶部
Box top = Box.createHorizontalBox();
top.add(topLeft);
top.add(colorList);
f.add(top);
// 组装顶部菜单
formatMenu.add(comment);
formatMenu.add(cancelComment);
editMenu.add(auto);
// 分割线添加方式
editMenu.addSeparator();
editMenu.add(copy);
editMenu.add(paste);
editMenu.addSeparator();
editMenu.add(formatMenu);
// 往菜单中加入文件和编辑组件
menuBar.add(fileMenu);
menuBar.add(editMenu);
f.setJMenuBar(menuBar);
//组装右键菜单
poupButtonBg.add(metal);
poupButtonBg.add(nimbus);
poupButtonBg.add(windows);
poupButtonBg.add(windowsClassic);
poupButtonBg.add(motif);
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//当前选择的是哪一个风格
String actionCommand = e.getActionCommand();
try {
changeFlavor(actionCommand);
} catch (UnsupportedLookAndFeelException | IllegalAccessException | InstantiationException | ClassNotFoundException ex) {
ex.printStackTrace();
}
}
};
metal.addActionListener(listener);
nimbus.addActionListener(listener);
windows.addActionListener(listener);
windowsClassic.addActionListener(listener);
motif.addActionListener(listener);
JPopupMenu.add(metal);
JPopupMenu.add(nimbus);
JPopupMenu.add(windows);
JPopupMenu.add(windowsClassic);
JPopupMenu.add(motif);
// 不需要在监听鼠标事件了
ta.setComponentPopupMenu(JPopupMenu);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new Demo01().init();
}
public void changeFlavor(String command) throws UnsupportedLookAndFeelException, ClassNotFoundException, InstantiationException, IllegalAccessException {
switch (command){
case "Metal 风格":
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
break;
case "Nimbus 风格":
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
break;
case "Windows 风格":
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
break;
case "WindowsClassic 风格":
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");
break;
case "Motif 风格":
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
break;
}
// 刷新组件的外观
SwingUtilities.updateComponentTreeUI(f.getContentPane());
SwingUtilities.updateComponentTreeUI(menuBar);
SwingUtilities.updateComponentTreeUI(JPopupMenu);
}
}
这个代码可以直接拿出来进行使用。关于事件的监听尚未实现,读者可以根据自己的需求对监听进行实现。
附录:
在创建对象是可以添加图片使其作为添加组件的图片,比如确认按钮,JButton ok = new JButton("确定");要给它添加图片标识只需要在创建时只需要加入图片地址即可,例如:JButton ok = new JButton("确定",“图片的地址”)。