• java_day08_GUI


    第八章:GUI组件

    1.GUI概述-AWT和Swing
    图形用户界面(Graphics User Interface, GUI) 是用户与程序交互的窗口,它比基于命令行的界面更直观并且更友好。
    GUI的基本类库位于java.awt包中, 这个包也被称为抽象窗口工具集(Abstract Window Toolkit, AWT)。AWT按照面向对象的思想来创建GUI,它提供了容器类、组件类和布局管理器类。

    随着Java的发展,AWT中的大部分组件已经渐渐被淘汰,它已经不能适应发展的需要,不能满足开发功能强大的用户界面的需要。这时Swing出现了,它是建立在AWT之上的组件集(对AWT组件的扩展),在不同的平台上都能保持组件的界面样式,因此得到了非常广泛的应用。javax.swing

    注:AWT和Swing之间的最大的区别在于Swing组件的实现与本地实现无关,所以能保证Swing组件在不同的平台上都能显示出原有的样式,并且Swing组件比AWT组件具有更多的功能。
    AWT组件都在java.awt包下面,Swing组件都在javax.swing包下面
    例如AWT和Swing中都有按钮,
    java.awt.Button
    javax.swing.JButton

    AWT和Swing中都有复选框,
    java.awt.Checkbox
    javax.swing.JCheckBox

    AWT和Swing中都有对话框,
    java.awt.Dialog
    javax.swing.JDialog

    AWT和Swing中都有菜单组件,
    java.awt.Menu
    javax.swing.JMenu
    ...

    注1:它们之间的名字的特点
    注2:javax.swing中绝大大多数的组件都是继承了java.awt中Component


    2.组件、容器、布局管理器的介绍
    这三种东西是GUI界面中最重要的组成部分。

    1)组件
    java.awt.Component类是所有组件的父类(这是个抽象类)。同时在该类中也定义了所有组件都应该具备的公共方法。

    Component类型对象是一个具有图形表示能力的对象,可在屏幕上显示,并可与用户进行交互。例如图形用户界面中的按钮、复选框和滚动条等都是它的实例。

    //注:该类实现的接口没有写出来
    public abstract class Component{}

    下面常用的类都是Component的"直接"子类:
    java.awt.Button
    Button类用于创建GUI中的按钮
    java.awt.Canvas
    Canvas类表示屏幕上一个空白矩形区域,应用程序可以在该区域内绘图,或者可以从该区域捕获用户的输入事件。
    java.awt.Checkbox
    Checkbox类用于创建GUI中的复选框
    java.awt.Choice
    Choice类表示一个弹出式选择菜单,当前的选择显示为菜单的标题。
    java.awt.Container
    Container类是所有容器类的父类.(容器本身也是一种组件)
    java.awt.Label
    Label类型对象是一个可在容器中放置文本的组件。一个标签只显示一行只读文本。文本可由应用程序更改,但是用户不能直接对其进行编辑
    java.awt.List
    List组件为用户提供了一个可滚动的文本项列表。可设置此 list,使其允许用户进行单项或多项选择
    java.awt.Scrollbar
    Scrollbar类可用于创建一个滚动条
    java.awt.TextComponent
    TextComponent类是所有允许编辑文本的组件的父类。

    2)容器
    java.awt.Container类是所有容器的父类。
    容器也是一种特殊的组件,它是一个可包含其他组件的组件,所以Container类继承了Component类
    public class Container extends Component{}

    下面常用的类都是Container的"直接"子类:
    javax.swing.JComponent
    JComponent类是除顶层容器外所有Swing组件的基类
    java.awt.Panel
    Panel是最简单的容器类,应用程序可以将其他组件放在面板提供的空间内,这些组件包括其他面板
    java.awt.Window
    Window对象是一个没有边界和菜单栏的顶层窗口
    java.awt.ScrollPane
    用于实现单个组件的水平或垂直滚动的容器类

    3)布局管理器
    Java中的图形界面在布局管理上采用容器和布局管理相分离的方案,也就是说容器只是把组件放进来,但它不管怎样放置。至于如何放置需要用到布局管理器。
    java.awt.LayoutManager接口是所有布局管理需要实现的接口

    Java中常用布局管理器有:
    BorderLayout 边界布局管理器
    FlowLayout 流式布局管理器
    GridLayout 网格布局管理器
    CardLayout 卡片布局管理器

    注:很多容器都是有默认的布局管理器的,同时也允许用户修改
    注:也可以不使用任何布局管理器,自己使用坐标控制组件在容器中的位置


    3.组件、容器、布局管理器的使用
    1)常用的容器类,Frame和Panel
    java.awt.Frame类:
    public class Frame extends Window{}
    java.awt.Frame是带有标题和边框的顶层窗口,它是java.awt.Window类的直接子类

    例如:FrameTest.java

    Frame frame = new Frame();
    frame.setTitle("我的容器");
    frame.setSize(500,500);
    frame.setLocation(700, 300);
    frame.setBackground(Color.lightGray);
    frame.setResizable(true);
    frame.setVisible(true);

    注:frame要显示出来,最后一定要设置它的的可见性为true

    思考:怎么能让窗口每次位于屏幕的正中间
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    int width = (int) toolkit.getScreenSize().getWidth();
    int height = (int) toolkit.getScreenSize().getHeight();

    java.awt.Panel类:
    public class Panel extends Container{}
    Panel是最简单的容器类,也称为面板,应用程序可以将其他组件放在面板提供的空间内,这些组件包括其他面板(嵌套)。
    注:Panel面板不能单独显示,必须把它放到Frame中

    例如:PanelTest.java
    注:运行后显示不了,设置Panel的大小位置以及可见性也没用
    Panel panel = new Panel();
    panel.setSize(400, 400);
    panel.setLocation(700, 300);
    panel.setBackground(Color.blue);
    panel.setVisible(true);

    例如:修改后,加入frame则可以显示
    Frame frame = new Frame();
    Panel panel = new Panel();
    panel.setBackground(Color.blue);

    frame.setSize(400, 400);
    frame.setLocation(700, 300);
    frame.add(panel);

    frame.setVisible(true);

    2)常用的容器类,JFrame JPanel
    javax.swing.JFrame类:
    public class JFrame extends Frame{}

    例如:JFrameTest.java
    JFrame jFrame = new JFrame();
    jFrame.setTitle("我的容器");
    jFrame.setSize(500,500);
    jFrame.setLocation(700, 300);
    jFrame.setBackground(Color.lightGray);
    jFrame.setResizable(true);
    jFrame.setVisible(true);

    javax.swing.JPanel类:
    public class JPanel extends JComponent
    JPanel是一般轻量级容器,作用及用法和java.awt.Panel类似,它也是不能单独显示的。

    3)常用的组件类(主要以Swing的为主,除非Swing中没有该组件)
    javax.swing.JButton 按钮
    例如:JButtonTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();

    JButton btn = new JButton("登录");

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel.add(btn);
    jFrame.add(panel);

    jFrame.setVisible(true);

    javax.swing.JCheckBox 复选框
    例如:JCheckBoxTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();

    JCheckBox jck1 = new JCheckBox("篮球");
    JCheckBox jck2 = new JCheckBox("足球");

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel.add(jck1);
    panel.add(jck2);
    jFrame.add(panel);

    jFrame.setVisible(true);

    javax.swing.ButtonGroup 按钮组
    javax.swing.JRadioButton 单选框
    例如:JRadioButtonTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();
    //需要把俩个单选按钮放到ButtonGroup中,表示为一组
    ButtonGroup bg = new ButtonGroup();
    JRadioButton rbtn1 = new JRadioButton("男");
    JRadioButton rbtn2 = new JRadioButton("女",true);

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    bg.add(rbtn1);
    bg.add(rbtn2);
    panel.add(rbtn1);
    panel.add(rbtn2);
    jFrame.add(panel);

    jFrame.setVisible(true);

    java.awt.Choice 下拉菜单
    例如:ChoiceTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();
    Choice ColorChooser = new Choice();
    ColorChooser.add("Green");
    ColorChooser.add("Red");
    ColorChooser.add("Blue");

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel.add(ColorChooser);
    jFrame.add(panel);

    jFrame.setVisible(true);

    javax.swing.JComboBox 下拉菜单
    例如:JComboBoxTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();
    JComboBox<String> box = new JComboBox<>();
    box.addItem("test1");
    box.addItem("test2");
    box.addItem("test3");

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel.add(box);
    jFrame.add(panel);

    jFrame.setVisible(true);

    javax.swing.ImageIcon 图片/图标
    javax.swing.JLabel 标签(可放置文本和图片)
    例如:JLabelTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();
    JLabel label1 = new JLabel("大家好");
    JLabel label2 = new JLabel();
    label2.setIcon(new ImageIcon("src/com/briup/test/1.png"));

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel.add(label1);
    panel.add(label2);
    jFrame.add(panel);

    jFrame.setVisible(true);

    注:按钮上也能类似的设置图片

    javax.swing.JList 显示数据列表并且允许用户选择一个或多个项的组件(按住ctrl键多选)
    例如:JListTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();
    String[] data = {"one", "two", "three", "four"};
    JList<String> myList = new JList<String>(data);


    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel.add(myList);
    jFrame.add(panel);

    jFrame.setVisible(true);

    javax.swing.JScrollBar 滚动条
    例如:JScrollBarTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();
    //垂直 VERTICAL, 水平 HORIZONTAL
    JScrollBar bar = new JScrollBar(JScrollBar.HORIZONTAL);
    //需要这样设置滚动条的宽和高
    bar.setPreferredSize(new Dimension(200, 20));
    bar.setMinimum(0);
    bar.setMaximum(100);
    bar.setValue(80);

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel.add(bar);
    jFrame.add(panel);

    jFrame.setVisible(true);


    javax.swing.JTextArea 文本域
    javax.swing.JScrollPane 滚动面板(一般和文本域一起使用)
    例如:JScrollPaneTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();
    //需要给panel换一个布局管理器
    panel.setLayout(new BorderLayout());
    JTextArea area = new JTextArea();
    area.setSize(100, 100);
    JScrollPane scrollPane = new JScrollPane(area);

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel.add(scrollPane);
    jFrame.add(panel);

    jFrame.setVisible(true);

    javax.swing.JTextField 文本框
    javax.swing.JPasswordField 密码框
    例如:JTextFieldTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();
    JTextField field = new JTextField(10);
    JPasswordField passwordField = new JPasswordField(10);


    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel.add(field);
    panel.add(passwordField);
    jFrame.add(panel);

    jFrame.setVisible(true);

    javax.swing.JMenuBar 菜单栏
    javax.swing.JMenu 菜单
    javax.swing.JMenuItem 菜单项
    例如:JMenuBarTest.java

    //创建frame和panel
    JFrame frame = new JFrame("JMenuBar");
    JPanel panel = new JPanel();

    //创建菜单栏工具条
    JMenuBar bar = new JMenuBar();

    //创建俩个菜单
    JMenu sMenu, gMenu;
    sMenu = new JMenu("系统");
    gMenu = new JMenu("工具");

    //创建菜单中的选项,并添加到系统菜单(sMenu)中
    JMenuItem sItem, cItem, tItem;
    sItem = new JMenuItem("开始导航");
    cItem = new JMenuItem("刷新系统");
    tItem = new JMenuItem("退出系统");
    sMenu.add(sItem);
    sMenu.addSeparator();
    sMenu.add(cItem);
    sMenu.addSeparator();
    sMenu.add(tItem);


    //创建菜单中的选项,并添加到工具菜单(gMenu)中
    JMenuItem xyItem, ycItem;
    xyItem = new JMenuItem("显示菜单");
    ycItem = new JMenuItem("隐藏菜单");
    gMenu.add(xyItem);
    gMenu.addSeparator();
    gMenu.add(ycItem);


    //把系统菜单(sMenu)和工具菜单(gMenu)添加到菜单栏工具条中
    bar.add(sMenu);
    bar.add(gMenu);

    //把菜单栏工具条添加到面板中
    panel.add(bar);

    //把面板添加到frame中
    frame.add(panel);

    //设置frame的相关属性
    frame.setBounds(700, 500, 500, 500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);

    frame.setVisible(true);


    javax.swing.JDialog 对话框
    例如:JDialogTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();
    JButton okBut = new JButton("确定");
    //参数1 对话框属于哪个窗口
    //参数2 对话框标题
    //参数3 弹框对话框后,是否阻止用户进行其他组件的操作
    JDialog dialog = new JDialog(jFrame, "提示信息", true);

    dialog.setBounds(730, 325, 350, 150);
    dialog.setLayout(new FlowLayout());
    dialog.add(okBut);


    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    jFrame.add(panel);

    jFrame.setVisible(true);
    dialog.setVisible(true);

    注:之后可以通过鼠标点击控制对话框的出现和消失


    javax.swing.JProgressBar 进度条
    例如:JProgressBarTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();
    JProgressBar bar = new JProgressBar();
    //最小值为0
    bar.setMinimum(0);
    //最大值为100
    bar.setMaximum(100);
    //设置进度条中的值初始为0
    bar.setValue(0);
    //显示当前进度条的状态
    bar.setStringPainted(true);

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel.add(bar);
    jFrame.add(panel);

    jFrame.setVisible(true);


    java.awt.Canvas 画布
    注:必须为Canvas创建子类并重写paint方法
    例如:CanvasTest.java

    JFrame jFrame = new JFrame();
    final JPanel panel = new JPanel();
    Canvas canvas = new Canvas(){
    @Override
    public void paint(Graphics g) {
    g.drawLine(0, 0, panel.getWidth(), panel.getHeight());
    }
    };

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel.setLayout(new BorderLayout());
    panel.add(canvas);
    jFrame.add(panel);

    jFrame.setVisible(true);


    注:尝试在画布对象创建完后,添加如下代码观察效果
    canvas.addMouseMotionListener(new MouseAdapter() {
    public void mouseDragged(MouseEvent e) {
    int x = e.getX();
    int y = e.getY();
    Graphics g = canvas.getGraphics();
    g.setColor(Color.RED);
    g.fillOval(x, y, 10, 10);
    }
    });

    注:addMouseMotionListener和addMouseListener所支持的事件是有区别的


    4)常用的布局管理器的使用
    注: JFrame的布局管理器默认是BorderLayout
    JPanel的布局管理器默认是FlowLayout

    BorderLayout 边界布局管理器
    例如:BorderLayoutTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();

    panel.setLayout(new BorderLayout());

    JButton north,south,west,east,center;
    north = new JButton("north");
    south = new JButton("south");
    west = new JButton("west");
    east = new JButton("east");
    center = new JButton("center");

    //把按钮添加到panel中,并指明添加到的位置
    panel.add(north,BorderLayout.NORTH);
    panel.add(south,BorderLayout.SOUTH);
    panel.add(west,BorderLayout.WEST);
    panel.add(east,BorderLayout.EAST);

    //panel.add(center)这样写和下面的效果是一样的
    //如果你不指定放到BorderLayout那个位置的时候
    //他会默认的把组件放到中间那个位置
    panel.add(center,BorderLayout.CENTER);

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    jFrame.add(panel);

    jFrame.setVisible(true);


    FlowLayout 流式布局管理器
    例如:FlowLayoutTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();

    panel.setLayout(new FlowLayout());

    JButton[] buts = new JButton[50];
    for(int i=1;i<=buts.length;i++){
    if(i<10){
    buts[i-1] = new JButton("0"+i);
    }else if (i<=50) {
    buts[i-1] = new JButton(""+i);
    }
    panel.add(buts[i-1]);
    }

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    jFrame.add(panel);

    jFrame.setVisible(true);

    GridLayout 网格布局管理器
    例如:GridLayoutTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();

    panel.setLayout(new GridLayout(3,3));

    JButton[] buts = new JButton[9];
    //设置container的布局管理器为GridLayout
    //GridLayout(3,3)表示布局为3行3列

    //循环创建按钮并放到panel中
    for(int i=0;i<buts.length;i++){
    buts[i] = new JButton((i+1)+"");
    panel.add(buts[i]);
    }

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    jFrame.add(panel);

    jFrame.setVisible(true);

    CardLayout 卡片布局管理器
    例如:CardLayoutTest.java

    JFrame jFrame = new JFrame();
    final JPanel panel = new JPanel();

    panel.setLayout(new CardLayout());

    JPanel[] jPanels = new JPanel[4];
    //创建四个JPanel放到数组中并设置背景颜色
    jPanels[0] = new JPanel();
    jPanels[0].setBackground(Color.red);

    jPanels[1] = new JPanel();
    jPanels[1].setBackground(Color.blue);

    jPanels[2] = new JPanel();
    jPanels[2].setBackground(Color.cyan);

    jPanels[3] = new JPanel();
    jPanels[3].setBackground(Color.green);

    //向CardLayout布局管理器中放置组件的时候一定要给组件起一个名字
    panel.add("a",jPanels[0]);
    panel.add("b",jPanels[1]);
    panel.add("c",jPanels[2]);
    panel.add("d",jPanels[3]);

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jFrame.add(panel);
    jFrame.setVisible(true);

    注:现在所看到的结果是四个颜色不同的JPanel叠在一起的效果,看到是最上面一个JPanel
    可以在上面例子中加入以下代码,看效果如何.

    panel.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
    //获得panel容器上面的布局管理器
    //并转为CardLayout类型的对象
    CardLayout cl = (CardLayout) panel.getLayout();
    //显示CardLayout管理器中的下一个组件
    //这个参数表示:在哪一个容器中设置的这个CardLayout管理器
    cl.next(panel);
    //cl.show(panel, "d");
    }
    });

    注:JPanel和JPanel之间可以嵌套,每个JPanel又可以设置为不同的布局管理器,这样就可以得到大都数想要的组件布局情况了


    自定义组件位置
    有些时候也可以不使用任何布局管理器,用户通过坐标自己设置组件位置。

    例如:MyLayoutTest.java

    JFrame jFrame = new JFrame();
    JPanel panel = new JPanel();

    //把布局管理器设置为null
    //表示不使用任何管理器
    panel.setLayout(null);
    JButton btn = new JButton("登录");
    //设置组件的大小和位置
    btn.setSize(100,30);
    btn.setLocation(80,60);

    panel.add(btn);

    jFrame.setSize(400, 400);
    jFrame.setLocation(700, 300);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jFrame.add(panel);
    jFrame.setVisible(true);

    4.编写一个GUI程序的基本方式
    1)第一种情况:Test1.java
    //不继承JFrame也不实现ActionListener
    public class JFrameTest{
    //声明容器和要用的组件
    private JFrame frame;
    private JButton button;

    public JFrameTest(){
    //初始化主容器
    frame = new JFrame();
    frame.setTitle("我的组件");
    frame.setSize(500, 500);
    frame.setLocation(700, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    initComponent();
    frame.setVisible(true);
    }

    //初始化组件
    private void initComponent(){
    //创建组件对象
    button = new JButton("登录");

    //把组件添加到容器中
    frame.add(button);

    //给组件添加事件监听器
    button.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
    System.out.println("OK");
    }
    });
    }

    public static void main(String[] args){
    new JFrameTest();
    }

    }

    2)第二种情况:Test2.java
    //继承JFrame
    public class JFrameTest extends JFrame{
    //声明容器和要用的组件
    private JButton button;

    public JFrameTest(){
    //初始化主容器
    this.setTitle("我的组件");
    this.setSize(500, 500);
    this.setLocation(700, 300);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    initComponent();
    this.setVisible(true);
    }

    //初始化组件
    private void initComponent(){
    button = new JButton("登录");

    this.add(button);

    button.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
    System.out.println("OK");
    }
    });
    }

    public static void main(String[] args){
    new JFrameTest();
    }

    }

    3)第三种情况:Test3.java
    //继承JFrame同时实现ActionListener接口
    public class JFrameTest extends JFrame implements ActionListener{
    //声明容器和要用的组件
    private JButton button;

    public JFrameTest(){
    //初始化主容器
    this.setTitle("我的组件");
    this.setSize(500, 500);
    this.setLocation(700, 300);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    initComponent();
    this.setVisible(true);
    }

    //初始化组件
    private void initComponent(){
    button = new JButton("登录");

    this.add(button);

    //给组件添加事件监听器
    button.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    System.out.println("OK");
    }

    public static void main(String[] args){
    new JFrameTest();
    }

    }


    5.一个GUI的例子 MyFirstGUI.java
    public class MyFirstGUI extends JFrame{
    private static final long serialVersionUID = 1L;
    private JButton button;
    private JPanel jPanel;
    private JLabel addLabel,eqsLabel;
    private JTextField f1,f2,f3;

    public MyFirstGUI() {
    setTitle("MY-GUI");
    //设置位置和宽高
    setBounds(40, 40, 400, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    initComponent();
    setVisible(true);
    }

    private void initComponent(){

    //初始化组件
    jPanel = new JPanel();

    button = new JButton("add");
    addLabel = new JLabel("+");
    eqsLabel = new JLabel("=");
    //创建文本输入框对象,并设置长度为5
    f1 = new JTextField(5);
    f2 = new JTextField(5);
    f3 = new JTextField(5);

    //设置容器的布局管理器并添加组件
    jPanel.setLayout(new FlowLayout());

    jPanel.add(f1);
    jPanel.add(addLabel);
    jPanel.add(f2);
    jPanel.add(eqsLabel);
    jPanel.add(f3);
    jPanel.add(button);

    this.add(jPanel);

    //给指定的组件添加事件监听
    button.addActionListener(new ActionListener(){
    //当鼠标点击这个指定按钮的时候程序就会调用这个方法
    @Override
    public void actionPerformed(ActionEvent e) {
    //拿到第一个输入框中的数组(String转换为Double)
    double a =
    Double.parseDouble(f1.getText());

    //拿到第二个输入框中的数组(String转换为Double)
    double b =
    Double.parseDouble(f2.getText());

    //相加得到结果
    double c = a+b;
    //把结果放到第三个输入框中
    f3.setText(c+"");
    }
    });
    }

    public static void main(String[] args) {
    new MyFirstGUI();
    }

    }


    6.了解JFC
    JFC(Java Foundation Classes)是一个图形框架,主要是由AWT、Swing以及Java2D三者所构成,若将这些一同搭配运用,则用Java程式语言撰写开发成的使用者界面,无论移转、转移到Microsoft WindowsWindows、Mac OS X或Linux等各种不同的作业平台上,都能保有一致性的图像呈现。

  • 相关阅读:
    面向对象之继承
    面向对象之封装
    进程相关(一)
    面向对象之反射,元类
    实现效果从中间变大
    如何扒一个网站
    java例程练习(引用类型数据的排序和查找)[外篇]
    java例程练习(Iterator)
    java例程练习(增强的for循环)
    java例程练习(Map接口及自动打包、解包)
  • 原文地址:https://www.cnblogs.com/yue-170305/p/11478928.html
Copyright © 2020-2023  润新知