@源程序来自《Java程序设计标准教程(第二版)》邱加永
12.2 Swing容器
12.2.1 顶层容器
顶层容器可以独立存在,位于java.lang.Swing包层次的顶端,Swing顶层容器类包括JApplet、JFrame、JDialog、JWindow,分别从java.awt包中的Applet、Frame、Dialog和Window类直接衍生出来。
JFrame
import javax.swing.JFrame;
/** JFrame使用示例 */
public class JFrameTest {
public static void main(String[] args) {
//创建一个顶层容器窗口
JFrame frame = new JFrame();
//设置尺寸
frame.setSize(300,300);
//设置它的左上角的坐标
frame.setLocation(300,200);
//一次性设置尺寸和左上角的坐标
frame.setBounds(300,200,300,300);
//设置标题
frame.setTitle("第一个窗体");
//设置不允许调整窗口的大小
frame.setResizable(false);
//设置它的可见性
frame.setVisible(true);
}
}
JDialog
12.2.2通用容器
通用容器是中间容器,它们不能独立存在,必须存放到其他容器中,常用的通用容器有JPanel、JScrollPane、JToolBar、JSplitPane、JTabbedPane。
面板JPanel
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
/** JPanel使用示例 */
public class JPanelTest {
public static void main(String[] args) {
JFrame frame = new JFrame;
frame.setLayout(null); //自由布局
frame.setBounds(300,300,320,320); //边大小
frame.setResizable(false);
frame.setTitle("窗体中添加面板");
JPanel panel = new JPanel(); //创建面板
panel.setBounds(60,50,200,200);
panel.setBackground(new Color(204,204,255)); //面板颜色
frame.add(panel); //将面板加到窗体上
//设置关闭窗口时退出应用程序
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); //显示窗体
}
}
滚动面板JScrollPane
import javax.swing.JFrame;
import javax.swing.JScrollPane;
/** JScrollPane使用示例 */
public class JScrollPaneTest {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setLayout(null); //自由布局
frame.setBounds(300,300,320,320); //边大小
frame.setResizable(false);
frame.setTitle("窗体中添加滚动面板");
//创建指定滚动策略的面板
JScrollPane panel = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScorllPane.HORIZONTAL_SCROLLBAR_ALWAYS);
panel.setBounds(60,50,200,200);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
工具栏JToolBar
import java.awt.BorderLayout;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JToolBar;
/** 工具栏的使用 */
public class JToolBarTest {
public static void main(String[] args) {
//获取指定路径名的图片URL
ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL url1 = loader.getResource("newclass_wiz.gif");
URL url2 = loader.getResource("save_edit.gif");
URL url3 = loader.getResource("delete_edit.gif");
URL url4 = loader.getResource("print_edit.gif");
//创建图标按钮
JButton button1 = new JButton(new ImageIcon(url1));
button1.setToolTipText("新建文件");
JButton button2 = new JButton(new ImageIcon(url2));
button2.setToolTipText("保存文件");
JButton button3 = new JButton(new ImageIcon(url3));
button3.setToolTipText("删除");
JButton button4 = new JButton(new ImageIcon(url4));
button4.setToolTipText("打印");
JToolBar bar = new JToolBar(); //创建工具集
bar.add(button1); //添加图标按钮
bar.add(button2);
bar.addSeparator(); //添加分隔符
bar.add(button3);
bar.add(button4);
bar.setFloatable(true); //设置可浮动
JFrame frame = new JFrame("工具栏使用示例");
frame.add(bar,BorderLayout.NORTH);
frame.setSize(300,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
分割式面板JSplitPane
import javax.swing.JFrame;
import javax.swing.JSplitPane;
/** 分割式面板的使用示例 */
public class JSplitPaneTest {
public static void main(String[] args) {
JFrame frame = new JFrame("分割式面板的使用示例");
frame.setBounds(200,300,400,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//第一个参数指定了分隔的方向,另外两个参数是放置在该分隔窗格的组件
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,new JPanel(),new JPanel());
//设置分隔器是否显示用来展开/折叠分隔器的空间
splitPane.setOneTouchExpandable(true);
//设置分隔器的大小,单位为像素
splitPane.setDeviderSize(8);
//将分隔式面板添加到容器中
frame.add(splitPane);
frame.setVisible(true);
//设置分隔器的位置,可以用整数(像素)或百分比来制定
//用百分比时,需要在JSplitPane为可见后设置才起效
splitPane.setDeviderLocation(0.5);
}
}
选项卡面板JTabbedPane
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
/** 选项卡面板的使用示例 */
public class JTabbedPaneTest {
public static void main(String[] args) {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL iconURL1 = loader.getResource("newclass_wiz.gif");
URL iconURL2 = loader.getResource("save_edit.gif");
//创建选项卡面板,默认把选项卡放在上部
JTabbedPane tabPane = new JTabbedPane();
//创建一个StockPanel面板并添加到选项窗格,并指定图标
tabPane.addTab("选项卡1",new ImageIcon(iconURL1),new JPanel());
tabPane.addTab("选项卡2",new ImageIcon(iconURL2),new JPanel());
//创建一个SaledPanel面板并添加到选项窗格
tabPane.addTab("选项卡3",new JPanel());
//设置所选择的此选项卡窗格的索引
tabPane.setSelectedIndex(1);
JFrame frame = new JFrame("选项卡面板的使用示例");
frame.setBounds(200,300,400,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//将选项窗格放置在面板中
frame.add(tabPane);
frame.setVisible(true);
}
}
12.2.3 专用容器
内部框架JInternalFrame
import javax.swing.JInternalFrame;
import javax.swing.JDesktopPane;
import javax.swing.JPanel;
/** 内部框架使用示例 */
public class JInternalFrameTest {
public static void main(String[] args) {
//创建多文档面板
JDesktopPane desktopPane = new JDesktopPane();
//创建第一个内部框架
JInternalFrame interFrame = new JInternalFrame("内部框架1",true,true,true,true);
interFrame.setBounds(10,10,200,200);
interFrame.setVisible(true);
//添加到多文档面板中
desktopPane.add(interFrame);
//创建第二个内部框架
JInternalFrame interFrame2 = new JInternalFrame("内部框架2",true,true,true,true);
interFrame2.setBounds(150,50,200,200);
interFrame2.setVisible(true);
desktopPane.add(interFrame2);
JFrame frame = new JFrame("内部框架使用示例");
frame.setBounds(200,300,400,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//将多文档面板放置在面板中央位置
frame.add(desktopPane);
frame.setVisible(true);
}
}
12.3
12.4 Swing组件
12.4.2 按钮
常规按钮JButton
JButton btn = new JButton("提交"); //按钮
btn.setBounds(50,420,60,26); //移动组件并调整大小
panel.add(btn); //添加到面板
复选框JCheckBox
JCheckBox hobbyChk1 = new JCheckBox("睡觉");
hobbyChk1.setBounds(80,170,60,26);
panel.add(hobbyChk1); //添加到面板中
JCheckBox hobbyChk2 = new JCheckBox("运动",true);
hobbyChk2.setBounds(150,170,60,26);
panel.add(hobbyChk2);
JCheckBox hobbyChk3 = new JCheckBox("爬山");
hobbyChk3.setBounds(220,170,60,26);
panel.add(hobbyChk3);
单选按钮JRadioButton
ButtonGroup group = new ButtonGroup(); //按钮组
JRadioButton fRdo = new JRadioButton("男",true); //创建一个单选按钮,默认为选中
fRdo.setBounds(80,110,50,26); //移动组件并调整其大小
group.add(fRdo); //添加到按钮组
JRadioButton mRdo = new JRadioButton("女",false); //第二个单选按钮
group.add(mRdo);
文本字段JTextField
JTextField nameTxt = new JTextField();
nameTxt.setBounds(80,50,120,26);
panel.add(nameTxt);
密码框JPasswordField
JPasswordField pwd = new JPasswordField();
pwd.setEchoChar('#'); //设置回显字符
pwd.setBounds(80,80,120,26);
panel.add(pwd);
12.5 布局管理器
每个容器都有一个布局管理器,默认布局管理器的层次关系:
BorderLayout:Window、Frame、Dialog、JFrame、JDialog
FlowLayout:JPanel
12.5.1 FlowLayout
import java.awt
import javax.swing.
/** FlowLayout 布局管理器 */
public class FlowLayoutTest {
public static void main(String[] args) {
JFrame f = new JFrame("FlowLayout布局管理器使用示例");
f.setBounds(300,300,400,300);
JPanel p = new JPanel(); //Panel类
p.setBackground(Color.ORANGE); //Panel为橘黄色
p.setLayout(new FlowLayout());
p.add(new JButton("按钮1")); //在面板上加入5个按钮
p.add(new JButton("按钮2"));
p.add(new JButton("按钮3"));
p.add(new JButton("按钮4"));
p.add(new JButton("按钮5"));
f.add(p); //将面板添加到窗体上
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true); //显示窗体
}
}
12.5.2 BorderLayout
import java.awt
import javax.swing
/** BorderLayout使用示例 */
public class BorderLayoutTest {
public static void main(String[] args) {
//创建一个顶层容器窗口
JFrame frame = new JFrame();
frame.setBounds(200,120,300,300);
frame.setTitle("BorderLayout的示例");
//设置为边框布局管理器(JFrame默认就是边框布局管理器)
BorderLayout borderLayout = new BorderLayout(10,10);
frame.setLayout(borderLayout);
//Panel默认的布局管理器是流式布局管理器
JPanel cPanel = new JPanel();
cPanel.setBackground(Color.RED);
cPanel.add(new JButton("中间1"));
cPanel.add(new JButton("中间2"));
cPanel.add(new JButton("中间3"));
frame.add(cPanel,BorderLayout.CENTER);
frame.add(new JButton("北"),BorderLayout.NORTH);
frame.add(new JButton("南"),BorderLayout.SOUTH);
frame.add(new JButton("东"),BorderLayout.EAST);
frame.add(new JButton("西"),BorderLayout.WEST);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}