GUI
1. 简介
GUI核心技术:Swing AWT
学习的目的:
- 可以写出自己心中想要的小工具
- 工作时候,也可能需要维护到swing界面,概率极小
- 了解MVC架构,了解监听
2. AWT
2.1 Frame
//GUI第一个界面
public class TestFrame01 {
public static void main(String[] args) {
//Frame
Frame frame=new Frame("My first frame window");
//设置可见性
frame.setVisible(true);
//设置窗口大小
frame.setSize(400,400);
//设置窗口位置
frame.setLocation(200,200);
//设置背景颜色
frame.setBackground(Color.red);
//设置大小固定
frame.setResizable(false);
//要设置鼠标点击事件,不然关不掉窗口
}
}
结果:
尝试封装
package com.duan.study.gui;
import java.awt.*;
public class TestFrame02 {
public static void main(String[] args) {
Frame myFrame1=new MyFrame(100,100,200,200,Color.red);
Frame myFrame2=new MyFrame(100,300,200,200,Color.yellow);
Frame myFrame3=new MyFrame(300,100,200,200,Color.blue);
Frame myFrame4=new MyFrame(300,300,200,200,Color.black);
}
}
class MyFrame extends Frame{
static int id=0;
public MyFrame(int x, int y, int w, int h, Color color){
super("我的Frame"+(++id));
setBackground(color);
setBounds(x,y,w,h);
setVisible(true);
}
}
2.2 Panel
面板
package com.duan.study.gui;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestPanel01 {
public static void main(String[] args) {
Frame frame=new Frame("frame");
Panel panel=new Panel();
frame.setLayout(null);
frame.setBounds(200,200,400,400);
panel.setBounds(50,50,40,40);
frame.setBackground(new Color(158, 158, 77));
panel.setBackground(new Color(98, 156, 85));
frame.add(panel);
frame.setVisible(true);
//监听事件,监听窗口关闭事件,System.exit(0)
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
2.3 布局管理器
-
流式布局
package com.duan.study.gui; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestFlowLayout01 { public static void main(String[] args) { Frame frame = new Frame(); /*可以设置流式布局,居中,居左,居右等*/ //frame.setLayout(new FlowLayout()); frame.setLayout(new FlowLayout(FlowLayout.LEFT)); Button button1=new Button("button1"); Button button2=new Button("button2"); Button button3=new Button("button3"); frame.add(button1); frame.add(button2); frame.add(button3); frame.setBounds(200,200,400,400); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setVisible(true); } }
-
东西南北中
package com.duan.study.gui; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestBorderLayout01 { public static void main(String[] args) { Frame frame=new Frame(); Button east=new Button("East"); Button west=new Button("West"); Button south=new Button("South"); Button north=new Button("North"); Button center=new Button("Center"); frame.add(east,BorderLayout.EAST); frame.add(west,BorderLayout.WEST); frame.add(south,BorderLayout.SOUTH); frame.add(north,BorderLayout.NORTH); frame.add(center,BorderLayout.CENTER); frame.setBounds(200,200,400,400); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setVisible(true); } }
-
表格布局
package com.duan.study.gui; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestGridLayout01 { public static void main(String[] args) { Frame frame=new Frame(); Button btn1=new Button("btn1"); Button btn2=new Button("btn2"); Button btn3=new Button("btn3"); Button btn4=new Button("btn4"); Button btn5=new Button("btn5"); Button btn6=new Button("btn6"); frame.setLayout(new GridLayout(3,2)); frame.add(btn1); frame.add(btn2); frame.add(btn3); frame.add(btn4); frame.add(btn5); frame.add(btn6); frame.pack(); frame.setBounds(200,200,400,400); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setVisible(true); } }
总结:
- Frame是一个顶级窗口
- Panel无法单独显示,必须添加到某个容器中
- 布局管理器
- 流式布局
- 东西南北中
- 表格布局
- 大小 定位 背景颜色 可见性 监听事件
package com.duan.study.gui; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestDemo { public static void main(String[] args) { //总的frame Frame frame=new Frame("Demo"); frame.setBounds(200,200,300,400); frame.setVisible(true); frame.setBackground(Color.BLACK); frame.setLayout(new GridLayout(2,1)); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); //四个面板 Panel p1=new Panel(new BorderLayout()); Panel p2=new Panel(new GridLayout(2,1)); Panel p3=new Panel(new BorderLayout()); Panel p4=new Panel(new GridLayout(2,2)); //上面的 p1.setBackground(Color.RED); p1.add(new Button("East-1"),BorderLayout.EAST); p1.add(new Button("West-1"),BorderLayout.WEST); p2.add(new Button("p2-btn-1")); p2.add(new Button("p2-btn-2")); p1.add(p2,BorderLayout.CENTER); //下面的 p3.add(new Button("East-2"),BorderLayout.EAST); p3.add(new Button("West-2"),BorderLayout.WEST); p4.add(new Button("p4-btn-1")); p4.add(new Button("p4-btn-2")); p4.add(new Button("p4-btn-3")); p4.add(new Button("p4-btn-4")); p3.add(p4,BorderLayout.CENTER); //添加面板 frame.add(p1); frame.add(p3); } }
2.4 事件监听
package com.duan.study.gui;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestActionEvent {
public static void main(String[] args) {
Frame frame=new Frame();
frame.setLayout(new BorderLayout());
frame.setBounds(200,200,400,400);
Button btn1=new Button("btn1");
Button btn2=new Button("btn2");
//因为addActionListener()需要一个ActionListener,所以我们构造一个ActionListener
MyActionListener myActionListener=new MyActionListener();
MyActionListener2 myActionListener2=new MyActionListener2();
btn1.addActionListener(myActionListener);
btn2.addActionListener(myActionListener2);
frame.add(btn1,BorderLayout.EAST);
frame.add(btn2,BorderLayout.WEST);
WindowsClose(frame);//关闭窗口
frame.setVisible(true);
}
private static void WindowsClose(Frame frame){
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class MyActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("xxx好帅!");
}
}
class MyActionListener2 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("xxx好丑!");
}
}
多个按钮共享一个事件
package com.duan.study.gui;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestActionTwo {
public static void main(String[] args) {
Frame frame=new Frame("开始-结束");
Button btn1=new Button("Start");
Button btn2=new Button("End");
MyAction myAction=new MyAction();
btn1.addActionListener(myAction);
btn2.addActionListener(myAction);
frame.add(btn1,BorderLayout.NORTH);
frame.add(btn2,BorderLayout.SOUTH);
WindowsClose.WindowsClose(frame);
frame.setVisible(true);
}
}
class MyAction implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("Start")){
System.out.println("msg->"+e.getActionCommand());
}else if(e.getActionCommand().equals("End")){
System.out.println("msg->"+e.getActionCommand());
}
}
}
2.5 TextField文本输入框监听
package com.duan.study.gui;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestText01 {
public static void main(String[] args) {
// new MyFrame2();
WindowsClose.WindowsClose(new MyFrame2());
}
}
class MyFrame2 extends Frame{
public MyFrame2() {
TextField textField=new TextField();
add(textField);
//监听文本框输入的文字
MyActionListener02 myActionListener02=new MyActionListener02();
//按下enter键就会触发这个输入框的事件
textField.addActionListener(myActionListener02);
//设置替换编码
textField.setEchoChar('*');
setVisible(true);
pack();
}
}
class MyActionListener02 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//获得一些资源,返回的一个对象
TextField field=(TextField) e.getSource();
//获得输入板的内容
System.out.println(field.getText());
field.setText("");
}
}
2.6 计算器 组合+内部类
package com.duan.study.gui;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestCalc {
public static void main(String[] args) {
new calculator().loadFrame();
}
}
class calculator extends Frame{
//属性
TextField num1,num2,num3;
//方法
public void loadFrame(){
num1=new TextField(10);
num2=new TextField(10);
num3=new TextField(20);
Button btn1=new Button("=");
Label label=new Label("+");
btn1.addActionListener(new MyAction02());
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(btn1);
add(num3);
pack();
setVisible(true);
WindowsClose.WindowsClose(this);
}
//监听器类
//内部类最大的好处就是,可以畅通无阻的使用外部类的属性和方法
private class MyAction02 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//获得加数和被加数
//将这两个值+法运算后,放到第三个框
//清楚前两个框
int n1=Integer.parseInt(num1.getText());
int n2=Integer.parseInt(num2.getText());
num3.setText(""+(n1+n2));
num1.setText("");
num2.setText("");
}
}
}
2.7 画笔
package com.duan.study.gui;
import java.awt.*;
public class TestPaint {
public static void main(String[] args) {
new MyPaint().loadFrame();
}
}
class MyPaint extends Frame{
public void loadFrame(){
setBounds(200,200,600,500);
setVisible(true);
WindowsClose.WindowsClose(this);
}
@Override
public void paint(Graphics g) {
//设置画笔颜色,使画笔能够画画
g.setColor(Color.RED);
//画空心的是,draw(),实心的是fill()
g.drawOval(100,100,200,200);
g.setColor(Color.BLUE);
g.fillOval(200,200,20,20);
//养成习惯,画笔画完还原成他开始的颜色
}
}
2.8 鼠标监听
思路:
package com.duan.study.gui;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
//鼠标监听事件
public class TestMouseListener {
public static void main(String[] args) {
new MyMouse("画板");
}
}
class MyMouse extends Frame{
ArrayList points;
public MyMouse(String title){
super(title);
setBounds(200,200,600,500);
//存鼠标点击的点
points=new ArrayList<>();
//鼠标监听器,对应这个窗口
this.addMouseListener(new MyMouseListener());
setVisible(true);
WindowsClose.WindowsClose(this);
}
@Override
public void paint(Graphics g) {
//画画,监听鼠标的事件
Iterator iterator=points.iterator();
while (iterator.hasNext()){
Point point=(Point) iterator.next();
g.setColor(Color.BLUE);
g.fillOval(point.x,point.y,10,10);
}
}
//添加一个点到界面上
public void addPoint(Point point){
points.add(point);
}
//适配器模式
public class MyMouseListener extends MouseAdapter{
@Override
public void mousePressed(MouseEvent e) {
MyMouse myMouse=(MyMouse) e.getSource();
//我们点击的时候,就会在界面上产生一个点,这个点就是鼠标的点
myMouse.addPoint(new Point(e.getX(),e.getY()));
//每次点击鼠标都需要重新画一遍
myMouse.repaint();
}
}
}
2.9 窗口监听
package com.duan.study.gui;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class TestWindows {
public static void main(String[] args) {
new MyWindowsListener();
}
}
class MyWindowsListener extends Frame{
public MyWindowsListener(){
setBackground(Color.blue);
setBounds(200,200,400,400);
setVisible(true);
//匿名内部类,最好的方式
addWindowListener(new WindowAdapter() {
//主要使用的两个方法,正在关闭和被激活
@Override
public void windowClosing(WindowEvent e) {
System.out.println("windowClosing");
System.exit(0);
}
@Override
public void windowActivated(WindowEvent e) {
setTitle("被激活了!");
System.out.println("windowActivated");
}
});
}
}
2.10 键盘监听
package com.duan.study.gui;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class TestKeyListener {
public static void main(String[] args) {
new KeyFrame();
}
}
class KeyFrame extends Frame{
public KeyFrame(){
setBackground(Color.BLUE);
setBounds(1,2,400,400);
setVisible(true);
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
//获得键盘的键对应的码
int keycode=e.getKeyCode();
System.out.println(keycode);
if(keycode==KeyEvent.VK_UP){
System.out.println("你按了上键!");
}else if(keycode==KeyEvent.VK_LEFT){
System.out.println("你按了左键!");
}else if(keycode==KeyEvent.VK_RIGHT){
System.out.println("你按了右键!");
}else if(keycode==KeyEvent.VK_DOWN){
System.out.println("你按了下键!");
}
}
});
WindowsClose.WindowsClose(this);
}
}
3. Swing
3.1 窗口、面板
package com.duan.study.gui.swing;
import javax.swing.*;
import java.awt.*;
public class JFrameDemo {
//init()初始化
public void init(){
JFrame jFrame=new JFrame("我的JFrame");
jFrame.setVisible(true);
jFrame.setBounds(100,100,200,200);
//获得一个容器
Container container=jFrame.getContentPane();
container.setBackground(Color.WHITE);
JLabel jLabel=new JLabel("阿超学java");
jFrame.add(jLabel);
//让标签居中
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
//关闭窗口事件
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JFrameDemo().init();
}
}
3.2 弹窗
弹窗可以使用主窗口的关闭事件,不用多写
package com.duan.study.gui.swing;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DialogDemo extends JFrame {
//主窗口
public DialogDemo() {
this.setBounds(200,200,500,600);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//JFrame放东西的容器
Container container=this.getContentPane();
//绝对布局
container.setLayout(null);
//按钮
JButton jButton=new JButton("我是一个小按钮");
jButton.setBounds(100,100,200,200);
//点击这个按钮的时候,弹出一个弹窗
jButton.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
new MyDialog();
}
});
container.add(jButton);
}
public static void main(String[] args) {
new DialogDemo();
}
}
//弹出的窗口
class MyDialog extends JDialog{
public MyDialog() {
this.setVisible(true);
this.setBounds(100,100,500,500);
Container container=this.getContentPane();
container.setLayout(null);
JButton jButton=new JButton("阿超努力学Java");
jButton.setBounds(50,50,250,250);
jButton.setBackground(Color.GREEN);
container.add(jButton);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new MyDialog();
}
});
}
}
3.3 标签
new JLabel()
图标Icon
package com.duan.study.gui.swing;
import javax.swing.*;
import java.awt.*;
//图标标签,需要实现类,Frame继承
public class IconDemo extends JFrame implements Icon {
private int width;
private int height;
public IconDemo(){
}
public IconDemo(int width,int height){
this.width=width;
this.height=height;
}
public void init(){
IconDemo iconDemo = new IconDemo(15, 15);
//图标放在标签上,也可以放在其他东西上
JLabel jLabel=new JLabel("A icon",iconDemo,SwingConstants.CENTER);
jLabel.setBounds(200,200,50,50);
Container container=this.getContentPane();
container.add(jLabel);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new IconDemo().init();
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.fillOval(x,y,width,height);
}
@Override
public int getIconWidth() {
return this.width;
}
@Override
public int getIconHeight() {
return this.height;
}
}
图片Icon
package com.duan.study.gui.swing;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class ImageIconDemo extends JFrame {
public ImageIconDemo(){
JLabel jLabel=new JLabel("ImageIcon");
//获得图片的地址
URL url = ImageIconDemo.class.getResource("1.jpg");
ImageIcon imageIcon=new ImageIcon(url);
jLabel.setIcon(imageIcon);
jLabel.setBounds(100,100,200,200);
Container container=this.getContentPane();
container.add(jLabel);
this.setBounds(200,200,400,400);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new ImageIconDemo();
}
}
3.4 面板
JPanel
package com.duan.study.gui.swing;
import javax.swing.*;
import java.awt.*;
public class JPanelDemo extends JFrame {
public JPanelDemo() {
//容器
Container container=this.getContentPane();
//布局,2行1列,上下间距10
container.setLayout(new GridLayout(2,1,10,10));
//面板及布局
JPanel jPanel1=new JPanel(new GridLayout(2,1));
JPanel jPanel2=new JPanel(new GridLayout(1,2));
JPanel jPanel3=new JPanel(new GridLayout(2,3));
JPanel jPanel4=new JPanel(new GridLayout(1,3));
//第一个面板
jPanel1.add(new JButton("1"));
jPanel1.add(new JButton("1"));
//第二个面板
jPanel2.add(new JButton("2"));
jPanel2.add(new JButton("2"));
//第三个面板
jPanel3.add(new JButton("3"));
jPanel3.add(new JButton("3"));
jPanel3.add(new JButton("3"));
jPanel3.add(new JButton("3"));
jPanel3.add(new JButton("3"));
jPanel3.add(new JButton("3"));
//第四个面板
jPanel4.add(new JButton("4"));
jPanel4.add(new JButton("4"));
jPanel4.add(new JButton("4"));
//将面版添加到容器中
container.add(jPanel1);
container.add(jPanel2);
container.add(jPanel3);
container.add(jPanel4);
//设置可见
this.setVisible(true);
//设置大小边界
this.setBounds(200,200,400,400);
//设置关闭事件
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JPanelDemo();
}
}
JScrollPanel(带滚动框的面板)
package com.duan.study.gui.swing;
import javax.swing.*;
import java.awt.*;
public class JScrollDemo extends JFrame {
public JScrollDemo(){
Container container=this.getContentPane();
//文本域 设置长宽
JTextArea jTextArea=new JTextArea(20,50);
//设置默认文字
jTextArea.setText("阿超学Java!");
//Scroll面板
JScrollPane jScrollPane=new JScrollPane(jTextArea);
container.add(jScrollPane);
this.setVisible(true);
this.setBounds(100,100,200,200);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JScrollDemo();
}
}
3.5 按钮
图片按钮
package com.duan.study.gui.swing;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.URL;
public class JButtonDemo extends JFrame {
public JButtonDemo(){
Container container=this.getContentPane();
//获取图片位置,并将图片设置为图标
URL url=JButtonDemo.class.getResource("2.jpg");
Icon icon=new ImageIcon(url);
JButton jButton=new JButton();
jButton.setIcon(icon);
jButton.setToolTipText("A chao Icon");
jButton.setSize(30,30);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("我是一个漂亮的按钮!");
}
});
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("窗口正在关闭....");
}
});
container.add(jButton);
this.setBounds(200,200,400,400);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JButtonDemo();
}
}
单选框按钮
package com.duan.study.gui.swing;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.URL;
public class JButtonDemo02 extends JFrame{
public JButtonDemo02(){
Container container=this.getContentPane();
//单选框
JRadioButton jRadioButton01=new JRadioButton("jRadioButton01");
JRadioButton jRadioButton02=new JRadioButton("jRadioButton02");
JRadioButton jRadioButton03=new JRadioButton("jRadioButton03");
//放入同一个组中才能实现单选
ButtonGroup buttonGroup=new ButtonGroup();
buttonGroup.add(jRadioButton01);
buttonGroup.add(jRadioButton02);
buttonGroup.add(jRadioButton03);
//添加到容器中
container.add(jRadioButton01,BorderLayout.NORTH);
container.add(jRadioButton02,BorderLayout.CENTER);
container.add(jRadioButton03,BorderLayout.SOUTH);
jRadioButton01.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("我是jRadioButton01,你选了我!");
}
});
jRadioButton02.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("我是jRadioButton02,你选了我!");
}
});
jRadioButton03.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("我是jRadioButton03,你选了我!");
}
});
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("窗口正在关闭....");
}
});
this.setBounds(200,200,400,400);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JButtonDemo02();
}
}
复选框按钮
package com.duan.study.gui.swing;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class JButtonDemo03 extends JFrame {
public JButtonDemo03(){
Container container=this.getContentPane();
JCheckBox jCheckBox01=new JCheckBox("jCheckBox01");
JCheckBox jCheckBox02=new JCheckBox("jCheckBox02");
container.add(jCheckBox01,BorderLayout.NORTH);
container.add(jCheckBox02,BorderLayout.SOUTH);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("窗口正在关闭....");
}
});
this.setBounds(200,200,400,400);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JButtonDemo03();
}
}
3.6 列表
下拉框
package com.duan.study.gui.swing;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ConcurrentModificationException;
public class TestComboBox extends JFrame {
public TestComboBox(){
Container container=this.getContentPane();
JPanel jPanel=new JPanel();
JComboBox jComboBox=new JComboBox();
jComboBox.addItem("");
jComboBox.addItem("正在热映!");
jComboBox.addItem("已下架!");
jComboBox.addItem("还未上映!");
jComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
Object msg = e.getItem();
System.out.println(msg);
if(msg.equals("正在热映!")){
System.out.println("正在热映的有:A B C D");
}else if(msg.equals("已下架!")){
System.out.println("已下架!的有:E F G");
}else if(msg.equals("还未上映!")){
System.out.println("还未上映!的有:H I J K");
}else if(msg.equals("")){
System.out.println("请选择类别");
}
}
});
jPanel.add(jComboBox);
container.add(jPanel);
this.setVisible(true);
this.setBounds(200,200,400,400);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestComboBox();
}
}
列表框
package com.duan.study.gui.swing;
import javax.swing.*;
import java.awt.*;
import java.util.Vector;
public class TestComboBox02 extends JFrame {
public TestComboBox02(){
Container container=this.getContentPane();
Vector contents=new Vector();
contents.add("段");
contents.add("啊");
contents.add("超");
contents.add("学");
contents.add("Java");
contents.add("Java");
contents.add("Java");
contents.add("Java");
contents.add("Java");
contents.add("Java");
JList jList=new JList(contents);
JScrollPane jScrollPane=new JScrollPane(jList);
container.add(jScrollPane);
this.setVisible(true);
this.setBounds(100,100,200,200);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestComboBox02();
}
}
3.7 文本框
文本框
new JTextFiled()
密码框
new JPasswordFiled()
文本域
new JTextArea()
4. 贪吃蛇
帧 时间片,连起来是动画,停下来时图片
键盘监听
定时器Timer
游戏启动类
package com.duan.study.gui.snake;
import javax.swing.*;
//游戏启动类
public class GameStart {
public static void main(String[] args) {
JFrame jFrame=new JFrame();
jFrame.setBounds(10,10,900,720);
jFrame.setResizable(false);//设置窗口大小不可变
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//正常的游戏界面在面板上
jFrame.add(new GamePanel());
jFrame.setVisible(true);
}
}
游戏面板类
package com.duan.study.gui.snake;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
//游戏的面板
public class GamePanel extends JPanel implements KeyListener, ActionListener {
//定义蛇的数据结构
int lenth; //蛇的长度
int[] snakeX = new int[600]; //蛇的坐标x
int[] snakeY = new int[500]; //蛇的坐标y
String fx = "R"; //蛇的方向 : R:右 L:左 U:上 D:下
boolean isStart = false; //游戏是否开始
Timer timer = new Timer(100, this); //定时器:第一个参数,就是定时执行时间
//食物
int foodx;
int foody;
Random random = new Random();
boolean isFail = false; //游戏是否结束
int score; //游戏分数!
//构造方法
public GamePanel() {
init();//初始化
this.setFocusable(true); //获取焦点事件
this.addKeyListener(this); //键盘监听事件
timer.start();
}
//初始化方法
public void init() {
lenth = 3;//初始小蛇有三节,包括小脑袋
//初始化开始的蛇,给蛇定位,
snakeX[0] = 100;
snakeY[0] = 100;
snakeX[1] = 75;
snakeY[1] = 100;
snakeX[2] = 50;
snakeY[2] = 100;
//初始化食物数据
foodx = 25 + 25 * random.nextInt(34);
foody = 75 + 25 * random.nextInt(24);
score = 0; //初始化游戏分数
}
/**
* 一开始我们进来我们需要绘制面板
* Alt+ins Overrid 里面有个paintComponent方法用来绘制组件
* 画组件
*
* @param g 游戏中的所有东西,都用这只g画笔来画就够了
*/
public void paintComponent(Graphics g) {
super.paintComponent(g);//清屏
//绘制静态面板
this.setBackground(Color.pink); //设置面板的背景色
GameData.header.paintIcon(this, g, 25, 11); //绘制头部广告栏
g.fillRect(25, 75, 850, 600); //绘制游戏区域
//把小蛇画上去
if (fx.equals("R")) { //蛇的头通过方向变量来判断
GameData.right.paintIcon(this, g, snakeX[0], snakeY[0]);
} else if (fx.equals("L")) {
GameData.left.paintIcon(this, g, snakeX[0], snakeY[0]);
} else if (fx.equals("U")) {
GameData.up.paintIcon(this, g, snakeX[0], snakeY[0]);
} else if (fx.equals("D")) {
GameData.down.paintIcon(this, g, snakeX[0], snakeY[0]);
}
for (int i = 1; i < lenth; i++) {
GameData.body.paintIcon(this, g, snakeX[i], snakeY[i]); //蛇的身体长度根据lenth来控制
}
//画食物
GameData.food.paintIcon(this, g, foodx, foody);
g.setColor(Color.white);
g.setFont(new Font("微软雅黑", Font.BOLD, 18));
g.drawString("长度 " + lenth, 750, 35);
g.drawString("分数 " + score, 750, 50);
//游戏提示
if (isStart == false) {
g.setColor(Color.white);
g.setFont(new Font("微软雅黑", Font.BOLD, 40));
g.drawString("按下空格开始游戏!", 300, 300);
}
//失败判断
if (isFail) {
g.setColor(Color.RED);
g.setFont(new Font("微软雅黑", Font.BOLD, 40));
g.drawString("失败, 按下空格重新开始", 200, 300);
}
}
@Override
public void keyTyped(KeyEvent e) {
}
//键盘监听事件
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode(); //获取按下的键盘
if (keyCode == KeyEvent.VK_SPACE) { //如果是空格
if (isFail) { //如果游戏失败,从头再来!
isFail = false;
init(); //重新初始化
} else { //否则,暂停游戏
isStart = !isStart;
}
repaint();
}
//键盘控制走向
if (keyCode == KeyEvent.VK_LEFT) {
fx = "L";
} else if (keyCode == KeyEvent.VK_RIGHT) {
fx = "R";
} else if (keyCode == KeyEvent.VK_UP) {
fx = "U";
} else if (keyCode == KeyEvent.VK_DOWN) {
fx = "D";
}
}
@Override
public void keyReleased(KeyEvent e) {
}
//定时执行的操作
@Override
public void actionPerformed(ActionEvent e) {
//如果游戏处于开始状态,并且没有结束,则小蛇可以移动
if (isStart && isFail == false) {
//右移:即让后一个移到前一个的位置即可 !
for (int i = lenth - 1; i > 0; i--) { //除了脑袋都往前移:身体移动
snakeX[i] = snakeX[i - 1]; //即第i节(后一节)的位置变为(i-1:前一节)节的位置!
snakeY[i] = snakeY[i - 1];
}
//通过方向控制,头部移动
if (fx.equals("R")) {
snakeX[0] = snakeX[0] + 25;
if (snakeX[0] > 850) snakeX[0] = 25;
} else if (fx.equals("L")) {
snakeX[0] = snakeX[0] - 25;
if (snakeX[0] < 25) snakeX[0] = 850;
} else if (fx.equals("U")) {
snakeY[0] = snakeY[0] - 25;
if (snakeY[0] < 75) snakeY[0] = 650;
} else if (fx.equals("D")) {
snakeY[0] = snakeY[0] + 25;
if (snakeY[0] > 650) snakeY[0] = 75;
}
//吃食物:当蛇的头和食物一样时,算吃到食物!
if (snakeX[0] == foodx && snakeY[0] == foody) {
//1.长度加一
lenth++;
//每吃一个食物,增加积分
score = score + 10;
//2.重新生成食物
foodx = 25 + 25 * random.nextInt(34);
foody = 75 + 25 * random.nextInt(24);
}
//结束判断,头和身体撞到了
for (int i = 1; i < lenth; i++) {
//如果头和身体碰撞,那就说明游戏失败
if (snakeX[i] == snakeX[0] && snakeY[i] == snakeY[0]) {
isFail = true;
}
}
repaint(); //需要不断的更新页面实现动画
}
timer.start();//让时间动起来!
}
游戏数据类
package com.duan.study.gui.snake;
import javax.swing.*;
import javax.xml.crypto.Data;
import java.awt.*;
import java.net.URL;
//数据中心
public class GameData {
//头部图片
public static URL headerURl= GameData.class.getResource("header.png");
public static ImageIcon header=new ImageIcon(headerURl);
//头部:上下左右
public static URL upUrl = GameData.class.getResource("up.png");
public static ImageIcon up = new ImageIcon(upUrl);
public static URL downUrl = GameData.class.getResource("down.png");
public static ImageIcon down = new ImageIcon(downUrl);
public static URL leftUrl = GameData.class.getResource("left.png");
public static ImageIcon left = new ImageIcon(leftUrl);
public static URL rightUrl =GameData.class.getResource("right.png");
public static ImageIcon right = new ImageIcon(rightUrl);
//身体
public static URL bodyUrl =GameData.class.getResource("body.png");
public static ImageIcon body = new ImageIcon(bodyUrl);
//食物
public static URL foodUrl =GameData.class.getResource("food.png");
public static ImageIcon food = new ImageIcon(foodUrl);
}
游戏失败
if (snakeX[i] == snakeX[0] && snakeY[i] == snakeY[0]) {
isFail = true;
}
}
repaint(); //需要不断的更新页面实现动画
}
timer.start();//让时间动起来!
}
#### 游戏数据类
~~~java
package com.duan.study.gui.snake;
import javax.swing.*;
import javax.xml.crypto.Data;
import java.awt.*;
import java.net.URL;
//数据中心
public class GameData {
//头部图片
public static URL headerURl= GameData.class.getResource("header.png");
public static ImageIcon header=new ImageIcon(headerURl);
//头部:上下左右
public static URL upUrl = GameData.class.getResource("up.png");
public static ImageIcon up = new ImageIcon(upUrl);
public static URL downUrl = GameData.class.getResource("down.png");
public static ImageIcon down = new ImageIcon(downUrl);
public static URL leftUrl = GameData.class.getResource("left.png");
public static ImageIcon left = new ImageIcon(leftUrl);
public static URL rightUrl =GameData.class.getResource("right.png");
public static ImageIcon right = new ImageIcon(rightUrl);
//身体
public static URL bodyUrl =GameData.class.getResource("body.png");
public static ImageIcon body = new ImageIcon(bodyUrl);
//食物
public static URL foodUrl =GameData.class.getResource("food.png");
public static ImageIcon food = new ImageIcon(foodUrl);
}