JavaSE12—窗体程序开发(上)
JavaSE12—窗体程序开发(上)
1.JFrame窗体
JFrame类定义了生成窗体的模板,每实例化一个窗体类,就产生了一个窗体。创建窗体后,可以像窗体添加组件,同时为组件添加时间监听器,处理一些最大化,最小化,关闭,调整大小等窗体事件。
定义自己的窗体,最常用的方法就是继承JFrame类并扩展为自己的窗体类,这个扩展的窗体类应该定义好窗体的界面和事件监听以及所有业务处理方法。
JFrame构造方法有以下两种:
public JFrame()
默认构造方法,这种构造方法创建了一个初始不可见,没有标题的新窗口。
public JFrame(String title)
创建一个不可见,具有标题的窗体,窗体的标题为创建窗体给定的String类型的参数。
自定义窗体对象的实例:
import java.awt.BorderLayout;import java.awt.EventQueue;import javax.swing.JFrame;import javax.swing.JLabel;public class DemoFrame extends JFrame {public static void main(String[] args){EventQueue.invokeLater(new Runnable(){public void run(){try{DemoFrame frame = new DemoFrame();frame.setVisible(true);}catch(Exception e){e.printStackTrace();}}});}public DemoFrame(){super();setTitle("JFrameTest");setBounds(100,100,267,118);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JLabel label = new JLabel();label.setText("Hello world");getContentPane().add(label,BorderLayout.CENTER);}}2.为窗体添加面板
窗体作为容器,单独的时候是没有意义的,应该向窗体中添加各种组件。而面板也是一个Swing容器,可容纳其他组件,面板不能像窗体一样单独使用,必须添加到其他容器才能使用。
1)JPanel面板的应用
JPanel面板可以聚集一些组件进行布局,读者首先应该明确的是面板也是一种容器,因为它也继承自java.awt.Container类
JPanel组件作为容器类,除了可以添加组件之外,也可以设置布局管理器,将面板中的组件布局。
实例:在项目中创建JPanelTest类,该类继承JFrame类成为窗体组件,在该类中创建4个JPanel面板组件,并且将它们添加到窗体中。
import java.awt.BorderLayout;import java.awt.Container;import java.awt.GridLayout;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;public class JPanelDemo extends JFrame {public JPanelDemo(){Container c = getContentPane();c.setLayout(new GridLayout(2,2,2,2));//将容器设置成两行两列JPanel p1 = new JPanel(new BorderLayout());JPanel p2 = new JPanel(new BorderLayout());JPanel p3 = new JPanel(new BorderLayout());JPanel p4 = new JPanel(new BorderLayout());p1.add(new JButton("p1"));p2.add(new JButton("p2"));p3.add(new JButton("p3"));p4.add(new JButton("p4"));c.add(p1);c.add(p2);c.add(p3);c.add(p4);setVisible(true);setBounds(100,100,400,300);pack();}public static void main(String[] args){new JPanelDemo();}}2)JScrollPane面板JScrollPane面板是带滚动条的面板,JScrollPane也是一种容器,但是常用于不知单个组件,并且不可以使用布局管理器。如果需要在JScrollPane中放置多个组件,需要将多个组件放置在JPanel面板上,然后将JPanel面板作为一个整体组件添加在JScrollPane组件上。
实例:创建窗体,在窗体中添加带滚动条的面板,并在面板中添加文本域组件。
import java.awt.Color;import java.awt.Container;import javax.swing.JFrame;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.WindowConstants;public class JScrollPaneDemo extends JFrame{public JScrollPaneDemo(){Container c = getContentPane();JTextArea jta = new JTextArea(20,50);JScrollPane jspane = new JScrollPane(jta);c.add(jspane);setTitle("Hello Text");setSize(200,200);setVisible(true);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args){new JScrollPaneDemo();}}3)分割面板
分割面板可以将所在的区域分割成两部分,分开的部分中间有一条分割条分割,可以通过调整分割条的位置来改变这两部分的相对大小,用户可以根据需要进行调整,并且分隔条两侧的每一部分中还可以再放分割面板,实现分割面板的嵌套使用。
创建分割面板:
使用javax.swing.JSplitPane类创建的对象是一个分割面板,该类常用的构造方法如下:
JSplitPane()
JSplitPane(int orient)
JSplitPane(int orient,Component leftC,Component rigthC)
在JSplitPane中包含orient参数:
HORIZONTAL_SPLIT 表示水平方向进行分割
VEWTICAL_SPLIT 表示垂直方向上对分割面板进行分割。
例如:
JSplitPane jspane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
实例:
创建窗体,在该类中创建一个水平分割面板和一个垂直分割面板,并在水平分割面板的左侧和垂直分割面板的上面和下面个放一个标签,然后把垂直分割面板放到水平分割面板的右侧,设置水平分割面板的分割条显示UI小部件。
import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JSplitPane;public class SplitPaneFrameDemo extends JFrame{public SplitPaneFrameDemo(){setTitle("USE SPLITPANE");setBounds(100,100,200,160);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JSplitPane hSplitPane = new JSplitPane(); JButton labelLeft = new JButton("LEFT");final JSplitPane vSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);JLabel labelTop = new JLabel("TOP");JLabel labelBottom = new JLabel("BOTTOM");vSplitPane.setTopComponent(labelTop);vSplitPane.setBottomComponent(labelBottom);vSplitPane.setDividerLocation(40);hSplitPane.setLeftComponent(labelLeft);hSplitPane.setRightComponent(vSplitPane);hSplitPane.setDividerLocation(40);hSplitPane.setOneTouchExpandable(true);//分隔条小部件getContentPane().add(hSplitPane);}public static void main(String[] args){SplitPaneFrameDemo splitPaneFrame = new SplitPaneFrameDemo();splitPaneFrame.setVisible(true);}}4)选项卡面板
选项卡面板可以在窗体中放置多个标签页,每个标签页相当于一个与此选项卡大小相同的容器,在每个标签页中都可以放置一个或多个组件,使每个标签页实现不同页面的效果。javax.swing.JTabbedPane类课创建一个选项卡。
该类的构造方法:
JTabbedPane()
JTabbedPane(int tabPlace)
JTabbedPane(int tabPlace,int tabLayout)
参数tabPlace用于指定选项卡标签显示位置的字段,参数tabLayout指定选项卡面板标签布局的字段。
JTabbedPane类的常用方法见API
实例:创建窗体,在窗体中添加选项卡面板,在第一个选项卡面板中添加一个按钮;在第二个选项卡面板添加复选框;在第三个选项卡面板中添加文本域;在第四个选项卡面板中添加单选按钮。
package qijia.si;import java.awt.BorderLayout;import java.net.URL;import javax.swing.Icon;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JCheckBox;import javax.swing.JFrame;import javax.swing.JRadioButton;import javax.swing.JTabbedPane;import javax.swing.JTextArea;public class JTabblePaneDemo extends JFrame{public JTabblePaneDemo(){super();setTitle("JTabblePaneTEST");setBounds(100,100,220,180);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JTabbedPane tabbedPane = new JTabbedPane();final JButton button = new JButton("Press me");URL url1 = JTabblePaneDemo.class.getResource("1.gif");Icon icon1 = new ImageIcon(url1);tabbedPane.addTab("选项卡一", icon1,button,"这里使用了按钮");final JCheckBox checkBox = new JCheckBox("复选框");tabbedPane.addTab("选项卡二",null,checkBox,null);URL url2 = JTabblePaneDemo.class.getResource("2.gif");Icon icon2 = new ImageIcon(url2);tabbedPane.setIconAt(1, icon2);JTextArea textArea = new JTextArea("文本域");URL url3 = JTabblePaneDemo.class.getResource("3.gif");Icon icon3 = new ImageIcon(url3);tabbedPane.addTab("选项卡三", icon3,textArea,null);tabbedPane.setToolTipTextAt(2, "这是文本域");final JRadioButton radioButton = new JRadioButton("单选按钮");URL url4 = JTabblePaneDemo.class.getResource("4.gif");Icon icon4 = new ImageIcon(url4);tabbedPane.addTab("选项卡四", icon4,radioButton,null);getContentPane().add(tabbedPane,BorderLayout.CENTER);}public static void main(String[] args){JTabblePaneDemo tabbedPaneFrame = new JTabblePaneDemo();tabbedPaneFrame.setVisible(true);}}