Java swing 学习笔记自用

自用的,不是闲着无聊的建议不要看,不专业不认真不是分享态度,纯属自用。

看的b站视频:Java Swing入门课程_图形界面GUI编程_100集视频教程

讲得贼好贼细,不过时间太长了。而且没学过Java的估计有点难度,直接上了内部类匿名内部类。

一、首先把窗口存放于Java文件MyDemo中,MyDemo只设置最基础的窗口参数:

public class MyDemo {
    public static void main(String[] args) {

        JFrame frame = new MyFrame("ohyeah"); //窗口名
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //当关闭窗口时,结束运行
        frame.setSize(700,500); //长宽

        frame.setVisible(true); //显示窗口
    }
}

二、具体细节放在另一个java文件MyFrame中,MyFrame继承JFrame,这样它会有JFrame的所有功能:

public class MyFrame extends JFrame { ……

三、在里面放一个同名构造方法,里面就可以放置各种东西了!

public MyFrame(String title) 

{
    super(title);

    ……

四、里面放的东西:

1.容器 JPenel

JPanel root = new JPanel(); //容器,一个面板
this.setContentPane(root); //设置一个容器

注意:因为是在构造方法里所以用this喔!

2.按钮 JButton

JButton button = new JButton("test"); //一个按钮
root.add(button); //向容器中添加一个按钮控件

3.事件处理 ActionListener

事件处理的代码大概就是:先定义一个按钮或者复选框之类的,然后用内部类button.addActionListener……(详见下面代码第三行开始。内部类的大括号里面可以写任何你希望点击按钮/点击复选框以后发生的事。)

内部类简洁写法(一般建议使用):

以下是点击button后,将会展示当前时间的代码。其中包含时间控件和获取当前时间。

        JLabel timelabel = new JLabel("00:00:00");
        root.add(timelabel); //添加时间控件
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("test: 我被点了");

                //取得当前时间
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                String timeStr = sdf.format(new Date());
                //System.out.println(timeStr);

                timelabel.setText(timeStr); //把时间写入label
            }
        });

还有复杂但是保险的非内部类写法,偶尔使用内部类写法会出莫名其妙的错,但是我懒得重新打一遍了……所以就用上面那种吧。如有需要再回看视频P12。

4.文本框输入 JTextField

相关API:

setText():事先在文本框中放入字符串

getText():获取文本框中输入的字符串

//文本框输入
    JTextField textField = new JTextField(20); //这个20是指20个英文字母的长度

 这段放在构造方法外面,作为MyFrame的属性之一,方便使用。(上)

再在构造方法里把他添加到容器root中。(下)

//文本框输入
        root.add(textField);
        String strset = "ohye";
        textField.setText(strset);

        JButton button1 = new JButton("OK");
        root.add(button1);
        button1.addActionListener( new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                test();
            }
        });
    public void test()
    {
        String strget = textField.getText();
        System.out.println(strget);
    }

注意:这里使用了上面事件处理的代码咯!可以复习一下。

注意注意:test()的代码放在构造方法外面

相关API:

setSelected(true/false) //设置选中状态

isSelected //是否选中

addActionListener //勾选或取消获取事件

    //复选框
    JCheckBox agreeFiled = new JCheckBox("同意用户协议");

 这段放在构造方法外面,作为MyFrame的属性之一,方便使用。(上)

再在构造方法里把他添加到容器root中。(下)

//复选框
        root.add(agreeFiled);

        JButton button2 = new JButton("下一步");
        root.add(button2);
        agreeFiled.setSelected(false); //设置初始选中状态为不选中
        button2.setEnabled(false); //把按钮一开始设为禁用状态

        agreeFiled.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                boolean isSelected = agreeFiled.isSelected();
                if(isSelected==true)
                {
                    button2.setEnabled(true);
                }
                else
                    button2.setEnabled(false);
            }
        });

这段代码是关于实现:不勾选复选框就禁用button2,勾选复选框就允许使用button2,一个联动效果。

5.下拉列表 JComboBox

数据项:

addItem() //添加数据项

getItemCount() //获取数据项的个数

getItemAt(int) //获取数据中的某项

//下拉列表
        JComboBox<String> colorFiled = new JComboBox<>();

下拉列表比较特殊,有点类似于ArrayList的列表形式。注意,同样把这一行踢去构造方法外。

JComboBox<T>  这里的T是泛型,代表列表存放的数据类型,可以是任何类型。

//下拉列表
        root.add(colorFiled);
        colorFiled.addItem("红");
        colorFiled.addItem("黄");
        colorFiled.addItem("蓝");
        root.add(colorFiled);
        //添加一个测试按钮
        JButton button3 =new JButton("测试");
        root.add(button3);
        button3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                testComboBox();
            }
        });

(上)构造方法内:都和上面类似啦

(下)构造方法外:试用了下拉列表的API

public void testComboBox()
    {
        System.out.println(colorFiled.getItemCount());
        System.out.println(colorFiled.getItemAt(0));
    }

more about下拉列表:

当 JComboBox<T> 中的T为Student类这样的数据类,注意一定要重写toString()方法

toString()中写的是什么,在下拉列表中就会显示什么。

这个代码不搞了,累。如有需要用就看视频P18。

6.标签控件 JLabel

        JLabel label = new JLabel();
        root.add(label);
        label.setText("ohyeyeye你好 ");

相关API:常用的就这些,其他要用再说吧

        label.setFont(new Font("宋体",Font.ITALIC,14)); //设置字体、粗体、字号
        label.setForeground(new Color(255,0,0)); //设置颜色,颜色是rgb颜色
        label.setOpaque(true); //在这之前的背景都是默认为透明的,因此需要这行代码让他不透明
        label.setBackground(new Color(100,200,200)); //设置背景色
        label.setPreferredSize(new Dimension(200,30)); //设置控件大小,默认情况下是正好包含字的大小
        label.setHorizontalAlignment(SwingConstants.CENTER); //关于对齐

 这些好难记,我一般就打出Font.然后直接找,有粗体、斜体之类的。

IDEA还有直接给rgb颜色看的,就很方便。

但如果有多个控件,一个一个设置肯定太麻烦,可以设置一个private类(放在构造函数外面):

private static class ColorLabel extends JLabel
    {
        public ColorLabel(String text, Color bgColor)
        {
            this.setText(text);
            this.setOpaque(true);
            this.setBackground(bgColor); //设置背景色
            this.setPreferredSize(new Dimension(50,40)); //设置控件大小,默认情况下是正好包含字的大小
            this.setHorizontalAlignment(SwingConstants.CENTER); //关于对齐
        }
    }

构造函数内:

        JLabel label1 = new ColorLabel("1",Color.YELLOW);
        JLabel label2 = new ColorLabel("2",Color.MAGENTA);
        JLabel label3 = new ColorLabel("3",Color.ORANGE);
        JLabel label4 = new ColorLabel("4",Color.PINK);
        root.add(label1);
        root.add(label2);
        root.add(label3);
        root.add(label4);

 然后就是这样子~

7.布局管理器 LayoutManager

相关API:

.setlayout() // 设置管理器

.getlayout() // 获取管理器

(JPanel自带一个FlowLayout流式布局器,对子控件从上到下从左到右依次排列)

这样可以看到 JPanel root 的布局器为FlowLayout。

常用布局器

1.BorderLayout  边界布局器 

        root.setLayout( new BorderLayout() );
        root.add(label1,BorderLayout.NORTH);
        root.add(label2,BorderLayout.SOUTH);
        root.add(label3,BorderLayout.EAST);
        root.add(label4,BorderLayout.WEST);
        root.add(label5,BorderLayout.CENTER);
        LayoutManager lm = root.getLayout();
        System.out.println(lm);

 1,2区域宽度无法调整,高度可以通过以下来调整。

label1.setPreferredSize( new Dimension(0,100));

 同理3,4区域高度无法调整,宽度可以调整。5区域都不能调整。

2.手工布局 

虽然比较麻烦,但是效果很好。

root.setLayout( null ); //取消原布局
root.add(label1);  //添加控件
label1.setBounds(0,0,100,50);  //设置位置以及参数

首先容器 setLayout 为空,然后添加控件到容器中,再用setBounds(x , y , width , heigth)

x,y就是屏幕左上角为原点的x,y轴,x轴向右递增,y轴向下递增。width,height顾名思义。

3.自定义布局器

添加一个类MyLayout 接口 LayoutManager2

点击 Implement methods 或者直接 Alt+Shift+Enter

点击OK

 然后会出现很多方法,我们要重写这些方法来完成自己的布局。

接着就可以在MyFrame中调用MyLayout:

root.setLayout( new MyLayout() );
root.add(label1);
LayoutManager lm = root.getLayout();
System.out.println(lm);

虽然运行后并不会发生任何事(因为我们还没有在里面重写方法),但是getLayout时已经可以看到MyLayout

控件的布局  layoutContaniner

我们在MyLayout中进行布局,其中有很多方法,但是主要关心的就是以下三个:

void addLayoutComponent(Component comp,Object constraints) :

把一个子控件加入容器里后,内部会调用这个方法;

void removeLayoutComponent(Component comp) :

把一个子控件从容器里删除时,内部会调用这个方法;

void layoutContainer(Container parent) :

容器需要布局时会调用这个方法,主要的布局程序写在这里面。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值