【无标题】

前言

        这篇文章会详细介绍如何用Java来完成图形化界面设计,帮助大家完成课程设计或者提高编程的趣味性,避免只能一直和控制台打交道,希望能给大家带来帮助的同时方便自己更好的进行复习。

        PS:文章内容大部分学习自黑马程序员的课程。

目录

1 AWT编程

1.1 AWT简介

1.2 AWT继承体系

2 Component容器

2.1 Component继承体系

2.2 常见API

2.3 容器演示

2.3.1 Window

2.3.2 Panel

2.3.2.0解决乱码问题

2.3.3 ScrollPane

3 LayoutManager布局管理器

3.1 FlowLayout

3.2 BorderLayout

3.3 GridLayout 

3.4 GridBagLayout

3.5 CardLayout

3.6 BoxLayout 

4 AWT中常用组件

4.1 基本组件

4.2 对话框Dialog

4.2.1 Dialog

4.2.2 FileDialog

1 AWT编程

1.1 AWT简介

        Java完成图形化界面编程需要用到AWT和Swing相关的类库。其中AWT全称为抽象窗口工具集(Abstract Window Tookit),它可以为Java应用程序提供基本的图形组件。

1.2 AWT继承体系

        AWT编程中有两个基类:Component和MenuComponent

        Component:代表一个能一图形化方式显示出来,并可与用户交互的对象,例如Button代表一个按钮,Text Field代表一个文本框等。

        MenuComponent:代表图形界面的菜单组件,包括MenuBar(菜单条),MenuItem(菜单项)等子类。

        其体系图如下:

        其中Container是一种特殊的组件(Component),他代表一种容器,可以盛装普通的组件。

        此外,AWT中还有一个非常重要的接口叫LayoutManager,即布局管理器,如果容器中有多个组件,则容器就需要使用LayoutManager来管理这些组建的布局方式。

        下面就依次介绍Container容器和布局管理器LayoutManager

2 Component容器

2.1 Component继承体系

        1.Window是可以独立存在的顶级窗口,默认使用BorderLayout管理其内部组件布局。

        2.Panel可以容纳其他组件,但不能独立存在,它必须内嵌其他容器中使用,默认使用FlowLayout管理其内部组件布局。

        3.ScrollPane是一个带滚动条的容器,它也不能独立存在,默认使用BorderLayout管理其内部组件布局。

2.2 常见API

Component作为基类,提供了如下常用的方法来设置组建的大小,位置,可见性等。

setLocation(int x,int y)   设置组件的位置
setSize(int width,int height) 设置组建的大小
setBounds(int x,int y,int width,int height) 同时设置组件的位置,大小
setVisible(Boolean b)

设置该组件的可见性

Container作为容器根类,提供了如下方法来访问容器的组件

Component add(Component c)向容器中添加其他组件(该组件既可以是普通组件,也可以是容器),并返回被添加的组件
Component getComponentAt(int x,int y)返回指定点的组件
int getComponentCount()返回该容器内组件的数量
Component[] getComponents()返回该容器内所有的组件

2.3 容器演示

2.3.1 Window

        演示代码如下:


   
   
  1. public class WindowDemo {
  2. public static void main( String[] args) {
  3. / / 1.创建一个窗口对象
  4. Frame frame = new Frame( "window窗口演示");
  5. / / 2.指定窗口的位置,大小
  6. frame.setLocation( 100,100);
  7. frame.setSize( 500,300);
  8. / / 3.设置窗口对象可见
  9. frame.setVisible( true);
  10. }
  11. }

        效果如下:

2.3.2 Panel

        演示代码如下:


   
   
  1. public class PanelDemo {
  2. public static void main( String[] args) {
  3. / / 1.要先创建一个window对象,因为panel以及其他的容器都不能独立存在,必须依附于window存在
  4. Frame frame = new Frame( "这里演示Panel");
  5. / / 2.创建一个Panel对象
  6. Panel p = new Panel();
  7. / / 3.创建一个文本框和一个按钮,并且把他们放入到Panel容器中
  8. p. add(new TextField( "这里是一个测试文本"));
  9. p. add(new Button( "这里是一个测试按钮"));
  10. / / 4.把panel放入到window中
  11. frame. add(p);
  12. / / 5.设置window的位置以及大小
  13. frame.setBounds( 100,100,500,300);
  14. / / 6.设置window可见
  15. frame.setVisible( true);
  16. }
  17. }

        效果演示:

         可以看到,我们的按钮中的出现了乱码,至于原因,则是因为我们的idea此时的编码是UTF-8编码,而我们运行程序时,这个Button是由我们当前的Windows操作系统创建的,所以创建时的默认编码是gbk,为了解决乱码问题,我们只需要使该程序的编码和解码一致即可。

2.3.2.0解决乱码问题

具体操作如下:

第一步:找到右上角的“编辑运行/调试配置”对话框,

点击编辑配置(未汉化版的叫做Edit Configurations...)。

 第二步:

找到VM options,在其中填入-Dfile.encoding=gbk

 如果找不到VM options 选项,就输入Alt+V或者点击Modify options,然后点击Add VM options

 

 在填入-Dfile.encoding=gbk后,点击应用即可

2.3.3 ScrollPane

        演示代码如下:


   
   
  1. public class ScrollPaneDemo {
  2. public static void main( String[] args) {
  3. Frame frame = new Frame( "这里演示ScrollPane");
  4. / / 1.创建一个ScrollPane对象
  5. ScrollPane sp = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);
  6. / /ScrollPane.SCROLLBARS_ALWAYS 表示默认自带滚动条
  7. / / 2.往ScrollPane中添加内容
  8. sp. add(new TextField( "这是测试文本"));
  9. sp. add(new Button( "这是测试按钮"));
  10. / / 3.把ScrollPane添加到Frame中
  11. frame. add(sp);
  12. frame.setBounds( 100,100,500,300);
  13. frame.setVisible( true);
  14. }
  15. }

        效果如下:

        我们可以发现,我们的程序明明向ScrollPane容器添加了一个文本框和一个按钮,但却只能看到一个按钮,却看不到文本框,这是因为ScrollPane使用BorderLayout布局管理器的缘故,二BorderLayout导致了该容器中只有一个组件被显示出来,为解决这一问题,就需要我们学习布局管理器的知识,下面介绍LayoutManager布局管理器。

3 LayoutManager布局管理器

        在前面,我们介绍了Component中有一个方法setBounds()可以设置当前容器的位置和大小,但我们需要明确一件事,如果我们手动为组件设置位置和大小的话,就会造成程序的不通用性。

        例如:Labal labal=new Labal("你好,世界");创建了一个labal组件,很多情况下,我们需要让labal组件的宽高和"你好,世界"这个字符串自身的宽高一致,这种大小称为"最佳大小",由于操作系统存在差异,例如在windows上,我们要达到这种效果,需要把宽高设置为100px,20px,而Linux则需要设置为120px,24px。

        由此可见,在不同操作系统下手动设置组件的位置和大小是一种很不好的体验,因为太多组件都需要分别为其设置不同操作系统的位置和大小,工作量太大。为此,Java提供了LayoutManager布局管理器,可以根据运行平台来自动调整组件大小,程序员只需要为容器选择合适的布局管理器即可。

        下面来看LayoutManager布局管理器继承体系:

3.1 FlowLayout

        在FlowLayout布局管理器中 ,组件像流水一样向某个方向排列,遇到边界就折回,从头开始排列。默认情况下,FlowLayout布局管理器从左往右排列所有组件,遇到边界就折回下一行重新开始。

构造方法方法功能
FlowLayout()使用默认的对齐方法和默认的垂直间距、水平间距创建FlowLayout布局管理器

FlowLayout

(int align)

使用指定的对齐方法和默认的垂直间距、水平间距创建FlowLayout布局管理器

FlowLayout

(int align,

int hgap,

int vgap)

使用指定的对齐方法和指定的垂直间距、水平间距创建FlowLayout布局管理器

        FlowLayout中组件的排列方向(从左到右,从右到左,从中间向两边等),该参数应该使用FlowLayout类的静态常量:FlowLayout LEFT、FlowLayout CENTER、FlowLayout RIGHT,默认是左对齐。

        FlowLayout中组件中间距通过整数设置,单位是像素,默认是5个像素。

代码演示:


   
   
  1. public class FlowLayoutDemo {
  2. public static void main( String[] args) {
  3. Frame frame = new Frame( "这里测试FlowLayout");
  4. / / 1.通过setLayout方法设置容器的布局管理器
  5. / / frame.setLayout(new FlowLayout(FlowLayout. LEFT, 20,20));
  6. / /frame.setLayout(new FlowLayout(FlowLayout.CENTER, 20,20));
  7. frame.setLayout(new FlowLayout(FlowLayout. RIGHT, 40,20));
  8. / / 2.添加多个按钮到frame中
  9. for (int i = 1; i <= 100; i + +) {
  10. frame. add(new Button( "按钮" +i));
  11. }
  12. / / 3.设置最佳大小,pack方法
  13. frame.pack();
  14. frame.setVisible( true);
  15. }
  16. }

效果演示:

3.2 BorderLayout

        BorderLayout将容器分为EAST,SOUTH,WEST,CENTER五个区域,普通组件可以被放置在这5个区域的任意一个中。

        BorderLayout布局管理器示意图如下:

        当改变使用BorderLayout的容器大小时,NORTH,SOUTH和CENTER区域水平调整,而EAST,WEST和CENTER区域垂直调整。

        使用BorderLayout注意事项:

        1.当向使用BorderLayout布局管理器的容器中添加组件时,需要指定要添加到哪个区域中,如果没有指定,则默认添加到中间区域。

        2.如果向同一个区域添加多个组件时,后放入的组件会覆盖掉先放入的组件。

构造方法方法功能
BorderLayout()使用默认的水平间距,垂直间距创建BorderLayout布局管理器

BorderLayout

(int hgap,

int vgap)

使用指定的水平间距,垂直间距创建BorderLayout布局管理器

代码演示:


   
   
  1. public class BorderLayoutDemo1 {
  2. public static void main(String[] args) {
  3. Frame frame = new Frame( "这里测试BorderLayout");
  4. //1.给frame设置BorderLayout布局管理器
  5. frame.setLayout( new BorderLayout( 30, 10));
  6. //2.往frame的指定区域添加组件
  7. frame. add( new Button( "北侧按钮"),BorderLayout.NORTH);
  8. frame. add( new Button( "南侧按钮"),BorderLayout.SOUTH);
  9. frame. add( new Button( "东侧按钮"),BorderLayout.EAST);
  10. frame. add( new Button( "西侧按钮"),BorderLayout.WEST);
  11. frame. add( new Button( "中间按钮"),BorderLayout.CENTER);
  12. frame.pack();
  13. frame.setVisible( true);
  14. }
  15. }

效果如下:

        注意:如果不往某个区域放入组件,那么该区域不会空白出来,而是会被其他区域占用。

例如


   
   
  1. public class BorderLayoutDemo2 {
  2. public static void main(String[] args) {
  3. Frame frame = new Frame( "这里测试BorderLayout");
  4. //1.给frame设置BorderLayout布局管理器
  5. frame.setLayout( new BorderLayout( 30, 10));
  6. //2.往frame的指定区域添加组件
  7. frame. add( new Button( "北侧按钮"),BorderLayout.NORTH);
  8. frame. add( new Button( "南侧按钮"),BorderLayout.SOUTH);
  9. frame. add( new Button( "中间按钮"),BorderLayout.CENTER);
  10. frame. add( new TextField( "测试文本框"));
  11. frame.pack();
  12. frame.setVisible( true);
  13. }
  14. }

会得到

        这里东西两侧区域就被中间区域占用了,且中间的按钮被后面的文本框所覆盖。

        如果想要中间按钮和测试文本框都显示出来,可以把中间按钮和测试文本放在一个Panel中,然后把Panel添加到Frame中间去即可,代码演示如下:


   
   
  1. public class BorderLayoutDemo 2 {
  2. public static void main( String[] args) {
  3. Frame frame = new Frame( "这里测试BorderLayout");
  4. / / 1.给frame设置BorderLayout布局管理器
  5. frame.setLayout(new BorderLayout( 30,10));
  6. / / 2.往frame的指定区域添加组件
  7. frame. add(new Button( "北侧按钮"),BorderLayout.NORTH);
  8. frame. add(new Button( "南侧按钮"),BorderLayout.SOUTH);
  9. / / frame. add(new Button( "中间按钮"),BorderLayout.CENTER);
  10. / / frame. add(new TextField( "测试文本框"));
  11. Panel p = new Panel();
  12. p. add(new Button( "中间按钮"));
  13. p. add(new TextField( "测试文本框"));
  14. frame. add(p);
  15. frame.pack();
  16. frame.setVisible( true);
  17. }
  18. }

得到

3.3 GridLayout 

        GridLayout布局管理器将容器分割成纵横线分割的网格,每个网格所占的区域大小相同,当向使用GridLayout布局管理器的容器添加组件时,默认从左向右,从上向下依次添加到每个网格中,与FlowLayout不同的是,放置在GridLayout布局管理器中的各组件的大小由组件所处的区域决定(每个组件将自动占满整个区域)。

GridLayout

(int rows,int cols)

采用指定的行数,列数,以及默认的横向间距,纵向间距将容器分割成多个网格

GridLayout

(int rows,int cols,

int hgap,int vgap)

采用指定的行数,列数,以及指定的横向间距,纵向间距将容器分割成多个网格

下面演示使用Frame+Panel,配合FlowLayout和GridLayout完成一个计算器效果。

代码如下:


   
   
  1. public class GridLayoutDemo {
  2. public static void main( String[] args) {
  3. Frame frame = new Frame( "计算器");
  4. / / 1.创建一个Panel对象,里面存放一个TextFiled组件
  5. Panel p = new Panel();
  6. p. add(new TextField( 30));
  7. / / 2.把当前这个Panel添加到frame的北边区域
  8. frame. add(p,BorderLayout.NORTH);
  9. / / 3.创建一个Panel对象,并且设置它的布局管理器为GridLayout
  10. Panel p 2 = new Panel(); / /Panel的默认布局管理器是FlowLayout
  11. p 2.setLayout(new GridLayout( 3,5,4,4));
  12. / / 4.往Panel中添加内容
  13. for (int i = 0; i < 10; i + +) {
  14. p 2. add(new Button(i + "")); / /放入Button的不能为数字,需要改为字符串
  15. }
  16. p 2. add(new Button( "+"));
  17. p 2. add(new Button( "-"));
  18. p 2. add(new Button( "*"));
  19. p 2. add(new Button( "/"));
  20. p 2. add(new Button( "."));
  21. / / 5.把当前Panel添加到frame中
  22. frame. add(p 2);
  23. frame.pack();
  24. frame.setVisible( true);
  25. }
  26. }

效果如下:

3.4 GridBagLayout

        GridBagLayout布局管理器中,一个组件可以跨越一个或多个网格,并可以设置各个网格的大小各不相同,从而增加布局的灵活性,但实现过程也会很复杂,由于在Swing类库中有更加强大的布局管理器来完成这些效果,因此这里只做介绍,不做演示。

3.5 CardLayout

        CardLayout布局管理器一时间而非空间来管理它里面的组件,它将加入容器的所有组件看成一叠卡片(每个卡片其实就是一个组件),每次只有最上面那个Component才可见。就好像一张扑克牌,每次只要最上面那张扑克可见。

CardLayout()创建默认的CardLayout布局管理器

CardLayout

(int hgap,int vgap)

通过指定卡片与容器左右边界的间距(hgap),上下边界(vgap)的间距来创建CardLayout布局管理器
first(Container target)显示target容器的第一张卡片

last(Container target)

显示target容器的最后一张卡片
previous(Container target)显示target容器的前一张卡片
next(Container target)显示target容器的后一张卡片

show(Container taget,

String name)

显示target容器中指定名字的卡片

下面进行案例演示:


   
   
  1. public class CardLayoutDemo {
  2. public static void main( String[] args) {
  3. Frame frame = new Frame( "这里测试CardLayout");
  4. / / 1.创建一个Panel,用来存储多张卡片
  5. Panel p 1 = new Panel();
  6. / / 2.创建CardLayout对象,并且把该对象设置给之前创建的容器
  7. CardLayout cardLayout = new CardLayout();
  8. p 1.setLayout(cardLayout);
  9. / / 3.往panel中存储多个组件
  10. String[] names = { "第一张", "第二张", "第三张", "第四张", "第五张"};
  11. for (int i = 0; i < names. length; i + +) {
  12. p 1. add(names[i],new Button(names[i]));
  13. }
  14. / / 4.把panel放到frame的中间区域
  15. frame. add(p 1);
  16. / / 5.创建另外一个panel p 2,用来存储多个按钮组件
  17. Panel p 2 = new Panel();
  18. / / 6.创建 5个按钮组件
  19. Button b 1 = new Button( "上一张");
  20. Button b 2 = new Button( "下一张");
  21. Button b 3 = new Button( "第一张");
  22. Button b 4 = new Button( "最后一张");
  23. Button b 5 = new Button( "第三张");
  24. / / 7.创建一个事件监听器,监听按钮的点击动作
  25. ActionListener listener = new ActionListener() {
  26. @ Override
  27. public void actionPerformed(ActionEvent e) {
  28. String actionCommand = e.getActionCommand(); / /这个字符串其实就是按钮上的文字
  29. switch (actionCommand){
  30. case "上一张":
  31. cardLayout.previous(p 1);
  32. break;
  33. case "下一张":
  34. cardLayout. next(p 1);
  35. break;
  36. case "第一张":
  37. cardLayout. first(p 1);
  38. break;
  39. case "最后一张":
  40. cardLayout. last(p 1);
  41. break;
  42. case "第三张":
  43. cardLayout.show(p 1, "第三张");
  44. break;
  45. }
  46. }
  47. };
  48. / / 8.把当前这个时间监听器和多个按钮绑定到一起
  49. b 1.addActionListener(listener);
  50. b 2.addActionListener(listener);
  51. b 3.addActionListener(listener);
  52. b 4.addActionListener(listener);
  53. b 5.addActionListener(listener);
  54. / / 9.把按钮添加到容器p 2
  55. p 2. add(b 1);
  56. p 2. add(b 2);
  57. p 2. add(b 3);
  58. p 2. add(b 4);
  59. p 2. add(b 5);
  60. / / 10.把p 2放到frame的南边区域
  61. frame. add(p 2,BorderLayout.SOUTH);
  62. frame.pack();
  63. frame.setVisible( true);
  64. }
  65. }

效果如下:

3.6 BoxLayout 

        为了简化开发,Swing引入了一个新的布局管理器:BoxLayout,BoxLayout可以在垂直和水平两个方向上摆放GUI组件,BoxLayout提供了一个如下简单的构造器。

BoxLayout

(Container target,

int axis)

指定创建基于target容器的BoxLayout布局管理器,该布局里的组件按照axis方向排列。其中axis有BoxLayout.X_AXIS(横向)和BoxLayout.Y_AXIS(纵向)两个方向

下面演示使用Frame和BoxLayout完成下图效果:

 代码如下:


   
   
  1. public class BoxLayoutDemo 1 {
  2. public static void main( String[] args) {
  3. Frame frame = new Frame( "这里测试BoxLayout");
  4. / / 1.基于frame容器,创建一个BoxLayout对象,并且,该对象存放组件是垂直存放
  5. / /BoxLayout boxLayout = new BoxLayout(frame, BoxLayout.Y_AXIS);
  6. BoxLayout boxLayout = new BoxLayout(frame, BoxLayout.X_AXIS); / /水平排列
  7. / / 2.把BoxLayout对象设置给Frame
  8. frame.setLayout(boxLayout);
  9. / / 3.往frame中添加两个按钮组件
  10. frame. add(new Button( "按钮1"));
  11. frame. add(new Button( "按钮2"));
  12. frame.pack();
  13. frame.setVisible( true);
  14. }
  15. }

        在Java.Swing包中,提供了一个新的容器Box,该容器的默认布局管理器就是BoxLayout,大多数情况下,使用Box容器去容纳多个GUI组件,然后把Box容器作为一个组件,添加到其他容器中,从而形成整体窗口布局。Box容器中提供了两个方法:

static Box createHorizontalBox()创建一个水平排列组件的Box容器
static Box createVerticalBox()创建一个垂直排列组建的Box容器

下面演示使用Frame和Box完成下图效果:

 代码如下:


   
   
  1. public class BoxLayoutDemo 2 {
  2. public static void main( String[] args) {
  3. Frame frame = new Frame( "这里测试BoxLayout");
  4. / / 1.创建一个水平排列组件的Box容器
  5. Box hBox = Box.createHorizontalBo x();
  6. / / 2.往当前容器中添加两个按钮
  7. hBox. add(new Button( "水平按钮1"));
  8. hBox. add(new Button( "水平按钮2"));
  9. / / 3.创建一个垂直排列组件的Box容器
  10. Box vBox = Box.createVerticalBo x();
  11. / / 4.往当前容器中添加两个按钮
  12. vBox. add(new Button( "垂直按钮1"));
  13. vBox. add(new Button( "垂直按钮2"));
  14. / / 5.把两个Box容器添加到Frame中展示
  15. frame. add(hBox,BorderLayout.NORTH);
  16. frame. add(vBox);
  17. frame.pack();
  18. frame.setVisible( true);
  19. }
  20. }

        通过上面两个BoxLayout演示,我们发现,被它管理的容器中的组件之间是没有任何间隔的,但我们前面所学的几种布局管理器中,组件之间都会有一些间隔,如何让BoxLayout中的组件之间也存在间隔呢?

        这就只需要我们在原有的组件需要间隔的地方,手动添加间隔即可,这里的每个间隔可以是一个组件,只是该组件没有内容,仅仅起到分割效果。

        Box类中,提供了以下方便的静态方法来生成这些间隔组件:

static Component

createHorizontalGlue()

创建一条水平Glue

(可在两个方向上同时拉伸的间距)

static Component

createVerticalGlue()

创建一条垂直Glue

(可在两个方向上同时拉伸的间距)

static Component

createHorizontalStrut(int width)

创建一条指定宽度(宽度固定了,不能拉伸)的水平Strut(可在垂直方向上拉伸的间距)

static Component

createVerticalStrut(int height)

创建一条指定高度(高度固定了,不能拉伸)的水平Strut(可在水平方向上拉伸的间距)

下面演示使用Frame和Box完成下图效果:

 代码如下:


   
   
  1. public class BoxLayoutDemo 3 {
  2. public static void main( String[] args) {
  3. Frame frame = new Frame( "这里测试BoxLayout");
  4. / / 1.创建水平排列的Box容器 hBox
  5. Box hBox = Box.createHorizontalBo x();
  6. / / 2.往hBox容器中添加按钮,还需要在多个按钮之间添加分割
  7. hBox. add(new Button( "水平按钮一"));
  8. hBox. add(Box.createHorizontalGlue()); / /该分割在两个方向上都可以拉伸
  9. hBox. add(new Button( "水平按钮二"));
  10. hBox. add(Box.createHorizontalStrut( 30));
  11. hBox. add(new Button( "水平按钮三"));
  12. / / 3.创建垂直排列的Box容器 vBox
  13. Box vBox = Box.createVerticalBo x();
  14. / / 4.往vBox容器中添加按钮,还需要在多个按钮之间添加分割
  15. vBox. add(new Button( "垂直按钮一"));
  16. vBox. add(Box.createVerticalGlue()); / /该分割在两个方向上都可以拉伸
  17. vBox. add(new Button( "垂直按钮二"));
  18. vBox. add(Box.createVerticalStrut( 30));
  19. vBox. add(new Button( "垂直按钮三"));
  20. / / 5.把box容器添加到frame中
  21. frame. add(hBox,BorderLayout.NORTH);
  22. frame. add(vBox);
  23. frame.pack();
  24. frame.setVisible( true);
  25. }
  26. }

4 AWT中常用组件

4.1 基本组件

组件名功能
Button按钮
Canvas用于绘图的画布
Checkbox复选框组件(也可当做单选框组件使用)
CheckboxGroup用于将多个Checkbox组件组合成一组,一组Checkbox组件将只有一个可以被选中,即全部变成单选框组件
Choice下拉选择框
Frame窗口,在GUI程序里通过该类创建窗口
Labal标签类,用于放置提示性文本
List列表框组件,可以添加多项条目
Panel不能单独存在基本容器类,必须放在其他容器中
Scrollbar滑动条组件,如果需要用户输入位于某个范围的值,就可以使用滑动条组件,比如调色板中设置RGB的三个值所用的滑动条,当创建一个滑动条时,必须指定它的方向,初始值,滑块的大小,最小值和最大值
ScollPane带水平即垂直滚动条的容器组件
TextArea多行文本域
TextField单行文本域

        这些AWT组件可以查阅API文档以获取它们各自的详细信息。

下面来用代码实现一个这样的效果:

 代码如下:


   
   
  1. public class BasicComponentDemo {
  2. Frame frame = new Frame( "这里测试基本组件");
  3. TextArea ta = new TextArea( 5,20); / /左上角占大部分的文本框,最多 5行, 20
  4. Choice colorChooser = new Choice(); / /中间左边部分的下拉选择框
  5. CheckboxGroup cbg = new CheckboxGroup(); / /中间部分复选框
  6. Checkbox male = new Checkbox( "男",cbg, true);
  7. Checkbox female = new Checkbox( "女",cbg, false);
  8. Checkbox isMarried = new Checkbox( "是否已婚?");
  9. TextField tf = new TextField( 50); / /左下角的单行文本框
  10. Button ok = new Button( "确认"); / /右下角的确认按钮
  11. List colorList = new List( 6, true); / /右上角列表框
  12. public void init(){
  13. / /组装界面
  14. / /组装底部
  15. Box bBox = Box.createHorizontalBo x(); / /创建一个水平排列组件的Box容器
  16. bBox. add(tf);
  17. bBox. add(ok);
  18. frame. add(bBox,BorderLayout.SOUTH);
  19. / /组装 选择部分
  20. colorChooser. add( "红色");
  21. colorChooser. add( "蓝色");
  22. colorChooser. add( "绿色");
  23. Box cBox = Box.createHorizontalBo x();
  24. cBox. add(colorChooser); / /放下拉选择框
  25. cBox. add(male);
  26. cBox. add(female);
  27. cBox. add(isMarried);
  28. / /组装文本域和选择部分
  29. Box topLeft = Box.createVerticalBo x(); / /创建一个垂直排列组件的Box容器
  30. topLeft. add(ta);
  31. topLeft. add(cBox);
  32. / /组装顶部左边和列表框
  33. colorList. add( "红色");
  34. colorList. add( "绿色");
  35. colorList. add( "蓝色");
  36. Box top = Box.createHorizontalBo x();
  37. top. add(topLeft); / /topLeft也是一个容器,现在作为组件放在新的 top容器里
  38. top. add(colorList);
  39. frame. add( top);
  40. / /设置frame为最佳大小,并且可见
  41. frame.pack();
  42. frame.setVisible( true);
  43. }
  44. public static void main( String[] args) {
  45. new BasicComponentDemo().init();
  46. }
  47. }

4.2 对话框Dialog

4.2.1 Dialog

        Dialog是Window类的子类,是一个容器类,属于特殊组件,对话框是可以独立存在的顶级窗口,因此用法与普通窗口的用法几乎一致,但是使用对话框需要注意以下两点:

        1.对话框通常依赖于其他窗口,就是通常需要有一个父窗口。

        2.对话框有非模式(non-modal)和模式(modal)两种,当某个模式对话框被打开后,该模式对话框总是位于它的父窗口之上,在模式对话框被关闭之前,父窗口无法获得焦点。

Dialog

(Frame owner,

String title,

boolean modal)

创建一个对话框对象:

owner:当前对话框的父窗口

title:当前对话框的标题

modal:当前对话框是否是模式对话框,true/false

下面通过Frame,Button,Dialog实现下图效果:

 代码如下:


   
   
  1. package com.one.component;
  2. import java.awt. *;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. public class DialogDemo 1 {
  6. public static void main( String[] args) {
  7. Frame frame = new Frame( "这里测试Dialog");
  8. / / 1.创建两个对话框Dialog对象,一个模式的,一个非模式的
  9. Dialog d 1 = new Dialog(frame, "模式对话框", true);
  10. Dialog d 2 = new Dialog(frame, "非模式对话框", false);
  11. / / 2.通过setBounds方法设置Dialog的位置以及大小
  12. d 1.setBounds( 20,30,300,200);
  13. d 2.setBounds( 20,30,300,200);
  14. / / 3.创建两个按钮
  15. Button b 1 = new Button( "打开模式对话框");
  16. Button b 2 = new Button( "打开非模式对话框");
  17. / / 4.给这两个按钮添加点击后的行为
  18. b 1.addActionListener(new ActionListener() {
  19. @ Override
  20. public void actionPerformed(ActionEvent e) {
  21. d 1.setVisible( true);
  22. }
  23. });
  24. b 2.addActionListener(new ActionListener() {
  25. @ Override
  26. public void actionPerformed(ActionEvent e) {
  27. d 2.setVisible( true);
  28. }
  29. });
  30. / / 5.把按钮添加到frame中
  31. frame. add(b 1,BorderLayout.NORTH);
  32. frame. add(b 2);
  33. / /设置frame最佳大小并可见
  34. frame.pack();
  35. frame.setVisible( true);
  36. }
  37. }

        继续演示打开对话框后,对话框中根据需求,自定义内容。

代码如下:


   
   
  1. public class DialogDemo 2 {
  2. public static void main( String[] args) {
  3. Frame frame = new Frame( "这里测试Dialog");
  4. / / 1.创建两个对话框Dialog对象,一个模式的,一个非模式的
  5. Dialog d 1 = new Dialog(frame, "模式对话框", true);
  6. / **
  7. * 创建一个垂直的Box容器,把一个文本框和一个按钮添加到Box容器中
  8. * /
  9. Box vBox = Box.createVerticalBo x();
  10. vBox. add(new TextField( 20));
  11. vBox. add(new Button( "确认"));
  12. / /把Box容器添加到Dialog中
  13. d 1. add(vBox);
  14. / / 2.通过setBounds方法设置Dialog的位置以及大小
  15. d 1.setBounds( 20,30,300,200);
  16. / **
  17. * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
  18. * /
  19. / / 3.创建按钮
  20. Button b 1 = new Button( "打开模式对话框");
  21. / / 4.给按钮添加点击后的行为
  22. b 1.addActionListener(new ActionListener() {
  23. @ Override
  24. public void actionPerformed(ActionEvent e) {
  25. d 1.setVisible( true);
  26. }
  27. });
  28. / / 5.把按钮添加到frame中
  29. frame. add(b 1,BorderLayout.NORTH);
  30. / /设置frame最佳大小并可见
  31. frame.pack();
  32. frame.setVisible( true);
  33. }
  34. }

        于是我们的对话框中就有了垂直排列的文本框和确认按钮

4.2.2 FileDialog

        Dialog类还有一个子类:FileDialog,它代表一个文件对话框,用于打开或者保存文件,需要注意的是FileDialog无法指定模态或者非模态,这是因为FileDialog依赖于运行平台的实现,如果运行平台的文件对话框是模态的,那么FileDialog也是模态的,否则就是非模态的。

FileDialog

(Frame parent,

String title,

int mode)

创建一个文件对话框:

parent:指定父窗口

title:对话框标题

mode:文件对话框类型,

如果指定为FileDialog.LOAD,则用于打开文件

如果指定为FileDialog.SAVE,则用于保存文件

String getDirectory()获取被打开或者保存文件的绝对路径
String getFile()获取被打开或者保存文件的文件名

 使用Frame,Button,FileDialog完成下图效果:

 代码如下:


   
   
  1. package com.one.component;
  2. import java.awt. *;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. public class FileDialogTest {
  6. public static void main( String[] args) {
  7. Frame frame = new Frame( "这里测试FileDialog");
  8. / / 1.创建两个FileDialog对象
  9. FileDialog f 1 = new FileDialog(frame, "选择要打开的文件",FileDialog.LOAD);
  10. FileDialog f 2 = new FileDialog(frame, "选择要保存的路径",FileDialog.SAVE);
  11. / / 2.创建两个按钮
  12. Button b 1 = new Button( "打开文件");
  13. Button b 2 = new Button( "保存文件");
  14. / / 3.给这两个按钮设置点击后的行为:获取打开或者保存的路劲文件名
  15. b 1.addActionListener(new ActionListener() {
  16. @ Override
  17. public void actionPerformed(ActionEvent e) {
  18. f 1.setVisible( true); / /选择完毕前,代码会阻塞到这里
  19. / /获取选择的路径及文件
  20. String directory = f 1.getDirectory();
  21. String file = f 1.getFile();
  22. System.out.println( "打开的文件路径为:" +directory);
  23. System.out.println( "打开的文件名称为:" + file);
  24. }
  25. });
  26. b 2.addActionListener(new ActionListener() {
  27. @ Override
  28. public void actionPerformed(ActionEvent e) {
  29. f 2.setVisible( true);
  30. / /获取选择的路径及文件
  31. String directory = f 2.getDirectory();
  32. String file = f 2.getFile();
  33. System.out.println( "保存的文件路径为:" +directory);
  34. System.out.println( "保存的文件名称为:" + file);
  35. }
  36. });
  37. / / 4.把按钮添加到Frame中
  38. frame. add(b 1,BorderLayout.NORTH);
  39. frame. add(b 2);
  40. / /设置frame最佳大小并可见
  41. frame.pack();
  42. frame.setVisible( true);
  43. }
  44. }

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值