已经很久没有做Java界面这一块了,最近公司有项目需求用到j2se,回顾一下顺便记录下来。
开始为Java程序设计图形用户界面时,面临的一个障碍是组件会移动。容器大小发生变化时,容器中的组件将会根据容器的新尺寸重新排列。这种变化对程序员有利,因为它考虑到了界面组件在不同操作系统中的显示方式。对于同一个Java程序,可单击的按钮在Windows、Linux和Mac操作系统中的外观可能不同。
使用一组被称为布局管理器的类来排列界面中的组件,这些类定义了组件如何在容器中显示。界面中的每个容器都有自己的布局管理器。
1、使用布局管理器
1)、FlowLayout管理器
它是面板的默认布局管理器类,使用时,想在页面中排列英文单词那样排列组件:从左到右,当前行没有空间后进入下一行。
当框架中添加进组件时,可以使用如下代码示例来调用浮动的布局:
FlowLayout layout = new FlowLayout();
setLayout(layout);
也可以指定用于特定容器(如JPanle对象)的布局管理器,为此可以使用该容器对象的setLayout()方法。
FlowLayout类仅根据容器的尺寸来排列组件。调整应用程序窗口的大小时,组件将立刻重新排列。将窗口的宽度增大到原来的两倍,将发现所有的JButton组件都显示在同一行。
2)、GridLayout容器
它将容器中所有的组件组织为指定的行数和列数。分配给每个组件的显示区域都相同,因此如果指定3*3的网格,容器将被划分为9个大小相等的区域。
当组件加入到容器中时,GridLayout将所有的组件放置到网格中的某个位置,而且组件是从左向右一次添加,当这一行满了之后,再从下一行的最左边开始添加。下面的语句创建了一个2行3列的网格布局:
GridLayoutgridLayout = new GridLayout(2, 3);
setLayout(gridLayout);
JButton button1 = new JButton("1号按钮");
JButton button2 = new JButton("2号按钮");
JButton button3 = new JButton("3号按钮");
JButton button4 = new JButton("4号按钮");
JButton button5 = new JButton("5号按钮");
add(button1);
add(button2);
add(button3);
add(button4);
add(button5);
使用此布局时,如果组件容纳不下标签文本,将使用省略号(...)表示省略的文本。
3)、BorderLayout管理器
它将容器中的组件放置在特定的位置,该位置有5个方位:东、南、西、北、中。其中4个位置由方向罗盘方向指定,另外一个由中心区域指定。
与GridLayout类相同,BorderLayout也会将所有可用空间都分配给组件。在周围放置4个边界组件后,余下的空间都分配给中央的组件,因此它通常是最大的。下面的语句创建一个使用边界布局的容器:
//参数10,20用于指定组件之间的水平,垂直距离
BorderLayout borderLayout = newBorderLayout(10, 20);
setLayout(borderLayout);
JButton button1 = new JButton("1号按钮");
JButton button2 = new JButton("2号按钮");
JButton button3 = new JButton("3号按钮");
JButton button4 = new JButton("4号按钮");
JButton button5 = new JButton("5号按钮");
add(button1 , BorderLayout.NORTH);
add(button2 , BorderLayout.SOUTH);
add(button3 , BorderLayout.WEST);
add(button4 , BorderLayout.EAST);
add(button5 , BorderLayout.CENTER);
4)、BoxLayout管理器
它可以讲组件排列成一行或一列。使用该布局时,先创建一个放置组件的面板,然后再创建一个布局管理器,它带有两个参数:
以框式布局(box layout)组织的组件;
BoxLayout.Y_AXIS指定垂直排列,BoxLayout.Y_AXIS指定水平排列。
下面的语句创建一个使用BoxLayout的容器:
JPanel panel = new JPanel();
BoxLayout boxLayout = newBoxLayout(panel, BoxLayout.Y_AXIS);
panel.setLayout(boxLayout);
JButton button1 = new JButton("1号按钮");
JButton button2 = new JButton("2号按钮");
JButton button3 = new JButton("3号按钮");
JButton button4 = new JButton("4号按钮");
JButton button5 = new JButton("5号按钮");
panel.add(button1);
panel.add(button2);
panel.add(button3);
panel.add(button4);
panel.add(button5);
add(panel);
5)、使用Insets将组件隔开
在容器中排列组件时,可以使用Insets令组件远离容器边缘,Insets是代表容器边界区域的对象,它有一个接受4个参数的构造函数:在容器上下左右留出的空间。每个参数都以像素为单位,像素是定义框架大小时使用的度量单位。下面的语句创建一个Insets对象:
Insets insets =new Insets(10 , 6 , 10 , 3);
意思是insets对象代表的容器边界:上左下右边缘内10,6,10,3像素。
要想在容器中使用Insets对象,必须覆盖容器的getInsets()方法。该方法不接受任何参数,并返回一个Insets对象,如下所示:
Public InsetsgetInsets(){ return new Insets(50 , 15 ,10 , 15); }
Jframe容器有内置的Insets,用于为标题栏留出空间。当覆盖getInsets()方法并设置自定义值时,过小的insets将导致容器将组件显示在标题栏下面。
2、应用程序的界面布局
到目前为止,布局管理器应用于整个框架:调用框架的setLayout方法,所有组件遵循相同的规则。这适用于有些程序,但使用Swing开发图形用户界面时,将经常发现这些布局管理器都不合适。
解决这种问题的方式之一是,将一组JPanel对象作为容器,用于放置图形用户界面的不同部分。对于其中每部分,可以使用JPanel对象的setLayout()方法设置不同的布局规则。这些面板包含需要包含的组件后,就可以将这些面板直接加入到框架中。
接下来我们将开发一个完整的界面,该程序是一个猜数游戏,确定用户一生中赢得百万大奖的机会。它不断随机生成6个数,知道用户选择的数字与要出的数字相同。界面如下:
源码为:
开始为Java程序设计图形用户界面时,面临的一个障碍是组件会移动。容器大小发生变化时,容器中的组件将会根据容器的新尺寸重新排列。这种变化对程序员有利,因为它考虑到了界面组件在不同操作系统中的显示方式。对于同一个Java程序,可单击的按钮在Windows、Linux和Mac操作系统中的外观可能不同。
使用一组被称为布局管理器的类来排列界面中的组件,这些类定义了组件如何在容器中显示。界面中的每个容器都有自己的布局管理器。
1、使用布局管理器
1)、FlowLayout管理器
它是面板的默认布局管理器类,使用时,想在页面中排列英文单词那样排列组件:从左到右,当前行没有空间后进入下一行。
当框架中添加进组件时,可以使用如下代码示例来调用浮动的布局:
FlowLayout layout = new FlowLayout();
setLayout(layout);
也可以指定用于特定容器(如JPanle对象)的布局管理器,为此可以使用该容器对象的setLayout()方法。
FlowLayout类仅根据容器的尺寸来排列组件。调整应用程序窗口的大小时,组件将立刻重新排列。将窗口的宽度增大到原来的两倍,将发现所有的JButton组件都显示在同一行。
2)、GridLayout容器
它将容器中所有的组件组织为指定的行数和列数。分配给每个组件的显示区域都相同,因此如果指定3*3的网格,容器将被划分为9个大小相等的区域。
当组件加入到容器中时,GridLayout将所有的组件放置到网格中的某个位置,而且组件是从左向右一次添加,当这一行满了之后,再从下一行的最左边开始添加。下面的语句创建了一个2行3列的网格布局:
GridLayoutgridLayout = new GridLayout(2, 3);
setLayout(gridLayout);
JButton button1 = new JButton("1号按钮");
JButton button2 = new JButton("2号按钮");
JButton button3 = new JButton("3号按钮");
JButton button4 = new JButton("4号按钮");
JButton button5 = new JButton("5号按钮");
add(button1);
add(button2);
add(button3);
add(button4);
add(button5);
使用此布局时,如果组件容纳不下标签文本,将使用省略号(...)表示省略的文本。
3)、BorderLayout管理器
它将容器中的组件放置在特定的位置,该位置有5个方位:东、南、西、北、中。其中4个位置由方向罗盘方向指定,另外一个由中心区域指定。
与GridLayout类相同,BorderLayout也会将所有可用空间都分配给组件。在周围放置4个边界组件后,余下的空间都分配给中央的组件,因此它通常是最大的。下面的语句创建一个使用边界布局的容器:
//参数10,20用于指定组件之间的水平,垂直距离
BorderLayout borderLayout = newBorderLayout(10, 20);
setLayout(borderLayout);
JButton button1 = new JButton("1号按钮");
JButton button2 = new JButton("2号按钮");
JButton button3 = new JButton("3号按钮");
JButton button4 = new JButton("4号按钮");
JButton button5 = new JButton("5号按钮");
add(button1 , BorderLayout.NORTH);
add(button2 , BorderLayout.SOUTH);
add(button3 , BorderLayout.WEST);
add(button4 , BorderLayout.EAST);
add(button5 , BorderLayout.CENTER);
4)、BoxLayout管理器
它可以讲组件排列成一行或一列。使用该布局时,先创建一个放置组件的面板,然后再创建一个布局管理器,它带有两个参数:
以框式布局(box layout)组织的组件;
BoxLayout.Y_AXIS指定垂直排列,BoxLayout.Y_AXIS指定水平排列。
下面的语句创建一个使用BoxLayout的容器:
JPanel panel = new JPanel();
BoxLayout boxLayout = newBoxLayout(panel, BoxLayout.Y_AXIS);
panel.setLayout(boxLayout);
JButton button1 = new JButton("1号按钮");
JButton button2 = new JButton("2号按钮");
JButton button3 = new JButton("3号按钮");
JButton button4 = new JButton("4号按钮");
JButton button5 = new JButton("5号按钮");
panel.add(button1);
panel.add(button2);
panel.add(button3);
panel.add(button4);
panel.add(button5);
add(panel);
5)、使用Insets将组件隔开
在容器中排列组件时,可以使用Insets令组件远离容器边缘,Insets是代表容器边界区域的对象,它有一个接受4个参数的构造函数:在容器上下左右留出的空间。每个参数都以像素为单位,像素是定义框架大小时使用的度量单位。下面的语句创建一个Insets对象:
Insets insets =new Insets(10 , 6 , 10 , 3);
意思是insets对象代表的容器边界:上左下右边缘内10,6,10,3像素。
要想在容器中使用Insets对象,必须覆盖容器的getInsets()方法。该方法不接受任何参数,并返回一个Insets对象,如下所示:
Public InsetsgetInsets(){ return new Insets(50 , 15 ,10 , 15); }
Jframe容器有内置的Insets,用于为标题栏留出空间。当覆盖getInsets()方法并设置自定义值时,过小的insets将导致容器将组件显示在标题栏下面。
2、应用程序的界面布局
到目前为止,布局管理器应用于整个框架:调用框架的setLayout方法,所有组件遵循相同的规则。这适用于有些程序,但使用Swing开发图形用户界面时,将经常发现这些布局管理器都不合适。
解决这种问题的方式之一是,将一组JPanel对象作为容器,用于放置图形用户界面的不同部分。对于其中每部分,可以使用JPanel对象的setLayout()方法设置不同的布局规则。这些面板包含需要包含的组件后,就可以将这些面板直接加入到框架中。
接下来我们将开发一个完整的界面,该程序是一个猜数游戏,确定用户一生中赢得百万大奖的机会。它不断随机生成6个数,知道用户选择的数字与要出的数字相同。界面如下:
源码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | package guessyourchance; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.HeadlessException; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class GuessYourChance extends JFrame{ JPanel row1 = new JPanel(); ButtonGroup btgOption = new ButtonGroup(); JCheckBox quickPick = new JCheckBox( "快速选择" , false ); JCheckBox personal = new JCheckBox( "个人的" , true ); JPanel row2 = new JPanel(); JLabel numbersLabel = new JLabel( "你的输入" , JLabel.RIGHT); JTextField[] numbers = new JTextField[6]; JLabel winnersLabel = new JLabel( "中奖数" , JLabel.RIGHT); JTextField[] winners = new JTextField[6]; JPanel row3 = new JPanel(); JButton stop = new JButton( "停止" ); JButton play = new JButton( "开始" ); JButton reset = new JButton( "重置" ); JPanel row4 = new JPanel(); JLabel got3Label = new JLabel( "6中3" , JLabel.RIGHT); JTextField got3 = new JTextField( "0" ); JLabel got4Label = new JLabel( "6中4" , JLabel.RIGHT); JTextField got4 = new JTextField( "0" ); JLabel got5Label = new JLabel( "6中5" , JLabel.RIGHT); JTextField got5 = new JTextField( "0" ); JLabel got6Label = new JLabel( "6中36" , JLabel.RIGHT); JTextField got6 = new JTextField( "0" ); JLabel drawingsLabel = new JLabel( "Drawing" , JLabel.RIGHT); JTextField drawings = new JTextField( "0" ); JLabel yearsLabel = new JLabel( "Years" , JLabel.RIGHT); JTextField years = new JTextField( "0" ); public GuessYourChance() throws HeadlessException { super( "看看你滴运气咋样" ); setSize(500 , 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); GridLayout gridLayout = new GridLayout(5, 1, 10, 10); setLayout(gridLayout); FlowLayout flowLayout1 = new FlowLayout(FlowLayout.CENTER , 10 , 10); btgOption.add(quickPick); btgOption.add(personal); row1.setLayout(flowLayout1); row1.add(quickPick); row1.add(personal); add(row1); GridLayout gridLayout1 = new GridLayout(2, 7, 10, 10); row2.setLayout(gridLayout1); row2.add(numbersLabel); for ( int i = 0; i < 6; i++) { numbers[i] = new JTextField(); row2.add(numbers[i]); } row2.add(winnersLabel); for ( int i = 0; i < 6; i++) { winners[i] = new JTextField(); winners[i].setEditable( true ); row2.add(winners[i]); } add(row2); FlowLayout flowLayout2 = new FlowLayout(FlowLayout.CENTER); row3.setLayout(flowLayout2); stop.setEnabled( false ); row3.add(stop); row3.add(play); row3.add(reset); add(row3); GridLayout gridLayout2 = new GridLayout(2, 3, 20, 10); row4.setLayout(gridLayout2); row4.add(got3Label); row4.add(got3); row4.add(got4Label); row4.add(got4); row4.add(got5Label); row4.add(got5); row4.add(got6Label); row4.add(got6); row4.add(drawingsLabel); row4.add(drawings); drawings.setEditable( false ); row4.add(yearsLabel); row4.add(years); years.setEditable( false ); add(row4); setVisible( true ); } public static void main(String[] args) { GuessYourChance guessYourChance = new GuessYourChance(); } } |
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (1)
-
发一个全局字体设置1234567891011121314151617181920212223242526272829303132333435363738394041public
static
void
loadIndyFont() {
UIManager.put(
"CheckBox.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"Tree.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"Viewport.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"ProgressBar.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"RadioButtonMenuItem.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"FormattedTextField.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"ToolBar.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"ColorChooser.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"ToggleButton.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"Panel.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"TextArea.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"Menu.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"RadioButtonMenuItem.acceleratorFont"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"Spinner.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"Menu.acceleratorFont"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"CheckBoxMenuItem.acceleratorFont"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"TableHeader.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"TextField.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"OptionPane.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"MenuBar.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"Button.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"Label.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"PasswordField.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"InternalFrame.titleFont"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"OptionPane.buttonFont"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"ScrollPane.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"MenuItem.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"ToolTip.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"List.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"OptionPane.messageFont"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"EditorPane.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"Table.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"TabbedPane.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"RadioButton.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"CheckBoxMenuItem.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"TextPane.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"PopupMenu.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"TitledBorder.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
UIManager.put(
"ComboBox.font"
,
new
java.awt.Font(
"宋体"
, 0, 12));
}
站点信息
- 文章2300
- 用户1336
- 访客10872964
每日一句
Care and diligence bring luck.
谨慎和勤奋,带来好运气。
谨慎和勤奋,带来好运气。
新会员