GUI编程学习
# GUI编程(图形界面编程)
GUI的核心技术:swing AWT
但是使用不多,原因:
- 界面不美观
- 需要jre环境
AWT
AWT包含了很多的类和接口。其包含的元素包括:窗口,按钮,文本框等。其包名为java.awt,包含关系为:
组件和容器
-
窗口(Frame)
用法如下:
Frame frame = new Frame("newFrame第一个界面窗口"); frame.setVisible(true);//设置窗口可见性 frame.setSize(400, 400);//设置窗口大小 frame.setBackground(new Color(11,45,14));//设置背景颜色 frame.setLocation(200,200);//窗口弹出的初始位置 frame.setBounds(200,200,400,400);//可直接设置窗口初始位置和大小 frame.setResizable(false);//设置窗口不能改变(默认为true,可以改变)
-
面板(Panel)
面板指一个窗口等容器内的一个面板框,可以称作一个区域
它和窗口一样可以执行setBounds()方法,setBackground()方法,注意它的坐标创建是相对于它的上级容器的,譬如这里:
//panel的坐标,是相对于frame的 frame.setBounds(300,300,500,500); frame.setBackground(new Color(11,45,14)); panel.setBounds(50,50,100,100); panel.setBackground(new Color(191,98,10)); frame.add(panel);//将面板加入到窗口内 frame.setVisible(true);//窗口设为可见
得出的结果图为:
-
布局管理器(Layout)
包含:
-
流式布局
public static void flowLayout(){ Frame frame = new Frame(); //组件-按钮 Button button1 = new Button(); Button button2 = new Button(); Button button3 = new Button(); //设置为流式布局 frame.setLayout(new FlowLayout()); //frame.setLayout(new FlowLayout(FlowLayout.LEFT)); 左对齐 //frame.setLayout(new FlowLayout(FlowLayout.RIGHT)); 右对齐 //设置为东西南北中 frame.setSize(200,200); frame.add(button1); frame.add(button2); frame.add(button3); frame.setVisible(true); }
-
东南西北中
public static void borderLayout(){ Frame frame = new Frame(); Button east = new Button(); Button west = new Button(); Button north = new Button(); Button south = new Button(); Button center = new Button(); frame.setLayout(new BorderLayout()); //东南西北中 frame.add(east,BorderLayout.EAST); frame.add(west,BorderLayout.WEST); frame.add(north,BorderLayout.NORTH); frame.add(south,BorderLayout.SOUTH); frame.add(center,BorderLayout.CENTER); frame.setSize(400,400); frame.setVisible(true); }
-
表格布局
public static void grid(){ Frame frame = new Frame(); Button button1 = new Button(); Button button2 = new Button(); Button button3 = new Button(); Button button4 = new Button(); Button button5 = new Button(); Button button6 = new Button(); frame.setLayout(new GridLayout(3,2,1,2));//3行,2列,1列距,2行距 frame.add(button1); frame.add(button2); frame.add(button3); frame.add(button4); frame.add(button5); frame.add(button6); frame.pack();//自动设置合适的大小,布局等的函数 frame.setVisible(true); }
-
-
事件监听。
监听器用来监听外设操作的各种行为,并作出相应的反应,如点击按钮,输入字符等。
public class ActionEventListener { public static void main(String[] args) { Frame frame = new Frame("TEST"); Button button = new Button("start"); Listener listener = new Listener(); button.addActionListener(listener); frame.add(button); frame.setVisible(true); } } //由于ActionListener是接口,不能直接创建对象 //所以用一个类实现后创建对象 class Listener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { System.out.println("已开启"+e.getActionCommand()); System.exit(0); } }
这里注意
getActionCommand()
方法,当使用该监听器的构件调用了setActionCommand()
方法时,此时getActionCommand()
获得的信息为set内的信息,若没有调用则为默认的title信息。 -
文本框TextField
文本框即为一个文本区域,可以在里面键入内容。
class MyFrame extends Frame{ public MyFrame(){ TextField textField = new TextField("输入框"); Button button = new Button(); setBounds(300,300,300,300); textField.addActionListener(new EnterListener()); add(textField); add(button); setVisible(true); pack(); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } } class EnterListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { System.out.println("输入内容为:" + e.getActionCommand()); } }
以下为我的理解:
不同的组件,对加入同样的监听器,会产生不同的反应:
譬如,当创建一个实现类作为监听器实现
ActionListener
接口时,用不同的构建添加该监听器:button.addActionListener(listener); textField.addActionListener(listener);
当使用按钮点击时,会输出内容;而用文本框使用回车,也可以输出内容。
注:相同的组件,对相同监听器,重写的各种监听方法,也会产生不同的反应,因此这些方法之间都是分开的
-
画笔Paint
使用画笔可以在窗口,面板等容器内勾画图像。画笔方法可以直接重写java.awt里面的paint方法,如下:
//画笔 @Override public void paint(Graphics g) { //画笔有颜色 g.setColor(Color.red); //能够画画 g.drawOval(100,100,100,100); g.fillOval(300,300,100,100);//实心的圆 g.setColor(Color.green); g.fillRect(150,200,100,100); //养成习惯,画笔用完还原到最初颜色 g.setColor(Color.black); } }
-
鼠标监听
实现鼠标点击出颜色。
class MouseFrame extends Frame{ //存储每个点的集合 ArrayList<Point> arrayList = new ArrayList(); //画画需要画笔 public MouseFrame(String title){ setVisible(true); setBounds(200,200,500,500); this.addMouseListener(new MyMouseListener());//鼠标监听器 } @Override public void paint(Graphics g) { Iterator iterator = arrayList.iterator(); while (iterator.hasNext()){ Point p = (Point) iterator.next(); g.setColor(Color.red); g.fillOval(p.x,p.y,10,10); } } //适配器模式 private class MyMouseListener extends MouseAdapter{ //按下,每点击一次出一个点 @Override public void mousePressed(MouseEvent e) { MouseFrame frame = (MouseFrame) e.getSource(); Point point = e.getPoint(); frame.arrayList.add(point); //每次点击鼠标之后都需要重画一次 frame.repaint(); } } }
-
窗口监听
该种监听主要监听窗口本身的变化,如关闭窗口,激活窗口等:
class WindowFrame extends Frame { public WindowFrame(String title){ super(title); setVisible(true); setBounds(100,100,400,400); addWindowListener(new WindowAdapter() { //匿名内部类 //激活 @Override public void windowActivated(WindowEvent e) { System.out.println("active"); } //关闭 @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } }
-
键盘监听
class KeyFrame extends Frame { public KeyFrame(String title){ super(title); setVisible(true); setBounds(100,100,500,500); addKeyListener(new KeyAdapter() { //匿名内部类 @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode();//获取当前键盘的码,码有专门对应的值。 if(keyCode == KeyEvent.VK_UP){ System.out.println("上"); } } }); } }
Swing(重点)
Swing里面扩展了很多基于awt没有的UI样式,适用范围更广。
1.JFrame窗口
它实质上是继承了awt包里面的Frame类:
public class JFrame extends Frame implements WindowConstants,
Accessible,
RootPaneContainer,
TransferHandler.HasGetTransferHandler
首先是在一般编程时,我们一般会设置init()
方法用来初始化容器:
public class JFrameDemo {
//init(); 用作初始化
public void init(){
JFrame jf = new JFrame("标题");
jf.setVisible(true);
jf.setBounds(100,100,1000,1000);
JLabel jLabel = new JLabel("hello",JLabel.CENTER);//居中
jf.add(jLabel);
jf.getContentPane().setBackground(Color.green);
//让文本居中
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
//关闭事件,这个方法是JFrame默认的注册关闭操作
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//该参数就是指关闭
}
public static void main(String[] args) {
//建立一个窗口
new JFrameDemo().init();
}
}
这里看代码有一些要注意的:
- 让文本JLable水平对齐,有两种方法:初始化时,即在title后加一个参数,CENTER这里就是居中;设置初始化后,调用水平对齐方法
setHorizontalAlignment()
,CENTER这里指居中。代码里面两个都写了示例。 - swing的操作比awt高级,有些监听器可以不用自己写,直接调用自带方法,例如这里的关闭操作监听器的注册,调用了
setDefaultCloseOperation()
方法,他有四个参数,各自对应不同的关闭操作。 - 要对JFrame窗口,以及之后学的面板,弹窗内颜色进行操作,由于这些都是顶级容器,需要获取他们的内容面板,所以首先需要对这些对象使用
getContenePanel()
方法,获取他们的容器对象Container;之后再调用setBackground()来设置背景。
2.JDialog弹窗
弹窗的操作与上面说的窗口类似,它继承了awt包下的Dialog类。
这里学习过程中了解到上一个说的Container类的另一个操作,也就是对整体布局,要想操作窗口,弹窗等的布局,也需要获取他们的容器对象Container之后再调用setLayout()方法。
3.标签
与以上也类似,即JLabel:
JLabel jLabel = new JLabel(String title,int num);//num指设置JLabel格式对应的常数数值
JLabel jLabel = new JLabel(String text, Icon icon, int horizontalAlignment);//JLabel内加入图标
该标签对应以上方法即可,均可类比。
标签有两个相关接口:
-
Icon
——图标,需要实现类实现三个方法:getIconWidth
,getIconHeight
,paintIcon
之后需要把对应的实现类对象加入到标签对象中:
public void init(){ IconLearning icon = new IconLearning(15,15); //JLabel内加入了图标,而容器内又加入了JLabel JLabel jLabel = new JLabel("label", icon, SwingConstants.CENTER); //************ getContentPane().add(jLabel); setVisible(true); setBounds(100,100,500,500); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); }
以上加入图标为一个点,内容定义到paintIcon方法中了,这里说明一下。
-
问题来了,图标如果是图片怎么办?可以使用imageIcon将标签置为图片图标:
public void init(){ //使用imageIcon,即图片标签对象保存图片 ImageIcon imageIcon = new ImageIcon("C:\\Users\\Administrator\\Pictures"); //将标签设置为图片标签 JLabel jLabel = new JLabel("label",SwingConstants.CENTER); jLabel.setIcon(imageIcon); //************* getContentPane().add(jLabel); setVisible(true); setBounds(100,100,500,500); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); }
也可以套用上面Icon的方法,只是将icon实现类更换为ImageIcon即可:
public void init(){ ImageIcon imageIcon = new ImageIcon("C:\\Users\\Administrator\\Pictures\\result.png"); //JLabel内加入了图标,而容器内又加入了JLabel JLabel jLabel = new JLabel("label", imageIcon, SwingConstants.CENTER); //********************* getContentPane().add(jLabel); setVisible(true); setBounds(100,100,500,500); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); }
4.面板
JPanel与上面的窗口,弹窗类似操作:
public void init(){
Container container = getContentPane();
container.setLayout(new GridLayout(2,1,10,10));
JPanel panel1 = new JPanel(new GridLayout(1,3));
JPanel panel2 = new JPanel(new GridLayout(1,2));
panel1.add(new JButton("1"));
panel1.add(new JButton("1"));
panel1.add(new JButton("1"));
panel2.add(new JButton("2"));
panel2.add(new JButton("2"));
container.add(panel1);
container.add(panel2);
setVisible(true);
setSize(500,500);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
JScrollPanel,为滚动面板,可以有滚动条上下滚动
public void init(){
Container container = getContentPane();
//文本域
JTextArea textArea = new JTextArea();
textArea.setText("sadaskljdklsajdlajdkjaskjhakxckjascjsbakcabkjcbaksajhsdlasdkll");
JScrollPane jScrollPane = new JScrollPane(textArea);
container.add(jScrollPane);
setVisible(true);
setBounds(100,100,400,600);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
5.按钮
也就是JButton,按钮上可以加图标,可以加提示等等:
public void init(){
Container container = getContentPane();
//图片变图标
Icon icon = new ImageIcon("C:\\Users\\Administrator\\Pictures\\result.png");
//把图标加到按钮上
JButton button = new JButton();
button.setIcon(icon);
button.setToolTipText("图片按钮");//提示文本,鼠标移动上去会有提示
container.add(button);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
setBounds(100,100,1000,1000);
}
这里提一下:
单选框
即单选按钮JRadioButton
,N个按钮不能同时选择,只能选择一个,采用JButtonGroup将多个单选框组合一起形成一个组,可以进行单选操作:
//单选框
JRadioButton radioButton1 = new JRadioButton("01");
JRadioButton radioButton2 = new JRadioButton("02");
JRadioButton radioButton3 = new JRadioButton("03");
//单选框N个按钮不能同时选择,只能选择一个
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(radioButton1);
buttonGroup.add(radioButton2);
buttonGroup.add(radioButton3);
container.setLayout(new GridLayout(3,1));
container.add(radioButton1);
container.add(radioButton2);
container.add(radioButton3);
复选框
即多选按钮JCheckBox
,N个按钮可以同时选择。因为可以多选,所以不需要JButtonGroup组合:
//多选框
JCheckBox jCheckBox01 = new JCheckBox("01");
JCheckBox jCheckBox02 = new JCheckBox("02");
JCheckBox jCheckBox03 = new JCheckBox("03");
container.setLayout(new FlowLayout());
container.add(jCheckBox01);
container.add(jCheckBox02);
container.add(jCheckBox03);
6.列表
包括下拉菜单栏,列表框等
-
下拉菜单栏
JComboBox
:指点击后出现下拉菜单进行选择,可以添加监听器,这里不多做演示:public void init(){ Container container = getContentPane(); JComboBox comboBox = new JComboBox(); //添加选项 comboBox.addItem("臭豆腐"); comboBox.addItem("六舅"); comboBox.addItem("柠檬"); comboBox.addItem("奥利给"); container.add(comboBox); setVisible(true); setBounds(100,100,300,300); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); }
-
列表框
JList
:显示对应的输入内容,比如各种数组public void init(){ Container container = getContentPane(); //生成列表的内容 String[] str = {"1","2","3"}; //列表中放入内容 JList list = new JList(str); container.add(list); setVisible(true); setBounds(100,100,300,300); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); }
7.文本框
-
文本框
JTextField
public void init(){ Container container = getContentPane(); //文本框 JTextField jTextField = new JTextField("text"); JTextField jTextField1 = new JTextField("TEXT1",20);//后面的参数指文本里面有限制多少字符 container.add(jTextField,BorderLayout.NORTH); container.add(jTextField1,BorderLayout.SOUTH); setVisible(true); setBounds(100,100,400,600); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); }
-
密码框
JPassWordField
public void init(){ Container container = getContentPane(); JPasswordField field = new JPasswordField(); field.setEchoChar('*');//设置显示的格式 setVisible(true); setBounds(100,100,400,600); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); }
-
文本域
JTextArea
,之前已经提到过JTextArea textArea = new JTextArea(); textArea.setText("sadaskljdklsajdlajdkjaskjhakxckjascjsbakcabkjcbaksajhsdlasdkll");