第十一篇 Java GUI编程(下)- Swing篇
一、Swing的基本组件(一)
1️⃣JComboBox:下拉选择框,支持泛型
2️⃣ButtonGroup:单选框(男or女)
3️⃣JRadioButton:复选框(是否已婚)-- 其余都和awt相同,差别不大
4️⃣实现下图的效果:
package com.swing.java;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SwingDemo1 {
/* 声明所需的全部组件 */
JFrame jf = new JFrame("测试swing基本组件");
JTextField textField = new JTextField(35);
JTextArea textArea = new JTextArea(15,40);
JButton btn = new JButton("确认",new ImageIcon("E:\\MyCode\\JavaCode\\AllCodes\\JavaGUI\\src\\com\\swing\\java\\img.png"));
JComboBox<String> colorSelect = new JComboBox<String>();
ButtonGroup buttonGroup = new ButtonGroup(); //单选框,这里和awt稍微区别
JRadioButton male = new JRadioButton("男",true);
JRadioButton female = new JRadioButton("女",false);
JRadioButton isMarried = new JRadioButton("是否已婚?");
JMenuBar menuBar = new JMenuBar();
JMenu file = new JMenu("文件"); //菜单
JMenu edit = new JMenu("编辑"); //菜单项
JMenuItem auto = new JMenuItem("自动换行");
JMenuItem copy = new JMenuItem("复制",new ImageIcon("E:\\MyCode\\JavaCode\\AllCodes\\JavaGUI\\src\\com\\swing\\java\\img_1.png"));
JMenuItem paste = new JMenuItem("粘贴",new ImageIcon("E:\\MyCode\\JavaCode\\AllCodes\\JavaGUI\\src\\com\\swing\\java\\img_2.png"));
JMenu format = new JMenu("格式"); //子菜单
JMenuItem comment = new JMenuItem("注释"); //子菜单项
JMenuItem cancelcomment = new JMenuItem("取消注释");
/* 右键菜单选项 */
JMenuItem greenBackground = new JMenuItem("护眼模式");
JMenuItem darkBackground = new JMenuItem("夜晚模式");
JMenuItem lightBackground = new JMenuItem("默认模式");
String[] name = {"张三","李四","王五"}; //列表选择框
JList nameList = new JList(name);
/* 在init()组装组件 */
private void init(){
/* JPanel组装底部 */
JPanel bottomPanel = new JPanel();
bottomPanel.add(textField);
bottomPanel.add(btn);
jf.add(bottomPanel,BorderLayout.SOUTH);
/* JPanel组装选择框相关 */
JPanel selectPanel = new JPanel();
colorSelect.addItem("红色");
colorSelect.addItem("黄色");
colorSelect.addItem("绿色");
buttonGroup.add(male);
buttonGroup.add(female);
selectPanel.add(colorSelect);
selectPanel.add(male);
selectPanel.add(female);
selectPanel.add(isMarried);
/* 组装菜单相关组件 */
format.add(comment);
format.add(cancelcomment);
edit.add(auto);
edit.addSeparator();
edit.add(copy);
edit.add(paste);
edit.addSeparator();
edit.add(format);
menuBar.add(file);
menuBar.add(edit);
jf.setJMenuBar(menuBar);
/* 用平行的Box组装文本域和列表选择框 */
Box centerBox = new Box(BoxLayout.X_AXIS);
centerBox.add(textArea);
centerBox.add(nameList);
/* 用垂直的Box组装窗口的中间部分 */
Box verticalBox = Box.createVerticalBox();
verticalBox.add(centerBox);
verticalBox.add(selectPanel);
jf.add(verticalBox,BorderLayout.CENTER);
ButtonGroup popuMenu = new ButtonGroup();
popuMenu.add(greenBackground);
popuMenu.add(darkBackground);
popuMenu.add(lightBackground);
ActionListener popuMenuListen = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String actionCommand = e.getActionCommand();
switch (actionCommand){
case "护眼模式":
textArea.setBackground(new Color(104, 225, 104));
break;
case "夜晚模式":
textArea.setBackground(new Color(35, 35, 37));
break;
case "默认模式":
textArea.setBackground(new Color(235, 241, 240));
break;
}
}
};
greenBackground.addActionListener(popuMenuListen);
darkBackground.addActionListener(popuMenuListen);
lightBackground.addActionListener(popuMenuListen);
JPopupMenu jPopupMenu = new JPopupMenu();
jPopupMenu.add(greenBackground);
jPopupMenu.add(darkBackground);
jPopupMenu.add(lightBackground);
textArea.setComponentPopupMenu(jPopupMenu);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.pack();
jf.setVisible(true);
}
public static void main(String[] args) {
new SwingDemo1().init();
}
}
二、Swing的基本组件(二)
1、边框组件 - Border
很多情况下,为了使界面的层次感更明显,我们会为其设置边框。swing中提供了Border对象来代表一个边框
(1)Border的继承体系
(2)特殊的Border
1️⃣标题边框 - TitleBorder:为其它边框设置标题(创建该类时需要传入一个其他的Border对象,)
2️⃣复合边框 - CompoundBorder:用来组合其它两个边框(创建时传入两个其他边框,内边框+外边框)
(PS:以上两种特殊边框创建时均依赖于其他边框)
(3)Border使用步骤
1️⃣实例化Border对象:使用BorderFactory或者XxxBorder创建
2️⃣调用Swing的setBorder( Border b )方法为组件设置边框
3️⃣案例:实现下图界面效果
package com.swing.java;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
public class SwingDemo2{
public static void main(String[] args) {
JFrame jFrame = new JFrame("测试边框Border");
jFrame.setLayout(new GridLayout(2,4));
//创建BevelBorder斜面边框(类型:凸起、凹陷)
BevelBorder bevelBorder = new BevelBorder(BevelBorder.RAISED,Color.RED,Color.GREEN,Color.BLUE,Color.GRAY);
jFrame.add(getJPanelWithBorder(bevelBorder,"测试BevelBorder"));
//创建LineBorder
Border lineBorder = BorderFactory.createLineBorder(Color.YELLOW, 10);
jFrame.add(getJPanelWithBorder(lineBorder,"测试LineBorder"));
//创建EmptyBorder
EmptyBorder emptyBorder = new EmptyBorder(10,5,20,30);
jFrame.add(getJPanelWithBorder(emptyBorder,"测试EmptyBorder"));
//创建EtchedBorder
EtchedBorder etchedBorder = new EtchedBorder(EtchedBorder.RAISED,Color.RED,Color.GREEN);
jFrame.add(getJPanelWithBorder(etchedBorder,"测试EtchedBorder"));
//创建TitleBorder
TitledBorder titledBorder = BorderFactory.createTitledBorder(new LineBorder(Color.YELLOW,5),"测试TitleBorder(1)");
jFrame.add(getJPanelWithBorder(titledBorder,"测试TitleBorder(2)"));
//创建MatteBorder
MatteBorder matteBorder = BorderFactory.createMatteBorder(10,5,20,30,Color.GRAY);
jFrame.add(getJPanelWithBorder(matteBorder,"测试MatteBorder"));
//创建CompoundBorder
CompoundBorder compoundBorder = new CompoundBorder(new LineBorder(Color.BLUE,10),lineBorder);
jFrame.add(getJPanelWithBorder(compoundBorder,"测试CompoundBorder"));
jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
jFrame.pack();
jFrame.setVisible(true);
}
private static JPanel getJPanelWithBorder(Border border,String content) {
JPanel jPanel = new JPanel();
jPanel.add(new JLabel(content));
jPanel.setBorder(border);
return jPanel;
}
}
3、工具条组件 - JToolBar
1️⃣JToolBar( String name,int orientation ):创建名字为name,方向为orientation的工具条对象。
orientation可传SwingConstants.HORIZONTAL(水平)、SwingConstants.VERTICAL(垂直)
2️⃣JButton add( Action a ):为JToolBar添加工具按钮。
3️⃣addSeparator( Dimensize size ):为JToolBar添加分隔
4️⃣setFloatable( boolean b ):设置工具条是否能拖动
5️⃣setMargin( Insets m ):设置工具条与按钮的边距
6️⃣setOrientation( ):设置工具条的反向(同上面的构造方法)
7️⃣案例:实现下图界面的效果
package com.swing.java;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionEvent;
public class JToolBarTest{
JFrame jFrame = new JFrame("测试JToolBar");
TextArea ta = new TextArea(10,40);
JToolBar jToolBar = new JToolBar("播放工具条",SwingConstants.HORIZONTAL);
Action pre = new AbstractAction("上一曲",new ImageIcon("JavaGUI\\上一曲.png")) {
@Override
public void actionPerformed(ActionEvent e) {
ta.append("上一曲\n");
}
};
Action next = new AbstractAction("下一曲",new ImageIcon("JavaGUI\\下一曲.png")) {
@Override
public void actionPerformed(ActionEvent e) {
ta.append("下一曲\n");
}
};
Action pause = new AbstractAction("暂停",new ImageIcon("JavaGUI\\暂停.png")) {
@Override
public void actionPerformed(ActionEvent e) {
ta.append("暂停\n");
}
};
JButton preBtn = new JButton(pre);
JButton pauseBtn = new JButton(pause);
JButton nextBtn = new JButton(next);
public void init(){
jToolBar.add(preBtn);
jToolBar.addSeparator();
jToolBar.add(pauseBtn);
jToolBar.addSeparator();
jToolBar.add(nextBtn);
jToolBar.setFloatable(true); //可拖动
jFrame.add(jToolBar, BorderLayout.NORTH);
JScrollPane jScrollPane = new JScrollPane(ta);
jFrame.add(jScrollPane, BorderLayout.SOUTH);
jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
jFrame.pack();
jFrame.setVisible(true);
}
public static void main(String[] args) {
new JToolBarTest().init();
}
}
4、选择对话框的使用
(1)颜色选择对话框 - JColorChooser
1️⃣JColorChooser用于创建颜色选择对话框,该类提供了静态方法showDialog( )用于快速生成一个颜色选择对话框。
2️⃣public static Color showDialog( Componet componet,String title,Color initColor )
3️⃣案例:实现下图的效果(点击按钮弹出颜色选择对话框,根据选择的颜色改变文本域的背景色)
package com.swing.java;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
public class ColorChooserTest {
JFrame jFrame = new JFrame("测试颜色选择对话框");
TextArea textArea = new TextArea(15,55);
public void init(){
jFrame.add(textArea,BorderLayout.NORTH);
JButton button = new JButton(new AbstractAction("打开颜色选择框") {
@Override
public void actionPerformed(ActionEvent e) {
Color chooseColor = JColorChooser.showDialog(jFrame, "颜色选择", Color.ORANGE);
textArea.setBackground(chooseColor);
}
});
jFrame.add(button,BorderLayout.SOUTH);
jFrame.pack();
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
public static void main(String[] args) {
new ColorChooserTest().init();
}
}
(2)文件选择对话框 - JFileChooser
🔐JFileChooser的功能与AWT中的FIleDialog基本相似,都可以用于生成"打开文件"和"保存文件"的对话框,与AWT的FileDialog不同的是,JFileChooser无需依赖本地平台的GUI,它有Java实现,在所有平台上具有完全一致的行为,也就是所有平台都具有相同的外观风格。
1️⃣JFileChooser的使用步骤:
🛰实例化JFileChooser对象
🛰调用JFileChooser的方法,进行初始化(默认选择的文件、是否允许多选、设置可选内容等)
🛰显示对话框:showOpenDialog( )、showSaveDialog( )
🛰获取用户选择的结果:File getSelectedFile( )、File[ ] getSelectedFiles( )
2️⃣案例:实现下图效果(打开图片将图片显示出来、保存显示出来的到电脑中)
package com.swing.java;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class FileChooserTest {
JMenuBar menuBar = new JMenuBar();
JMenu file = new JMenu("文件");
MyCanvas myCanvas = new MyCanvas();
BufferedImage image = null;
private class MyCanvas extends JPanel{
@Override
public void paint(Graphics g) {
g.drawImage(image,0,0,null);
}
}
JMenuItem openFile = new JMenuItem(new AbstractAction("打开") {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileOpenDialog = new JFileChooser("\\C:");
fileOpenDialog.showOpenDialog(jFrame);
File selectedOpenFile = fileOpenDialog.getSelectedFile();
try {
image = ImageIO.read(selectedOpenFile);
myCanvas.setPreferredSize(new Dimension(image.getWidth(),image.getHeight()));
jFrame.pack();
myCanvas.repaint();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
JMenuItem saveFile = new JMenuItem(new AbstractAction("另存为") {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileSaveDialog = new JFileChooser(".");
fileSaveDialog.showSaveDialog(jFrame);
File selectedFile = fileSaveDialog.getSelectedFile();
try {
ImageIO.write(image,"jpg",selectedFile);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
JFrame jFrame = new JFrame("测试文件选择对话框");
public void init(){
file.add(openFile);
file.add(saveFile);
menuBar.add(file);
jFrame.setJMenuBar(menuBar);
myCanvas.setPreferredSize(new Dimension(400,200));
jFrame.add(myCanvas);
jFrame.pack();
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
public static void main(String[] args) {
new FileChooserTest().init();
}
}
5、其他对话框 - JOptionPane的使用
☑️:JOptionPane提供了创建一些简单对话框(消息、确认、输入和选项对话框)的方法,Swing已经为这些对话框添加了对应的组件,无需我们手动添加便可以使用。
方法 | 方法功能 |
---|---|
showMessageDialog( ) | 消息对话框,告知用户事件发生,用户只能单击确认。 |
showConfirmDialog( ) | 确认对话框,向用户确认某个事件,用户可以单击yes、no或cancel |
showInputDialog( ) | 输入对话框,提示用户输入某些信息 |
showOptionDialog( ) | 自定义选项对话框,允许自定义选项,可以取代确认对话框,只是比较复杂 |
☑️:上表的方法带有很多的重载,各种参数解释如下:
🛰Component parentComponent - 当前对话框显示的父组件
🛰Object message - 对话框上显示的信息(可以是字符串、组件或者图片等)
🛰String title - 对话框的标题
🛰int optionType - 对话框显示的按钮类型。
(DEFAULT_OPTION、YES_NO_OPTION、YES_MP_CANCEL_OPTION、OK_CANCEL_OPTION)