Java学习笔记-组件及事件处理(一)

4 篇文章 0 订阅
2 篇文章 0 订阅

一:Java swing 概述

Java swing是java用来进行开发桌面程序的API,在包javax.swing中,其包含关系如下图所示

在这里插入图片描述
在Swing组件中大多数GUI组件都是Component类的直接子类或间接子类,JComponent类是Swing组件各种特效的存放位置,这些组件的特效包括设定组件边界、GUI组件自动滚动等
注意容器与组件的概念与区别:组件位于容器内部,容器通常调用方法add将组件添加到内部,容器内部也可以添加容器(容器之间的嵌套),添加的组件需要调用方法validate让其在容器内显示出来,默认时不显示的。

二:窗口

1:概述

容器分为底层容器,中间容器以及顶层容器,窗口属于底层容器。Java提供的JFrame类的实例就是一个窗口。还有一种底层容器就是JDlalog类的实例(对话框)。二者无太大区别。可以将组件(顶层)添加到窗口中,但是不允许窗口添加到容器中。

2:JFrame常用方法

1JFrame()   //创建一个无标题的窗口
2: JFrame(String s)   //创建一个标题为s的窗口
3: public void setBounds(int a,int b,int width,int height) //设置窗口的初始位置为(a,b),宽度高度。
4: public void setSize(int width,int height) //设置窗口的大小
5: public void setLocation(int x,int y) //设置窗口的位置,默认是0,0
6: public void setVisible(boolean b) //设置窗口是否可见默认不可见
7: public void setResizable(boolean b) //设置窗口是否可调整大小
8: public void dispose()  //撤销当前窗口并且释放所有资源
9: public void setExtendedState(int state)  //设置窗口的宽展状态
10: public void setDefaultCloseOperation(int operation) //点击关闭图标后,程序的处理
//默认值如下:
DO_NOTHING_ON_CLOSE  //什么也不做
HIDE_ON_CLOSE    //隐藏当前窗口
DISPOSE_ON_CLOSE  //隐藏窗口,并且释放资源
EXIT_ON_CLOSE   //结束窗口内的应用程序 

例如:

package cn.Test.swing;
import  javax.swing.*;
public class FrameDemo {
    public static void main(String[] args) {
        JFrame jFrame=new JFrame("窗口实例");    //新建一个窗口,标题为窗口实例
        jFrame.setSize(400,300);    //设置窗口的宽高
        jFrame.setLocationRelativeTo(null);      //设置窗口位置位于屏幕的正中心
        jFrame.setResizable(false);            //设置窗口大小不能随意改变
        jFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);          //设置关闭窗口同时结束进程
        jFrame.setVisible(true);      //设置窗口可以显示
    }
}

运行结果如下图所示:

在这里插入图片描述
此窗口位于屏幕正中央,且不可被改变大小。

3:菜单条,菜单,菜单项

菜单条,菜单,菜单项是窗口常用的组件,三者的关系为菜单放在菜单条里,菜单项放在菜单里。
(1)、菜单条:JMenubar的一个实例就是菜单条。JFrame类可以通过方法setJMenuBar将菜单条放置到窗口中:

setJMenuBar(JMenuBar bar);  //将菜单条放置到窗口顶部,且一个窗口只能有一个菜单条

(2)、菜单:JMenu的一个实例就是菜单
(3)、菜单项:JMenuItem的实例就是一个菜单项
(4)、嵌入子菜单:把菜单添加到菜单中就构成了嵌入子菜单。
(5)、菜单图标:图表类icon声明,后用imageicon创建图标最后菜单项调用setIcon设置图标。

例如:

package cn.Test.swing;
import javax.swing.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import static javax.swing.JFrame.*;
public class WindowMenu extends JFrame {    //JFrame的子类
    JMenuBar jMenuBar;
    JMenu menu,subMenu;
    JMenuItem item1,item2;
    public WindowMenu(){}
    public WindowMenu(String s,int x,int y,int w,int h){
        init(s);
        setLocation(x,y);
        setSize(w,h);
        setVisible(true);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }
    void init(String s){
        setTitle(s);
        jMenuBar=new JMenuBar();
        menu=new JMenu("菜单");
        subMenu=new JMenu("软件项目");
        item1=new JMenuItem("java话题",new ImageIcon("a.gif"));
        item2=new JMenuItem("动画话题",new ImageIcon("b.gif"));
        item1.setAccelerator(KeyStroke.getKeyStroke('A'));
        item2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
        menu.add(item1);
        menu.addSeparator();
        menu.add(item2);
        menu.add(subMenu);
        subMenu.add(new JMenuItem("汽车系统",new ImageIcon("c.gif")));
        subMenu.add(new JMenuItem("内存系统",new ImageIcon("d.gif")));
        jMenuBar.add(menu);
        setJMenuBar(jMenuBar);
    }
}

三:常用组件与布局

1:常用组件

(1):JTextField(文本框)
允许用户在文本框中输入单行文本
(2):JTextArea(文本区)
允许用户在文本区输入多行数据
(3):JButton(按钮)
允许用户点击按钮
(4):JLable(标签)
标签为用户提供提示信息
(5):JCheckBox(复选框)
为用户提供多项选择
(6):JRadioButton(单选按钮)
为用户提供单项选择
(7):JComboBox(下拉列表)
为用户提供下拉式的单项选择
(8):JPassworFiled(密码框)
允许用户体提供单行密码

2:常用容器(中间容器)

介于底层容器窗口与各中组件的一种容器,组件可以添加在里面。常用的中间容器有:
(1):JPanel(面板)
JPangle创建一个面板,然后向其中添加组件,最后将面板添加到底层容器中,默认的面板布局是FlowLayout布局
(2):JTabbePane(选项卡窗格)
向选项卡窗格添加组件时,容器会自动为该组件指定一个对应的选项卡,即一个选项卡对应一个组件。且组件为层叠样式放入容器。点击选项卡,显示对应的组件,可以使用add(String text,Component c)方法将组件添加到容器内,text是选项卡的提示选项。选项卡的位置可以通过调用方法:public JTabbedPane(int tabPalacement)确定其位置,取值为:JTabbedPane.TOP,JTabbedPane.BOTTOM,JTabbedPane.LEFT,JTabbedPane.RIGHT.
(3):JScollPane(滚动窗格)
滚动窗格中只能添加一个组件,可以把一个文本框放入滚动窗格中,例如:

JScrollPane scroll = new JScrollPane(next JTextArea())

(4):JSplitPane(拆分窗格)
将容器划分为两部分,一部分里面可以放置一个组件。有两种划分方式;水平分割和垂直分割。分割线可以移动。他的两个常用构造方法为:

JScrollPane(int n,Component c,Component b)

其中参数n有两种取值,分别是HORIZONTAL_SPLIT与VERTICAL_SPLIT分别代表水平分割与垂直分割。其他两个为组件。

JScrollPane(int n,int b,Component c,Component b)

比起第一种,多了参数b,决定拆分线移动时,组件是否跟着移动。
(5):JLayeredPane(分层窗格)
它调用方法add(Jcomponent com,int layer)将组件加入到容器内部。参数分别为组件与位置。

3:常用布局

(1):FlowLayout布局
构造一个居中对齐的布局方式:FlowLayout(),add方法将组件添加到容器内,组件之间默认间隔5个像素。在此布局中的组件改变㢟大小时,需要调用方法:public void setPreferredSize(Dimension preferredSize)。居中对其方式可以改变,调用方法:SetAlignment(int aligan),aligan有三种取值FlowLayout.LEFT、FlowLayout.CENTER、FlowLayout.RIGHT。
(2):BorderLayout布局
次布局将容器划分为5个区域:东南西北中。中间最大,一个区域只能放置一个组件。调用方法:

con.add(b,BorderLayout.CENTER);

b为组件,第二个参数决定了放置区域的位置。
(3):CardLayout布局
可以容纳多个组件,但是每个组件被层叠放入容器内,同一时刻只能显示一个组件创建一个CardLayout步骤如下:

  1. 创建CardLayout布局对象
CardLayout card = new CardLayout();
  1. 使用容器的setLayout() 方法为容器设置布局
  2. 调用add(String s,Component b)将组件加入到容器内,并且给出该组件的代号。
  3. 调用方法show(con,s),显示代号为s的组件。
    (4):GridLayout布局
    基本布局策略为把容器划分为若干行和若干列相乘的网格区域。组件位于小格内。
    (5):null布局
    自己定义组件在容器内的位置。往null布局内添加组件需要分两步:
    调用add方法将组件添加到容器内。
    调用setBounds(int a,int b,int width,int height)确定组件的位置和大小。a,b指的是据容器p的位置。
    (6):BoxLayout布局
    盒容器布局,可以嵌套。

例:
test.java


public class Test {
    public static void main(String[] args) {
        new ShowLayout();
    }
}

ShowLayout.java

import javax.swing.*;
import java.awt.*;
public class ShowLayout extends JFrame{
    PanelGridLayout panelGrid;
    PanelNullLayout panelNull;
    JTabbedPane p;         //选项卡布局
    ShowLayout(){
        panelGrid=new PanelGridLayout();
        panelNull=new PanelNullLayout();
        p=new JTabbedPane();
        String Grid_name="网格布局的面板";
        p.add(Grid_name,panelGrid);
        p.add("空白布局的面板",panelNull);
        add(p,BorderLayout.CENTER);
        add(new JButton("窗体是BorderLayout布局"),BorderLayout.NORTH);
        add(new JButton("南"),BorderLayout.SOUTH);
        add(new JButton("西"),BorderLayout.WEST);
        add(new JButton("东"),BorderLayout.EAST);
        setBounds(10,10,570,390);
        setVisible(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        validate();
    }
}

PanelGridLayout.java

import javax.swing.*;
import java.awt.*;
public class PanelGridLayout extends JPanel{
    PanelGridLayout(){
        GridLayout grid=new GridLayout(12,12);
        setLayout(grid);
        Label label[][]=new Label[12][12];
        for (int i = 0; i <12; i++) {
            for(int j=0;j<12;j++){
                label[i][j]=new Label();
                if((i+j)%2==0){
                    label[i][j].setBackground(Color.BLACK);
                }
                else {
                    label[i][j].setBackground(Color.WHITE);
                }
                add(label[i][j]);
            }

        }
    }
}

PanelNullLayout.java

import javax.swing.*;
import java.awt.*;
public class PanelNullLayout extends JPanel{
    JButton jButton;
    JTextField textField;
    PanelNullLayout(){
        setLayout(null);
        jButton=new JButton("确认");
        textField=new JTextField();
        add(textField);
        add(jButton);
        textField.setBounds(100,30,90,30);
        jButton.setBounds(190,30,66,30);
    }
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值