GUI编程
1、简介
-
Gui的核心技术:Swing、AWT
-
界面不美观
-
需要jre环境
-
-
为什么要学习?
-
可以写出自己想要的小工具
-
工作时候,也可能需要维护到swing界面
-
了解MVC架构,了解监听
-
-
(小游戏贪吃蛇代码在最底下,可直接拉到最后)
2、AWT
2.1AWT介绍
-
包含了很多类和接口! GUI:界面图形
-
元素:窗口、按钮、文本框
2.2组件和容器
1、Frame
public class TestFrame { public static void main(String[] args) { Frame frame = new Frame("java图像窗口"); //设置窗口界面大小 frame.setSize(200,200); //设置窗口可见性 frame.setVisible(true); //设置窗口初始坐标 左上角原始坐标(0,0) frame.setLocation(100,100); //设置背景颜色 frame.setBackground(new Color(191, 34, 191)); //设置窗口固定 frame.setResizable(false); } }
-
创建多个窗口,自己创建对象
public class MyFrame { public static void main(String[] args) { TestFrame1 testFrame1 = new TestFrame1(100,100,200,200,Color.blue); TestFrame1 testFrame2 = new TestFrame1(300,100,200,200,Color.yellow); TestFrame1 testFrame3 = new TestFrame1(100,300,200,200,Color.green); TestFrame1 testFrame4 = new TestFrame1(300,300,200,200,Color.darkGray); } } class TestFrame1 extends Frame{//继承Frame父类所有方法 static int id =0;//可能存在多个窗口,创建一个计数器变量 public TestFrame1(int x,int y,int w,int h,Color color){//构造一个有参构造器,让对象可以实例化 super("Myframe"+(++id));//直接调用父类方法 super() ,++id计数器,每增加一个窗口名字都不同 setBackground(color);//设置窗口颜色 setVisible(true);//设置窗口可见性 setBounds(x,y,w,h);//设置窗口大小和初始位置 setResizable(false);//设置窗口固定 } }
2、面板Panel
//Panel可以看成是一个空间,但是不能单独存在 public class TestPanel { public static void main(String[] args) { Frame frame = new Frame(); //布局的概念 Panel panel = new Panel(); //设置布局 frame.setLayout(null); //设置大小、坐标和颜色 frame.setBounds(300,300,300,300); frame.setBackground(new Color(222, 22, 22)); //设置窗口可见性 frame.setVisible(true); //panel设置坐标,相对于frame panel.setBounds(50,50,200,200); panel.setBackground(new Color(24, 220, 104)); //frame.add(panel) frame.add(panel); //关闭窗口,设定一个监听窗口关闭事件 相当于System.exit(0) frame.addWindowListener(new WindowAdapter(){ //窗口点击关闭的时候需要做得事情 @Override public void windowClosing(WindowEvent e) { //结束程序 System.exit(0); } }); } }
2.3、布局管理器
-
流式布局
public class TestFlowLayout { public static void main(String[] args) { Frame frame = new Frame(); //组件-按钮 Button button1 = new Button("button1"); Button button2 = new Button("button2"); Button button3 = new Button("button3"); //设置为流式布局 //frame.setLayout(new FlowLayout());//center居中 frame.setLayout(new FlowLayout(FlowLayout.LEFT));//靠左 frame.setSize(200,200); frame.setVisible(true); //把按钮添加进去 frame.add(button1); frame.add(button2); frame.add(button3); } }
-
东西南北中
public class TestBordeLayout { public static void main(String[] args) { Frame frame = new Frame(); frame.setVisible(true); frame.setSize(300,300); 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); } }
-
表格布局
public class TestGridLayout { public static void main(String[] args) { Frame frame = new Frame(); frame.setVisible(true); frame.setSize(300,300); 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();//自动填充,JAVA函数,可写可不写 } }
2.4、练习
public class TestLayout { public static void main(String[] args) { Frame frame = new Frame(); //创建窗口 frame.setVisible(true); frame.setSize(400,400); frame.setBackground(Color.blue); //先将窗口分为上下两部分 frame.setLayout(new GridLayout(2,1)); //再创建四个面板,总体上下两个面板,中间上下两个面板 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));//下面,构造一个两行两列的面板 //创建所需要的按钮,可优化进面板里面 Button east1 = new Button("east1"); Button east2 = new Button("east2"); Button west1 = new Button("west1"); Button west2 = new Button("west2"); Button b1 = new Button("button1"); Button b2 = new Button("button2"); Button b3 = new Button("button3"); Button b4 = new Button("button4"); Button b5 = new Button("button5"); Button b6 = new Button("button6"); //上面部分 frame.add (p1); //东边 p1.add(east1, BorderLayout.EAST); //西边 p1.add(west1, BorderLayout.WEST); p2.add(b1); p2.add(b2); p1.add(p2); //下面部分 frame.add (p3); p3.add(east2, BorderLayout.EAST); p3.add(west2, BorderLayout.WEST); p4.add(b3); p4.add(b4); p4.add(b5); p4.add(b6); p3.add(p4); } }
2.5、事件监听
public class TestActionEvent { public static void main(String[] args) { //按下按钮,触发一些事件 Frame frame = new Frame("ActionEventListener"); frame.setSize(400, 400); frame.setVisible(true); Button b1 = new Button("button"); frame.add(b1, BorderLayout.CENTER); //因为addActionListener()需要一个ActionListener,所以需要构造一个ActionListener MyActinonListener myActinonListener = new MyActinonListener();//将构造的MyActinon实例化 b1.addActionListener(myActinonListener); windowclose(frame);//调用关闭窗口方法 } //关闭窗口事件 private static void windowclose(Frame frame){ frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } } //事件监听 class MyActinonListener implements ActionListener{//接口实现类,必须重写方法 @Override public void actionPerformed(ActionEvent e) { System.out.println("aaa");; } }
-
多个按钮实现一个监听事件
public class TestActionEvent02 { public static void main(String[] args) { Frame frame = new Frame(); frame.setSize(400,400); frame.setVisible(true); windowclose(frame); //多个按钮实现一个监听事件 Button b1 = new Button("button1"); Button b2 = new Button("button2"); frame.add(b1,BorderLayout.NORTH); frame.add(b2,BorderLayout.SOUTH); MyActionListener myActionListener = new MyActionListener(); b1.addActionListener(myActionListener); b2.addActionListener(myActionListener); //可以显示的定义触发会返回的命令,如果不显示定义,则会走默认值 b1输出button1,b2输出stop b2.setActionCommand("stop"); } //窗口关闭事件 private static void windowclose(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) { //e.getActionCommand()获得按钮信息 System.out.println("按钮被点击了=>"+e.getActionCommand()); } }
2.6、输入框TextField监听
public class TestTextEvent { public static void main(String[] args) { //只管启动 new Myframe(); } } class Myframe extends Frame { public Myframe(){ setVisible(true); setSize(400,400); TextField textField = new TextField(); add(textField); //监听这个文本框输入的文字 MyActionListener3 myActionListener3 = new MyActionListener3(); //按下enter 就会触发这个输入框的事件 textField.addActionListener(myActionListener3); //设置替换编码 textField.setEchoChar('*');//将输入的文本替换成*,加密 } } class MyActionListener3 implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { //e.getSource()默认是Object,所以需要TextField强制转换 高转低 TextField field = (TextField) e.getSource();//获得一些资源,返回一个对象 System.out.println(field.getText());//获得输入框文本 field.setText("");//null,输入enter自动清空输入框 } }
2.7、简易计算器、组合和内部类
-
初始代码
public class TestCaculator { public static void main(String[] args) { new MyCaculator(); } } //计算器类 class MyCaculator extends Frame { public MyCaculator(){//无参构造 setVisible(true); pack();//自适应调整布局 //3个文本框 TextField num1 = new TextField(10);//10代表字符数,文本框长度 TextField num2 = new TextField(10); TextField num3 = new TextField(20); //1个按钮 Button button = new Button("="); //监听按钮事件 button.addActionListener(new MyActionListenter(num1,num2,num3)); //1个标签 Label label = new Label("+"); setLayout(new FlowLayout()); add(num1); add(label); add(num2); add(button); add(num3); } } //监听类 class MyActionListenter implements ActionListener{ //获取三个变量 private TextField num1,num2,num3; public MyActionListenter(TextField num1,TextField num2,TextField num3) { this.num1 =num1; this.num2 =num2; this.num3 =num3; } @Override public void actionPerformed(ActionEvent e) { //1、获得加数和被加数 int a = Integer.parseInt(num1.getText());//强制转换变量类型进行运算 int b = Integer.parseInt(num2.getText()); //2、运行加法运算并获取值 num3.setText(""+(a+b)); //3、按下等号后,清空第一和第二个文本框值 num1.setText(""); num2.setText(""); } }
-
优化代码1:组合方法(完全面向对象)
public class TestCaculator { public static void main(String[] args) { MyCaculator myCaculator = new MyCaculator(); myCaculator.method(); } } //计算器类 class MyCaculator extends Frame { //属性 TextField num1,num2,num3; //方法 public void method(){ setVisible(true); pack();//自适应调整布局 //3个文本框 num1 = new TextField(10);//10代表字符数,文本框长度 num2 = new TextField(10); num3 = new TextField(20); //1个按钮 Button button = new Button("="); //监听按钮事件 button.addActionListener(new MyActionListenter(this)); //1个标签 Label label = new Label("+"); setLayout(new FlowLayout()); add(num1); add(label); add(num2); add(button); add(num3); } } //监听类 class MyActionListenter implements ActionListener{ //获取计算器的对象,在一个类中组合另外一个类 MyCaculator myCaculator = null ; public MyActionListenter(MyCaculator myCaculator) { this.myCaculator = myCaculator; } @Override public void actionPerformed(ActionEvent e) { //1、获得加数和被加数 int a = Integer.parseInt(myCaculator.num1.getText());//强制转换变量类型进行运算 int b = Integer.parseInt(myCaculator.num2.getText()); //2、运行加法运算并获取值 myCaculator.num3.setText(""+(a+b)); //3、按下等号后,清空第一和第二个文本框值 myCaculator.num1.setText(""); myCaculator.num2.setText(""); } }
-
优化代码2:内部类:重点掌握(更简洁易懂)
public class TestCaculator { public static void main(String[] args) { MyCaculator myCaculator = new MyCaculator(); myCaculator.method(); } } //计算器类 class MyCaculator extends Frame { //属性 TextField num1,num2,num3; //方法 public void method(){ setVisible(true); pack();//自适应调整布局 //3个文本框 num1 = new TextField(10);//10代表字符数,文本框长度 num2 = new TextField(10); num3 = new TextField(20); //1个按钮 Button button = new Button("="); //监听按钮事件 button.addActionListener(new MyActionListenter()); //1个标签 Label label = new Label("+"); setLayout(new FlowLayout()); add(num1); add(label); add(num2); add(button); add(num3); } //监听类 内部类,可直接获取外部类属性和方法 private class MyActionListenter implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { //1、获得加数和被加数 int a = Integer.parseInt(num1.getText());//强制转换变量类型进行运算 int b = Integer.parseInt(num2.getText()); //2、运行加法运算并获取值 num3.setText(""+(a+b)); //3、按下等号后,清空第一和第二个文本框值 num1.setText(""); num2.setText(""); } } }
2.8、画笔Paint
public class TestPaint { public static void main(String[] args) { new MyPaint().method(); } } class MyPaint extends Frame{ public void method(){ setVisible(true); setBounds(200,200,600,400); } //画笔 @Override public void paint(Graphics g) { //画笔颜色,用完还原到初始颜色 g.setColor(Color.blue); g.drawOval(100,100,100,100);// 画圆 g.setColor(Color.cyan); g.fillRect(200,200,100,50);//实心长方形 } }
2.9、鼠标事件
实现:鼠标点击画笔画点
//鼠标点击画笔画点 public class TestMouseEvent { public static void main(String[] args) { new MyMouse(); } } class MyMouse extends Frame { //创建一个点 ArrayList points; public MyMouse() { setVisible(true); setBounds(100, 100, 400, 400); //存放点的集合 points=new ArrayList<>(); //鼠标监听器 addMouseListener(new MyMouseListener()); } //画笔 @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); } //监听鼠标事件 private 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.10、窗口事件
public class TestWindows { public static void main(String[] args) { new MyWindows(); } } class MyWindows extends Frame { public MyWindows() { setVisible(true); setSize(500, 500); //addWindowListener(new MyWindowsListenter()); addWindowListener(new WindowAdapter() { //匿名内部类 @Override public void windowClosing(WindowEvent e) { System.out.println("关闭窗口"); System.exit(0); } @Override public void windowActivated(WindowEvent e) { System.out.println("激活窗口"); } }); } } // 与匿名内部类效果相同 // class MyWindowsListenter extends WindowAdapter{ // @Override // public void windowClosing(WindowEvent e) { // // System.out.println("关闭窗口"); // System.exit(0); // //setVisible(false);通过按钮隐藏窗口 // } // // @Override // public void windowActivated(WindowEvent e) { // System.out.println("激活窗口"); // } // }
2.11、键盘事件
public class TestKey { public static void main(String[] args) { new MyKey(); } } class MyKey extends Frame{ public MyKey() { setVisible(true); setSize(400,400); addKeyListener(new KeyAdapter() { //重写键按压方法 @Override public void keyPressed(KeyEvent e) { //获取键盘的码 int i = e.getKeyCode(); System.out.println(i); if (i == KeyEvent.VK_UP){ System.out.println("你按了上键"); } } }); } }
3、Swing
3.1、窗口和面板
public class JFrameDemo { public static void main(String[] args) { new JFrameDemo().init(); } //初始化 public void init(){ //顶级窗口 JFrame jf = new JFrame(); jf.setTitle("JFrame"); jf.setVisible(true); jf.setBounds(100,100,300,300); //jf.setBackground(Color.cyan);无法显示背景颜色 //关闭窗口事件 jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //设置文本label JLabel label = new JLabel("这是一个测试"); jf.add(label); //设置文本水平对齐 label.setHorizontalAlignment(SwingConstants.CENTER); //获得一个容器,显示背景颜色 Container container = jf.getContentPane(); container.setBackground(Color.blue); } }
3.2、弹窗JDialog
public class JDialogDemo { public static void main(String[] args) { new JDialogDemo().init(); } public void init(){ JFrame jf = new JFrame(); jf.setVisible(true); jf.setBounds(100,100,500,500); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //容器,放东西 Container container = jf.getContentPane(); //绝对布局 container.setLayout(null); //设置按钮大小和文字 JButton jButton = new JButton("点击弹窗"); jButton.setBounds(40,40,100,50); container.add(jButton); //点击这个按钮时,弹出一个弹窗 jButton.addActionListener(new ActionListener() {//监听按钮事件 @Override public void actionPerformed(ActionEvent e) { //弹窗 new MyJDialog(); } }); } } class MyJDialog extends JDialog{ public MyJDialog() { this.setVisible(true); this.setBounds(200,200,300,300); //设置弹窗容器 Container container = this.getContentPane(); container.setLayout(null); container.setBackground(Color.cyan); //设置弹窗文本标签 JLabel label = new JLabel("弹窗事件"); label.setBounds(100,100,100,60); container.add(label); } }
3.3、标签
-
圆形图标标签
public class IconDemo extends JFrame implements Icon { private int height; private int width; public static void main(String[] args) { new IconDemo().init(); } public void init(){ //窗口基本设置 this.setVisible(true); this.setBounds(200,200,500,500); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //设置容器 Container container = this.getContentPane(); IconDemo iconDemo = new IconDemo(100,100);//将图标大小变量传递进去 //设置图标标签 JLabel label = new JLabel("IconTest", iconDemo, SwingConstants.CENTER); //将图标标签存放容器 container.add(label); } public IconDemo() { } //有参构造,传递大小 public IconDemo(int height, int width) { this.height = height; this.width = width; } //重写Icon方法,获取图标的位置和从有参构造获取大小变量 @Override public void paintIcon(Component c, Graphics g, int x, int y) { g.fillOval(x,y,width,height);//画一个圆形图标 } @Override public int getIconWidth() { return width; } @Override public int getIconHeight() { return height; } }
-
图片标签
public class ImageIconDemo extends JFrame { public static void main(String[] args) { new ImageIconDemo(); } public ImageIconDemo() { setVisible(true); setBounds(200,200,500,500); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //获取图片地址 JLabel label = new JLabel(); URL url = ImageIconDemo.class.getResource("test.png"); ImageIcon icon = new ImageIcon(url); label.setIcon(icon); label.setHorizontalAlignment(SwingConstants.CENTER); Container container = getContentPane(); container.add(label); } }
3.4、面板
-
JPanel
public class JPanelDemo extends JFrame { public static void main(String[] args) { new JPanelDemo(); } public JPanelDemo() { setVisible(true); setBounds(100,100,400,400); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //设置面板布局 JPanel jPanel = new JPanel(new GridLayout(1,3)); JPanel jPanel1 = new JPanel(new GridLayout(2,1)); JPanel jPanel2 = new JPanel(new GridLayout(3,1)); JPanel jPanel3 = new JPanel(new GridLayout(3,2)); //将按钮添加到面板上 jPanel.add(new JButton("1")); jPanel.add(new JButton("1")); jPanel.add(new JButton("1")); jPanel1.add(new JButton("2")); jPanel1.add(new JButton("2")); jPanel2.add(new JButton("3")); jPanel2.add(new JButton("3")); jPanel2.add(new JButton("3")); jPanel3.add(new JButton("4")); jPanel3.add(new JButton("4")); jPanel3.add(new JButton("4")); jPanel3.add(new JButton("4")); jPanel3.add(new JButton("4")); jPanel3.add(new JButton("4")); //设置容器布局 Container container = getContentPane(); container.setLayout(new GridLayout(2,1,10,10)); //将面板添加到容器里 container.add(jPanel); container.add(jPanel1); container.add(jPanel2); container.add(jPanel3); } }
-
JScroll滑动窗
public class JScrollDemo extends JFrame { public static void main(String[] args) { new JScrollDemo(); } public JScrollDemo(){ setVisible(true); setBounds(100,100,300,350); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //设置文本域 TextArea textArea = new TextArea(20, 50); textArea.setText("输入数据"); //Scroll面板 JScrollPane jScrollPane = new JScrollPane(textArea); Container container = getContentPane(); container.add(jScrollPane); } }
3.5、按钮
-
图片按钮
public class JButtonDemo extends JFrame { public static void main(String[] args) { new JButtonDemo(); } public JButtonDemo() { setVisible(true); setBounds(200,200,500,500); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //获取图片地址 URL url = JButtonDemo.class.getResource("test.png"); ImageIcon icon = new ImageIcon(url); //将图片地址添加到按钮上 JButton jButton = new JButton(icon); Container container = getContentPane(); container.add(jButton); } }
-
单选框JRadioButton,分组ButtonGroup
public class JButtonDemo02 extends JFrame { public static void main(String[] args) { new JButtonDemo02(); } public JButtonDemo02() { setVisible(true); setBounds(200,200,300,300); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //单选框JRadioButton JRadioButton jRadioButton1 = new JRadioButton("jRadioButton1"); JRadioButton jRadioButton2 = new JRadioButton("jRadioButton2"); JRadioButton jRadioButton3 = new JRadioButton("jRadioButton3"); //单选只能选择一个,将所有选择添加到一个分组下面,且只能选一个 ButtonGroup group = new ButtonGroup(); group.add(jRadioButton1); group.add(jRadioButton2); group.add(jRadioButton3); //添加单选按钮,并设置位置 Container container = getContentPane(); container.add(jRadioButton1,BorderLayout.NORTH); container.add(jRadioButton2,BorderLayout.CENTER); container.add(jRadioButton3,BorderLayout.SOUTH); } }
-
多选框JCheckBox
public class JButtonDemo03 extends JFrame { public static void main(String[] args) { new JButtonDemo03(); } public JButtonDemo03(){ setVisible(true); setBounds(200,200,400,400); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //多选框JCheckBox 不用分组 JCheckBox box1 = new JCheckBox("box1"); JCheckBox box2 = new JCheckBox("box2"); JCheckBox box3 = new JCheckBox("box3"); Container container = getContentPane(); container.add(box1,BorderLayout.NORTH); container.add(box2,BorderLayout.CENTER); container.add(box3,BorderLayout.SOUTH); } }
3.6、列表
-
下拉框JComboBox、添加选项addItem
public class ComboBoxDemo01 extends JFrame { public static void main(String[] args) { new ComboBoxDemo01(); } public ComboBoxDemo01(){ setVisible(true); setBounds(200,200,300,300); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JComboBox comboBox = new JComboBox(); comboBox.addItem("null"); comboBox.addItem("正在热映"); comboBox.addItem("已下架"); comboBox.addItem("即将上映"); Container container = getContentPane(); container.add(comboBox); } }
-
列表JList,动态扩容
public class ComboBoxDemo02 extends JFrame { public static void main(String[] args) { new ComboBoxDemo02(); } public ComboBoxDemo02(){ setVisible(true); setBounds(200,200,100,100); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //生成一个数组内容 //String [] contains = {"1","2","3"}; Vector contains =new Vector(); contains.add("张三"); contains.add("李四"); contains.add("王五"); //将数组内容放入列表中 JList list = new JList(contains); Container container = getContentPane(); container.add(list); } }
3.7、文本框
-
文本框JTextField
public class TextDemo01 extends JFrame { public static void main(String[] args) { new TextDemo01(); } public TextDemo01() { setVisible(true); setBounds(200,200,200,200); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //文本框 JTextField textField = new JTextField("好好学习"); JTextField textField1 = new JTextField("天天向上"); Container container = getContentPane(); container.add(textField,BorderLayout.NORTH); container.add(textField1,BorderLayout.SOUTH); } }
-
密码框JPasswordField
public class TextDemo02 extends JFrame { public static void main(String[] args) { new TextDemo02(); } public TextDemo02() { setVisible(true); setBounds(200,200,200,200); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //密码框 JPasswordField jPasswordField = new JPasswordField(); jPasswordField.setEchoChar('*'); Container container = getContentPane(); container.add(jPasswordField); } }
-
文本域TextArea
public class JScrollDemo extends JFrame { public static void main(String[] args) { new JScrollDemo(); } public JScrollDemo(){ setVisible(true); setBounds(100,100,300,350); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //设置文本域 TextArea textArea = new TextArea(20, 50); textArea.setText("输入数据"); //Scroll面板 JScrollPane jScrollPane = new JScrollPane(textArea); Container container = getContentPane(); container.add(jScrollPane); } }
4、小游戏:贪吃蛇
-
分为三部分:主程序(摆放顺序很重要)、面板、图片导入(注意素材路径)
-
所有效果都在面板上实现(JPanel),在面板上画出来,广告栏、蛇的身体、食物、积分(画笔Panint)
-
监听键盘事件(KeyListener)
-
让蛇动起来(定时器Timer)
import javax.swing.*; //主程序,启动 public class StartGame { public static void main(String[] args) { JFrame frame = new JFrame("贪吃蛇小游戏");//设置游戏窗口标题 frame.setBounds(10,10,900,720);//设置窗口位置和大小 frame.setResizable(false);//固定窗口,不可拉伸 frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗口关闭事件 frame.add(new PanelGame());//添加面板 frame.setVisible(true);//设置窗口可见性,放在最后 } }
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 PanelGame extends JPanel implements KeyListener,ActionListener{ int[] snakeX = new int[600];//定义蛇的X坐标 int[] snakeY = new int[500];//定义蛇的Y坐标 String direction;//定义蛇头的方向 int length;//定义蛇的长度 boolean isStart = false;//定义游戏是否开始 Timer timer = new Timer(100,this);//定时器,帧概念:数值越小,帧数越多;画面更快 int foodX;int foodY;//定义食物坐标 Random random = new Random();//实例一个随机对象 int score;//定义积分 boolean isFail = false;//定义游戏是否失败 //构造器 public PanelGame() { init();//游戏初始化 this.setFocusable(true);//聚焦在游戏界面上 this.addKeyListener(this);//获取键盘监听事件 } //初始化方法 public void init() { //初始化蛇的坐标,以25为一格 snakeX[0] = 100; snakeY[0] = 100;//蛇头 snakeX[1] = 75; snakeY[1] = 100;//蛇的第一节身体 snakeX[2] = 50; snakeY[2] = 100;//蛇的第二节身体 length = 3;//初始化蛇的长度 direction = "R";//初始化蛇头方向 //初始化食物坐标 foodX=25+25*random.nextInt(33); foodY=75+25*random.nextInt(23); score=0;//初始化积分 timer.start();//启动定时器 } //画笔,将所有图案在面板上画出来 @Override protected void paintComponent(Graphics g) { super.paintComponent(g);//清屏 this.setBackground(Color.white);//背景颜色 Data.header.paintIcon(this, g, 25, 11);//将广告栏画在面板上 g.fillRect(25, 75, 850, 600);//画一个实心长方形 //画出蛇头方向 if (direction.equals( "R")) { Data.right.paintIcon(this, g, snakeX[0], snakeY[0]); } else if (direction.equals("L")) { Data.left.paintIcon(this, g, snakeX[0], snakeY[0]); } else if (direction.equals("U")) { Data.up.paintIcon(this, g, snakeX[0], snakeY[0]); } else if (direction.equals("D")) { Data.down.paintIcon(this, g, snakeX[0], snakeY[0]); } //画出蛇的身体 for (int i = 1; i < length; i++) { Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);//蛇的身体通过length控制 } //画食物 Data.food.paintIcon(this,g,foodX,foodY); //画积分和蛇的长度 g.setColor(Color.black);//设置文字颜色 g.setFont(new Font("微软雅黑",Font.BOLD,20));//设置文字大小 g.drawString("长度:"+length,750,35); g.drawString("积分:"+score,750,55); //设置停止游戏的文字 if (isStart == false) { g.setColor(Color.white);//设置文字颜色 g.setFont(new Font("微软雅黑", Font.BOLD, 40));//设置文字大小 g.drawString("按下空格键开始游戏", 300, 300); } //设置游戏失败的文字 if (isFail == true){ g.setColor(Color.white);//设置文字颜色 g.setFont(new Font("微软雅黑", Font.BOLD, 40));//设置文字大小 g.drawString("游戏失败,按空格键重新游戏", 200, 300); } } //监听键盘输入 @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_RIGHT){ if (direction.equals("L")==false){ direction="R"; } } //蛇头向左的时候,不能向右 else if (keyCode == KeyEvent.VK_LEFT){ if (direction.equals("R")==false){ direction="L"; } } //蛇头向上的时候,不能向下 else if (keyCode == KeyEvent.VK_UP){ if (direction.equals("D")==false){ direction="U"; } } //蛇头向下的时候,不能向上 else if (keyCode == KeyEvent.VK_DOWN){ if (direction.equals("U")==false){ direction="D"; } } } //定时器,让蛇动起来 @Override public void actionPerformed(ActionEvent e) { //判断游戏开始并且没有失败 if (isStart==true && isFail==false) { //身体移动 for (int i = length-1; i >0; i--) { snakeX[i] = snakeX[i-1]; snakeY[i] = snakeY[i-1]; } //头部移动 if (direction.equals("R")) { snakeX[0] = snakeX[0] + 25; if (snakeX[0] > 850) {snakeX[0] = 25;}//判断边界条件 } else if (direction.equals("L")) { snakeX[0] = snakeX[0] - 25; if (snakeX[0] < 25) {snakeX[0] = 850;}//判断边界条件 } else if (direction.equals("U")) { snakeY[0] = snakeY[0] - 25; if (snakeY[0] < 75) {snakeY[0] = 650;}//判断边界条件 } else if (direction.equals("D")) { snakeY[0] = snakeY[0] + 25; if (snakeY[0] > 650) {snakeY[0] = 75;}//判断边界条件 } //判断吃到食物 if(snakeX[0]==foodX && snakeY[0]==foodY){ length++;//长度+1 score+=10;//积分加10 //重新画食物坐标,等于吃到食物,食物消失 foodX=25+25*random.nextInt(33); foodY=75+25*random.nextInt(23); } //判断失败条件,蛇头碰到身体就失败 for (int i = 1; i <length ; i++) { if (snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){ isFail=true; } } repaint();//刷新界面 } timer.start();//定时器启动 } @Override public void keyReleased(KeyEvent e) {} @Override public void keyTyped(KeyEvent e) {} }
import javax.swing.*; import java.net.URL; //图片素材导入,素材放到同级目录下 public class Data { //广告栏 public static URL urlheader =Data.class.getResource("static/header.png"); public static ImageIcon header = new ImageIcon(urlheader); //蛇的头部和身体 public static URL urlright =Data.class.getResource("static/right.png"); public static ImageIcon right = new ImageIcon(urlright); public static URL urlleft =Data.class.getResource("static/left.png"); public static ImageIcon left = new ImageIcon(urlleft); public static URL urlup =Data.class.getResource("static/up.png"); public static ImageIcon up = new ImageIcon(urlup); public static URL urldown =Data.class.getResource("static/down.png"); public static ImageIcon down = new ImageIcon(urldown); public static URL urlbody =Data.class.getResource("static/body.png"); public static ImageIcon body = new ImageIcon(urlbody); //食物 public static URL urlfood =Data.class.getResource("static/food.png"); public static ImageIcon food = new ImageIcon(urlfood); }