【JAVA】组件及事件处理-1(JavaSwing学习笔记)

【JAVA】组件及事件处理-1(java Swing相关学习笔记)

简单记录一下java可视化的简单敲的代码。

建立窗口

import javax.swing.*;
import java.awt.*;

public class HelloworldGUi{

    public static void main(String[] args){ 
        JFrame frame  =new JFrame("hello world");//创建一个标题为“hello world”的窗口;
        frame.setLocation(300,300);//位置
        frame.setSize(100,100);//初始大小
        frame.setVisible(true);//能否调整窗口大小
        frame.setVisible(true);//是否显示
        JButton button = new JButton("come back to sky...");//创建按钮
        button.setSize(30,30);//设置按钮大小
        //button.setPreferredSize(new Dimension(30,30));初始为30*30像素点,如果按钮文本内容太长则适应文本
        Container container = frame.getContentPane();//用Frame的getContentPane方法实例化一个Container类型的对象来
        container.add(button);//向对象添加按钮
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
}

用到了javax.swing的JFrame类方法

  • Java提供的JFrame类的实例是一个底层容器,即通常所称的窗口。其他组件必须被添加到底层容器中,以便借助这个地层容器和操作系统进行信息交互。
  • JFrame类是Container类的间接子类。当需要一个窗口时,可使用JFrame或其子类创建一个对象。

JFrame常用方法

JFrame构造方法:

JFrame() 创建一个无标题的窗口。 JFrame(String s) 创建标题为s的窗口。

常用方法:
  • 1**)public void setBounds(int a,int b,int width,int height** 设置窗口的初始位置是(a,b),即距屏幕左面a个像素、距屏幕上方b个像素;窗口的宽是width,高是height。

  • 2**)public void setSize(int width,int height)** 设置窗口的大小。

  • 3)public void setLocation(int x,int y) 设置窗口的位置,默认位置是(0,0)。

  • 4)public void setVisible(boolean b) 设置窗口是否可见,窗口默认是不可见的。

  • 5)public void setResizable(boolean b) 设置窗口是否可调整大小,默认可调整大小。

  • 6)public void dispose() 撤消当前窗口,并释放当前窗口所使用的资源

  • 7)public void setExtendedState(int state) 设置窗口的扩展状态.

  • 8)public void setDefaultCloseOperation(int operation) 该方法用来设置单击窗体右上角的关闭图标后,程序会做出怎样的处理。如:EXIT_ON_CLOSE

  • 9)public void setLayout(LayoutManager mgr) 设置此容器的布局管理器。

  • 10)public Component add(Component comp) 将指定组件追加到此容器的尾部。

  • 11**)public void setMenuBar(MenuBar mb)** 将此 frame 的菜单栏设置为指定的菜单栏。

  • 12)public void validate() 使用 validate 方法会使容器再次布置其子组件。在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。

菜单

接着,一个window怎么能没有菜单呢,仿照他们的一般形式,尝试还原一个。

  • 1.菜单条 :

    JComponent类的子类JMenubar负责创建菜单条,JFrame类有一个将菜单条放置到窗口中的方法:setJMenuBar(JMenuBar bar);该方法将菜单条添加到窗口的顶端。

    菜单条JMenuBar类构造方法:JMenuBar(); JMenuBar Mbar=new JMenuBar()

  • 2.菜单:

    JComponent类的子类JMenu负责创建菜单。

    菜单JMenu类构造方法:JMenu() ; JMenu(String s) ; JMenu m=new JMenu();

    常用方法:

    public void add(JMenuItem item) 向菜单增加由参数item指定的菜单项

    public JMenuItem getItem(int n) 得到指定索引处的菜单选项。

    public int getItemCount() 得到菜单选项的数目。

  • 3.菜单项 :

    JComponent类的子类JMenuItem负责创建菜单项,JMenuItem类的主要方法有以下几种:

    JMenuItem(String s) 构造有标题的菜单项。 JMenuItem(String text, Icon icon) 构造有标题和图标的菜单项

    **public void setAccelerator(KeyStroke keyStroke)**为菜单项设置快捷

我补充了一个具体的窗口菜单,可以参考注释。(对按钮也有了更多说明,还是看代码具体)。

import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

public class HelloworldGUi{

    public static void main(String[] args){          
        JFrame frame  =new JFrame("hello world");//创建一个标题为“hello world”的窗口;
        frame.setLocation(500,500);//位置
        frame.setSize(1000,1000);//初始大小
        frame.setVisible(true);//能否调整窗口大小
        frame.setVisible(true);//是否显示

        JButton button = new JButton("come back to sky...");//创建按钮
        button.setSize(300,300);//设置按钮大小
        button.setFont(new Font("Arial",Font.BOLD,24));//设置字体样式和大小
        button.setLocation(500,500);//设置按键位置
        //button.setPreferredSize(new Dimension(30,30));初始为30*30像素点,如果按钮文本内容太长则适应文本
        Container container = frame.getContentPane();//用Frame的getContentPane方法实例化一个Container类型的对象来
        container.add(button);//向对象添加按钮

        JMenuBar menuBar = new JMenuBar();//创建一个菜单栏

        JMenu filemenu = new JMenu("File");//船舰一个名为”File“的菜单
        menuBar.add(filemenu);//将菜单添加到菜单栏

        filemenu.add("New");//加菜单项
        filemenu.add(("Open"));
        filemenu.addSeparator();//加分割线
        //设置子菜单项
        JMenu saveMenu = new JMenu("Save");
        saveMenu.add("Save");
        saveMenu.add(("Save As"));
        filemenu.add(saveMenu);

        JMenu editmenu = new JMenu("Edit");
        menuBar.add(editmenu);
        //这组展示一下另一种添加菜单项的方式,以及如何添加图标,我们更提倡这种方式
        JMenuItem Cut = new JMenuItem("Cut");//创建菜单条目
        JMenuItem Copy = new JMenuItem("Copy");
        JMenuItem Paste = new JMenuItem("Paste");
        JMenuItem Delete = new JMenuItem("Delete");

        Cut.setIcon(new ImageIcon("路径"));//为Cut条目添加图标

        Cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_DOWN_MASK));//KeyStroke类的getKeyStroke需要键位和修饰符两个参数
        Copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_DOWN_MASK));
        Paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_DOWN_MASK));
        Delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));//无需修饰符,参数为0

        editmenu.add(Cut);
        editmenu.add(Copy);
        editmenu.addSeparator();
        editmenu.add(Paste);
        editmenu.add(Delete);

        frame.setJMenuBar(menuBar);//将菜单设置到窗口

        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
}

在IDEA上运行如图:

菜单

布局

我需要玩一会FSR。

这里有三种布局

  • 流水布局
  • 网格布局
  • 边界布局

FlowLayout、GridLayout和BorderLayout是常用的布局管理器,它们的参数含义如下:

FlowLayout

FlowLayout是一个流式布局管理器,它会按照添加组件的顺序,自动换行排列组件。FlowLayout的构造方法如下:

FlowLayout(int align, int hgap, int vgap)
  • align:指定组件在容器中的对齐方式,可以取以下值:
    • FlowLayout.LEFT:左对齐(默认值)
    • FlowLayout.CENTER:居中对齐
    • FlowLayout.RIGHT:右对齐
  • hgap:指定组件之间的水平间距(默认值为5)
  • vgap:指定组件之间的垂直间距(默认值为5)

GridLayout

GridLayout是一个网格布局管理器,它会将容器分成若干行若干列的网格,每个网格只能放置一个组件。GridLayout的构造方法如下:

GridLayout(int rows, int cols, int hgap, int vgap)
  • rows:指定网格的行数
  • cols:指定网格的列数
  • hgap:指定组件之间的水平间距(默认值为0)
  • vgap:指定组件之间的垂直间距(默认值为0)

BorderLayout

BorderLayout是一个边框布局管理器,它将容器分成5个区域:北、南、东、西、中。每个区域只能放置一个组件。BorderLayout的构造方法如下:

BorderLayout(int hgap, int vgap)
  • hgap:指定组件之间的水平间距(默认值为0)
  • vgap:指定组件之间的垂直间距(默认值为0)

以上是三种常用布局管理器的参数含义。

流水布局

我处理了一下代码使得更模块化。

import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

public class HelloworldGUi{

    public  static void main(String[] args){                         
        MyFrame frame = new MyFrame();
    }

    static class MyFrame extends JFrame{
        JButton[] buttons = new JButton[10];

        MyFrame() {
            JFrame frame = new JFrame("hello world");//创建一个标题为“hello world”的窗口;
            frame.setLocation(500, 500);//位置
            frame.setSize(1000, 1000);//初始大小
            frame.setVisible(true);//能否调整窗口大小
            frame.setVisible(true);//是否显示
/*
            JButton button = new JButton("come back to sky...");//创建按钮
            button.setSize(300, 300);//设置按钮大小
            button.setFont(new Font("Arial", Font.BOLD, 24));//设置字体样式和大小
            button.setLocation(500, 500);//设置按键位置
            //button.setPreferredSize(new Dimension(30,30));初始为30*30像素点,如果按钮文本内容太长则适应文本
            Container container = frame.getContentPane();//用Frame的getContentPane方法实例化一个Container类型的对象来
            container.add(button);//向对象添加按钮


 */
        //按钮部分
            Container container = frame.getContentPane();
            FlowLayout f = new FlowLayout(FlowLayout.CENTER,150,150);//设置流水布局参数,实例化一个FlowLayout类的FlowLayout类型的对象,来设置参数
            container.setLayout(f);//利用setLayout方法设置流水布局
            for(int i = 0;i < buttons.length;i++) {
                buttons[i] = new JButton("Button"+i);
                buttons[i].setFont(new Font("Arail", Font.BOLD, 24));
                container.add(buttons[i]);
            }



            //菜单部分
            JMenuBar menuBar = new JMenuBar();//创建一个菜单栏

            JMenu filemenu = new JMenu("File");//船舰一个名为”File“的菜单
            menuBar.add(filemenu);//将菜单添加到菜单栏

            filemenu.add("New");//加菜单项
            filemenu.add(("Open"));
            filemenu.addSeparator();//加分割线
            //设置子菜单项
            JMenu saveMenu = new JMenu("Save");
            saveMenu.add("Save");
            saveMenu.add(("Save As"));
            filemenu.add(saveMenu);

            JMenu editmenu = new JMenu("Edit");
            menuBar.add(editmenu);
            //这组展示一下另一种添加菜单项的方式,以及如何添加图标,我们更提倡这种方式
            JMenuItem Cut = new JMenuItem("Cut");//创建菜单条目
            JMenuItem Copy = new JMenuItem("Copy");
            JMenuItem Paste = new JMenuItem("Paste");
            JMenuItem Delete = new JMenuItem("Delete");

            Cut.setIcon(new ImageIcon("C:\\Users\\唐浩钏\\document\\python\\avator(1).png"));//为Cut条目添加图标

            Cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_DOWN_MASK));//KeyStroke类的getKeyStroke需要键位和修饰符两个参数
            Copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK));
            Paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_DOWN_MASK));
            Delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));//无需修饰符,参数为0

            editmenu.add(Cut);
            editmenu.add(Copy);
            editmenu.addSeparator();
            editmenu.add(Paste);
            editmenu.add(Delete);

            frame.setJMenuBar(menuBar);//将菜单设置到窗口

            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        }
    }
}

流水布局

网格布局

其他部分没有动,所以只提供按钮这里的代码,和流水布局很类似。

            //按钮部分
            Container container = frame.getContentPane();
            /*FlowLayout f = new FlowLayout(FlowLayout.CENTER,150,150);//设置流水布局参数,实例化一个FlowLayout类的FlowLayout类型的对象,来设置参数
            container.setLayout(f);//利用setLayout方法设置流水布局*/
            GridLayout g = new GridLayout(3,4,10,10);  
            container.setLayout(g);
            for(int i = 0;i < buttons.length;i++) {
                buttons[i] = new JButton("Button"+i);
                buttons[i].setFont(new Font("Arail", Font.BOLD, 24));
                container.add(buttons[i]);
            }

这是显示效果:
网格布局

边界布局

注意只能用五个按钮,并且在使用add方法时要补充参数BorderLayout.EAST(SOUTH,NORTH,CENTER等),中间的按钮大小会自己填充。

import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

public class HelloworldGUi{

    public  static void main(String[] args){           
        MyFrame frame = new MyFrame();
    }

    static class MyFrame extends JFrame{
        JButton[] buttons = new JButton[10];

        MyFrame() {
            JFrame frame = new JFrame("hello world");//创建一个标题为“hello world”的窗口; 
            frame.setLocation(500, 500);//位置
            frame.setSize(1000, 1000);//初始大小 
            frame.setVisible(true);//能否调整窗口大小
            frame.setVisible(true);//是否显示
/*
            JButton button = new JButton("come back to sky...");//创建按钮 
            button.setSize(300, 300);//设置按钮大小
            button.setFont(new Font("Arial", Font.BOLD, 24));//设置字体样式和大小
            button.setLocation(500, 500);//设置按键位置
            //button.setPreferredSize(new Dimension(30,30));初始为30*30像素点,如果按钮文本内容太长则适应文本
            Container container = frame.getContentPane();//用Frame的getContentPane方法实例化一个Container类型的对象来
            container.add(button);//向对象添加按钮


 */
            //按钮部分
            Container container = frame.getContentPane();
            /*FlowLayout f = new FlowLayout(FlowLayout.CENTER,150,150);//设置流水布局参数,实例化一个FlowLayout类的FlowLayout类型的对象,来设置参数
            container.setLayout(f);//利用setLayout方法设置流水布局*/
            /*GridLayout g = new GridLayout(3,4,10,10); 
            container.setLayout(g);//网格布局*/ 
            BorderLayout b = new BorderLayout(30,30); 
            container.setLayout(b);//边界布局 

            container.add(new JButton("东面"),BorderLayout.EAST);
            container.add(new JButton("南面"),BorderLayout.SOUTH); 
            container.add(new JButton("西面"),BorderLayout.WEST); 
            container.add(new JButton("北面"),BorderLayout.NORTH);
            container.add(new JButton("中间"),BorderLayout.CENTER);
            /*for(int i = 0;i < buttons.length;i++) { 
                buttons[i] = new JButton("Button"+i); 
                buttons[i].setFont(new Font("Arail", Font.BOLD, 24));
                container.add(buttons[i]);*/ 



            //菜单部分
            JMenuBar menuBar = new JMenuBar();//创建一个菜单栏

            JMenu filemenu = new JMenu("File");//船舰一个名为”File“的菜单
            menuBar.add(filemenu);//将菜单添加到菜单栏

            filemenu.add("New");//加菜单项
            filemenu.add(("Open"));
            filemenu.addSeparator();//加分割线 
            //设置子菜单项
            JMenu saveMenu = new JMenu("Save");
            saveMenu.add("Save");
            saveMenu.add(("Save As"));
            filemenu.add(saveMenu);

            JMenu editmenu = new JMenu("Edit");
            menuBar.add(editmenu);
            //这组展示一下另一种添加菜单项的方式,以及如何添加图标,我们更提倡这种方式
            JMenuItem Cut = new JMenuItem("Cut");//创建菜单条目 
            JMenuItem Copy = new JMenuItem("Copy");
            JMenuItem Paste = new JMenuItem("Paste");
            JMenuItem Delete = new JMenuItem("Delete"); 

            Cut.setIcon(new ImageIcon("C:\\Users\\唐浩钏\\document\\python\\avator(1).png"));//为Cut条目添加图标

            Cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_DOWN_MASK));//KeyStroke类的getKeyStroke需要键位和修饰符两个参数 
            Copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK));
            Paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_DOWN_MASK)); 
            Delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));//无需修饰符,参数为0

            editmenu.add(Cut);
            editmenu.add(Copy);
            editmenu.addSeparator();
            editmenu.add(Paste);
            editmenu.add(Delete);

            frame.setJMenuBar(menuBar);//将菜单设置到窗口

            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
        }
    }
}

如图:

边界布局

面板

  • 构造方法:JPanel p1=new JPanel();

  • 为面板布局:面板对象.setLayout(部局管理器对象);

  • 在面板上加载组件:面板对象.add(组件对象)。

调整了一下尺寸,使其看得顺眼,写代码的时候发现命名很重要啊…代号abc式的命名很容易搞乱归属关系,命名一定要一看就懂,复杂点也没关系…

import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

public class HelloworldGUi{

    public  static void main(String[] args){         
        MyFrame frame = new MyFrame();
    }

    static class MyFrame extends JFrame{
        //JButton[] buttons = new JButton[10];
        JPanel signingup = new JPanel();
        JPanel accountpanel = new JPanel();
        JPanel passwordpanel = new JPanel();
        JPanel signupbutton = new JPanel();

        JLabel account = new JLabel("登录账号");
        JLabel password = new JLabel("登录密码");
        JButton baccount = new JButton("登录");
        JButton bpassword = new JButton("退出");
        JTextField accountlength = new JTextField(9);
        JTextField passwordlength = new JTextField(9);


        MyFrame() {
            JFrame frame = new JFrame("hello world");//创建一个标题为“hello world”的窗口;
            frame.setLocation(500, 500);//位置
            frame.setSize(300, 200);//初始大小
            frame.setVisible(true);//能否调整窗口大小
            frame.setVisible(true);//是否显示

/*
            JButton button = new JButton("come back to sky...");//创建按钮
            button.setSize(300, 300);//设置按钮大小
            button.setFont(new Font("Arial", Font.BOLD, 24));//设置字体样式和大小
            button.setLocation(500, 500);//设置按键位置
            //button.setPreferredSize(new Dimension(30,30));初始为30*30像素点,如果按钮文本内容太长则适应文本
            Container container = frame.getContentPane();//用Frame的getContentPane方法实例化一个Container类型的对象来
            container.add(button);//向对象添加按钮


 */
            //按钮部分
            //Container container = frame.getContentPane();

            /*FlowLayout f = new FlowLayout(FlowLayout.CENTER,150,150);//设置流水布局参数,实例化一个FlowLayout类的FlowLayout类型的对象,来设置参数
            container.setLayout(f);//利用setLayout方法设置流水布局*/

            /*GridLayout g = new GridLayout(3,4,10,10);
            container.setLayout(g);//网格布局*/

            /*BorderLayout b = new BorderLayout(30,30);
            container.setLayout(b);//边界布局*/

           /* container.add(new JButton("东面"),BorderLayout.EAST);
            container.add(new JButton("南面"),BorderLayout.SOUTH);
            container.add(new JButton("西面"),BorderLayout.WEST);
            container.add(new JButton("北面"),BorderLayout.NORTH);
            container.add(new JButton("中间"),BorderLayout.CENTER);
            /*for(int i = 0;i < buttons.length;i++) {
                buttons[i] = new JButton("Button"+i);
                buttons[i].setFont(new Font("Arail", Font.BOLD, 24));
                container.add(buttons[i]);*/



            //菜单部分
            JMenuBar menuBar = new JMenuBar();//创建一个菜单栏

            JMenu filemenu = new JMenu("File");//船舰一个名为”File“的菜单
            menuBar.add(filemenu);//将菜单添加到菜单栏

            filemenu.add("New");//加菜单项
            filemenu.add(("Open"));
            filemenu.addSeparator();//加分割线
            //设置子菜单项
            JMenu saveMenu = new JMenu("Save");
            saveMenu.add("Save");
            saveMenu.add(("Save As"));
            filemenu.add(saveMenu);

            JMenu editmenu = new JMenu("Edit");
            menuBar.add(editmenu);
            //这组展示一下另一种添加菜单项的方式,以及如何添加图标,我们更提倡这种方式
            JMenuItem Cut = new JMenuItem("Cut");//创建菜单条目
            JMenuItem Copy = new JMenuItem("Copy");
            JMenuItem Paste = new JMenuItem("Paste");
            JMenuItem Delete = new JMenuItem("Delete");

            Cut.setIcon(new ImageIcon("C:\\Users\\唐浩钏\\document\\python\\avator(1).png"));//为Cut条目添加图标

            Cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_DOWN_MASK));//KeyStroke类的getKeyStroke需要键位和修饰符两个参数
            Copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK));
            Paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_DOWN_MASK));
            Delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));//无需修饰符,参数为0

            editmenu.add(Cut);
            editmenu.add(Copy);
            editmenu.addSeparator();
            editmenu.add(Paste);
            editmenu.add(Delete);

            frame.setJMenuBar(menuBar);//将菜单设置到窗口

            //设置面板
            Container container = frame.getContentPane();
            FlowLayout fleft = new FlowLayout(FlowLayout.CENTER,10,10);
            FlowLayout fright = new FlowLayout(FlowLayout.RIGHT,10,10);
            BorderLayout border = new BorderLayout(10,10);
            GridLayout grid = new GridLayout(2,1);

            container.setLayout(border);
            accountpanel.setLayout(fleft);
            passwordpanel.setLayout(fleft);
            signupbutton.setLayout(fright);
            signingup.setLayout(grid);

            accountpanel.add(account);
            accountpanel.add(accountlength);
            passwordpanel.add(password);
            passwordpanel.add(passwordlength);
            signupbutton.add(baccount);
            signupbutton.add(bpassword);
            signingup.add(accountpanel);
            signingup.add(passwordpanel);

            container.add(signingup,BorderLayout.CENTER);
            container.add(signupbutton,BorderLayout.SOUTH);
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        }
    }
}

运行效果如图:

在这里插入图片描述

那么关于java的Swing学习告一段落,要去复习算法导论了。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值