基础知识
- JFrame
JFrame类称为“框架类”,是一个窗口的框架,拥有Windows窗口所有性质和最大化、最小化、可移动、可关闭等操作。
JFrame jfmMain = new JFrame("~ SwingStudy ~");
jfmMain.setSize(850, 800);
// 设置窗口大小
jfmMain.setLocationRelativeTo(null);
// 设置窗口在屏幕中央
jfmMain.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
//设置点击窗口关闭按钮执行的操作“退出”
jfmMain.setLayout(new BorderLayout());
//设置布局
- JLabel
JLabel类是标签,通常作为窗口标题、说明性文字、解释性文字等等。
JLabel jlblTopic = new JLabel("简单控件学习");
jlblTopic.setFont(topicFont); //设置字体
jlblTopic.setForeground(TopicFontColor); //设置字体颜色
jlblTopic.setHorizontalAlignment(JLabel.CENTER);
- JPanel
JPanel类是一种透明的画板,若不设置背景色、边框,是看不见的;它的作用是一块独立画布,可以添加各种控件,控件在画板中的坐标是独立的。
JPanel jpnlBody = new JPanel();
jpnlBody.setLayout(new GridLayout(3, 1));
// 整个中间部分的画板分为3行1列
- JButton
JButton类是命令按钮。
JButton jbtnYes = new JButton("确认");
jbtnYes.setForeground(JbtnColor);
jbtnYes.setFont(NormalFont);
jpnlBtn.add(jbtnYes, BorderLayout.CENTER);
- JTextArea
JTextArea类是多行编辑文本的文本编辑类。
JTextArea jtxtEdit = new JTextArea();
jtxtEdit.setFont(NormalFont);
String str;
jtxtEdit.append(" " + str); // 追加在文本框文字的末尾
jtxtEdit.setText(str); // 清空文本框设置文本框的内容为“str”
jtxtEdit.getText() // 得到文本框的内容(字符串形式)
- JComboBox
JComboBox类是下拉列表,是一个泛型类
JComboBox<String> jcmBook = new JComboBox<>();
jcmBook.setFont(smallFont);
private ArrayList<String> bookList = new ArrayList<>();
bookList.add("追风筝的人");
bookList.add("萤火虫小巷");
bookList.add("哈利波特");
for(int i = 0;i < bookList.size();i++) {
jcmBook.addItem(bookList.get(i));
}
- JCheckBox
JCheckBox类是复选框
java.util.List<JCheckBox> jcbxPlays;
String[] playNames = {
"亲爱的热爱的","家有儿女","武林外传","香蜜沉沉烬如霜" };
jcbxPlays = new ArrayList<>();
for(int i = 0;i < playNames.length;i++) {
JCheckBox jcbkPlay = new JCheckBox(playNames[i]);
jcbkPlay.setFont(NormalFont);
jpnlChooseMany.add(jcbkPlay);
jcbxPlays.add(jcbkPlay);
}
- TitledBorder
TitledBorder类是标题框,可以独立设计标题,包括内容、字体、颜色、大小、显示位置、标题对其模式
TitledBorder ttbdEdit = new TitledBorder("编辑");
ttbdEdit.setTitleFont(NormalFont);
ttbdEdit.setTitleColor(TopicFontColor);
ttbdEdit.setTitlePosition(TitledBorder.TOP);
//设置标题在框的上部
ttbdEdit.setTitleJustification(TitledBorder.CENTER);
//设置标题居中显示
- JScrollPane
JScrollPane类是滚动框,当编辑内容超过指定区域时,自动产生一个或两个方向的滚动条
JTextArea jtxtEdit = new JTextArea();
jtxtEdit.setFont(NormalFont);
JScrollPane jscpEdit = new JScrollPane(jtxtEdit);
面向事件编程
在编写响应事件的程序时,首先关注三个基本点:
(1)在哪个控件发生了什么事件
(2)具体是什么事件
(3)要对这个事件进行什么处理
- 侦听事件举例
- 选择复选框的前两个,点击“确定”按钮之后,
在“显示”文本框显示:
“你选择了…”
jbtnYes.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent paramActionEvent) {
PlaysListener();
}
});
public void PlaysListener() {
jtxtDiag.append("\n你选择了\n");
for(int i = 0;i < jcbxPlays.size();i++) {
JCheckBox chk = jcbxPlays.get(i);
if(chk.isSelected()) {
String str = playNames[i];
jtxtDiag.append(" " + str);
}
}
}
- 在“编辑”文本框编辑“你好”,点击“发送”按钮之后,在“显示”文本框显示“你好”
jbtnConvey.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String str = jtxtEdit.getText();
jtxtDiag.append("\n");
jtxtDiag.append(str);
}
});
- 窗口关闭
jfmMain.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent paramWindowEvent) {
jfmMain.dispose();
}
});
界面规范化
本着规范化界面的初衷,即,保证界面设计风格的一致性,实现“代码复用”,有关标题字体、大小、颜色;按钮字体、大小、颜色等等可以采用接口将这些设计设置成常量。
还有一些必须完成固定的操作也写在这个接口中,在以后使用界面编程的时候都实现这个接口,就可以很好的提醒我们该做什么操作,避免遗漏。
- init() 初始化控件内部数据
- reinit() 重新设置位置、尺寸等
- dealAction()事件响应的集合
- showView()显示窗口
- closeView()关闭窗口
package com.mec.Swing.core;
import java.awt.Color;
import java.awt.Font;
public interface IMecView {
public static final Font topicFont = new Font("华文仿宋",Font.BOLD,35);
public static final Font NormalFont = new Font("华文仿宋",Font.BOLD,25);
public static final Font smallFont = new Font("华文仿宋",Font.BOLD,20);
public static final Color TopicFontColor = new Color(255, 128,128);
public static final Color JbtnColor = new Color(159, 51,116);
public static final Color menuColor = new Color(69,135,160);
public static final int topicSize = topicFont.getSize();
public static final int Normalize = NormalFont.getSize();
public static final int smallSize = smallFont.getSize();
public void init();
public void reinit();
public void dealAction();
public void showView();
public void closeView();
default void Viewinit() {
init();
reinit();
dealAction();
}
}
简单使用各控件实现代码
private JComboBox<String> jcmBook;
private JComboBox<String> jcmIdol;
private JComboBox<String> jcmTrival;
private java.util.List<JCheckBox> jcbxPlays;
private ArrayList<String> bookList = new ArrayList<>();
private ArrayList<String> idolList = new ArrayList<>();
private ArrayList<String> trivalList = new ArrayList<>();
private static final String[] playNames = {
"亲爱的热爱的","家有儿女","武林外传","香蜜沉沉烬如霜"
};
public ViewStudy() {
Viewinit();
}
@Override
public void init() {
jfmMain = new JFrame("~ SwingStudy ~");
jfmMain.setSize(850, 800); // 设置窗口大小
jfmMain.setLocationRelativeTo(null); // 设置窗口在屏幕中央
jfmMain.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); //设置点击窗口关闭按钮执行的操作“退出”
jfmMain.setLayout(new BorderLayout());
jfmMain.setResizable(false);
jlblTopic = new JLabel("简单控件学习");
jlblTopic.setFont(topicFont);
jlblTopic.setForeground(TopicFontColor);
jlblTopic.setHorizontalAlignment(JLabel.CENTER);
jfmMain.add(jlblTopic,BorderLayout.NORTH);
//Jpanel 面板区域可以放JButton、JTextArea、JTextField 等
jpnlLeft = new JPanel();
jpnlLeft.add(new Label(" "));
jfmMain.add(jpnlLeft, BorderLayout.WEST);
jpnlRight = new JPanel();
jpnlRight.add(new Label(" "));
jfmMain.add(jpnlRight, BorderLayout.EAST);
jpnlBody = new JPanel();
jpnlBody.setLayout(new GridLayout(3, 1));
// 整个中间部分的画板分为3行1列
jfmMain.add(jpnlBody, BorderLayout.CENTER);
jpnlEdit = new JPanel();
jpnlEdit.setLayout(new GridLayout(1,1));
jpnlBody.add(jpnlEdit);
jtxtEdit = new JTextArea();
jtxtEdit.setFont(NormalFont);
JScrollPane jscpEdit = new JScrollPane(jtxtEdit);
TitledBorder ttbdEdit = new TitledBorder("编辑");
ttbdEdit.setTitleFont(NormalFont);
ttbdEdit.setTitleColor(TopicFontColor);
ttbdEdit.setTitlePosition(TitledBorder.TOP);
ttbdEdit.setTitleJustification(TitledBorder.CENTER);
jscpEdit.setBorder(ttbdEdit);
jpnlEdit.add(jscpEdit);
jpnlShow = new JPanel();
jpnlShow.setLayout(new GridLayout(1,1));
jpnlBody.add(jpnlShow);
jtxtDiag = new JTextArea();
jtxtDiag.setFont(NormalFont);
JScrollPane jscpShow = new JScrollPane(jtxtDiag);
TitledBorder ttbdShow = new TitledBorder("显示");
ttbdShow.setTitleFont(NormalFont);
ttbdShow.setTitleColor(TopicFontColor);
ttbdShow.setTitlePosition(TitledBorder.TOP);
ttbdShow.setTitleJustification(TitledBorder.CENTER);
jscpShow.setBorder(ttbdShow);
jpnlShow.add(jscpShow);
jpnlChoose = new JPanel();
jpnlChoose.setLayout(new GridLayout(2, 1));
jpnlBody.add(jpnlChoose);
JPanel jpnlChooseMany = new JPanel();
TitledBorder ttbdPlays = new TitledBorder("今天你追剧了吗");
ttbdPlays.setTitleColor(TopicFontColor);
ttbdPlays.setTitleFont(NormalFont);
ttbdPlays.setTitlePosition(TitledBorder.TOP);
ttbdPlays.setTitleJustification(TitledBorder.CENTER);
jpnlChooseMany.setBorder(ttbdPlays);
jpnlChoose.add(jpnlChooseMany);
jcbxPlays = new ArrayList<>();
for(int i = 0;i < playNames.length;i++) {
JCheckBox jcbkPlay = new JCheckBox(playNames[i]);
jcbkPlay.setFont(NormalFont);
jpnlChooseMany.add(jcbkPlay);
jcbxPlays.add(jcbkPlay);
}
JPanel jpnlChooseList = new JPanel();
jpnlChooseList.setLayout(new FlowLayout());
TitledBorder ttbdChoose = new TitledBorder("想去哪呢 想看什么 爱豆是谁");
ttbdChoose.setTitleColor(TopicFontColor);
ttbdChoose.setTitleFont(NormalFont);
ttbdChoose.setTitlePosition(TitledBorder.TOP);
ttbdChoose.setTitleJustification(TitledBorder.CENTER);
jpnlChooseList.setBorder(ttbdChoose);
JLabel jlblTrival = new JLabel("旅行");
jlblTrival.setFont(NormalFont);
jpnlChooseList.add(jlblTrival);
jcmTrival = new JComboBox<>();
jcmTrival.setFont(smallFont);
jpnlChooseList.add(jcmTrival);
JLabel jlblBook = new JLabel("书籍");
jlblBook.setFont(NormalFont);
jpnlChooseList.add(jlblBook);
jpnlChoose.add(jpnlChooseList);
jcmBook = new JComboBox<>();
jcmBook.setFont(smallFont);
jpnlChooseList.add(jcmBook);
JLabel jlblIdol = new JLabel("爱豆");
jlblIdol.setFont(NormalFont);
jpnlChooseList.add(jlblIdol);
jcmIdol = new JComboBox<>();
jcmIdol.setFont(smallFont);
jpnlChooseList.add(jcmIdol);
jpnlBtn = new JPanel();
jpnlBtn.setLayout(new FlowLayout());
jfmMain.add(jpnlBtn, BorderLayout.SOUTH);
jbtnYes = new JButton("确认");
jbtnYes.setForeground(JbtnColor);
jbtnYes.setFont(NormalFont);
jpnlBtn.add(jbtnYes, BorderLayout.CENTER);
jbtnConvey = new JButton("发送");
jbtnConvey.setForeground(JbtnColor);
jbtnConvey.setFont(NormalFont);
jpnlBtn.add(jbtnConvey, BorderLayout.CENTER);
jbtnExit = new JButton("退出");
jbtnExit.setForeground(JbtnColor);
jbtnExit.setFont(NormalFont);
jpnlBtn.add(jbtnExit, BorderLayout.CENTER);
jbtnConcel = new JButton("取消");
jbtnConcel.setForeground(JbtnColor);
jbtnConcel.setFont(NormalFont);
jpnlBtn.add(jbtnConcel, BorderLayout.CENTER);
}
@Override
public void reinit() {
bookList.add("追风筝的人");
bookList.add("萤火虫小巷");
bookList.add("哈利波特");
idolList.add("sehun");
idolList.add("vivi");
idolList.add("Evan");
trivalList.add("三亚");
trivalList.add("首尔");
trivalList.add("伦敦");
for(int i = 0;i < bookList.size();i++) {
jcmBook.addItem(bookList.get(i));
}
for(int i = 0;i < idolList.size();i++) {
jcmIdol.addItem(idolList.get(i));
}
for(int i = 0;i < trivalList.size();i++) {
jcmTrival.addItem(trivalList.get(i));
}
}
@Override
public void dealAction() {
jfmMain.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent paramWindowEvent) {
jfmMain.dispose();
}
});
jbtnExit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent paramActionEvent) {
closeView();
}
});
jbtnYes.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent paramActionEvent) {
PlaysListener();
}
});
jbtnConvey.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String str = jtxtEdit.getText();
jtxtDiag.append("\n");
jtxtDiag.append(str);
}
});
}
public void PlaysListener() {
jtxtDiag.append("\n你选择了\n");
for(int i = 0;i < jcbxPlays.size();i++) {
JCheckBox chk = jcbxPlays.get(i);
if(chk.isSelected()) {
String str = playNames[i];
jtxtDiag.append(" " + str);
}
}
}
@Override
public void showView() {
jfmMain.setVisible(true);
}
@Override
public void closeView() {
jfmMain.dispose();
}
}
public class TestForView {
public static void main(String[] args) {
ViewStudy viewMain = new ViewStudy();
viewMain.showView();
}
}
运行效果