第三节:其它容器
在Java Swing开发中,窗体部分除了可以使用JFrame表示之外,还有其他几种常见的窗体:JPanel,JSplitPanel,JTabbedPane,JScrollPane,JdesktopPane,JInternalFrame等,下面就简单介绍几种
JPanel
JPanel也是经常使用的容器之一,可以使用JPanel完成各种复杂的界面显示。在JPanel中可以加入人意的组件,之后直接讲JPanel容器加入到JFrame中即可显示。JPanel常用方法如下:
Public JPanel() //创建一个默认的JPanel对象,使用流布局管理
Public JPanel(LayoutManager Layout)//创建一个指定布局管理器的JPanel对象
JPanel的基本使用
import java.awt.GridLayout;
import java.io.File;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class JavaSwingTest {
public static void main(String args[]){
test1();
}
//设置JPanel
public static void test1(){
JFrame jFrame=new JFrame("Welcome to MichaelLee!");
JPanel panel=new JPanel();//如果不添加布局管理器,则默认为使用流布局管理器
//JPanel panel=new JPanel(new GridLayout(3, 3));
panel.add(new JLabel("标签-A"));
panel.add(new JLabel("标签-B"));
panel.add(new JLabel("标签-C"));
panel.add(new JButton("按钮A"));
panel.add(new JButton("按钮B"));
panel.add(new JButton("按钮C"));
jFrame.add(panel);
jFrame.setSize(400,300);
jFrame.setLocation(400,300);
jFrame.setVisible(true);
}
从程序的运行结果来看,所有的组件都是采用顺序的形式加入到JPanel中,最后再将JPanel加入到JFrame中,使用JPanel并结合布局管理器可以更加方便的管理组件,可以使用布局管理器对多个JPanel进行排列,而每个JPanel中也可以分别使用不同的布局管理器管理组件,这样就可以对组件进行复杂的排列。
在一般的图形界面中如果显示的区域不够大,可以加入滚动条方便用户浏览,在Swing中JScrollPane的主要功能就是为显示的内容加上滚动条,JScrollPane常用方法级常量。
static final int HORIZONTAL_SCROLLBAR_AS_NEEDED//始终显示水平滚动条
static final int HORIZONTAL_SCROLLBAR_AS_NEEDED//任何情况都不显示水平滚动条
static final int HORIZONTAL_SCROLLBAR_NEVER//根据自身需要显示水平滚动条
static final int VERTICAL_SCROLLBAR_ALWAYS//始终显示垂直滚动条
static final int VERTICAL_SCROLLBAR_AS_NEEDE////根据自身需要显示垂直滚动条
static final int VERTICAL_SCROLLBAR_NEVER//任何情况都不显示垂直滚动条
public JSCrollPane(Component view)//将指定的组件加入滚动条,根据大小显示水平或垂直滚动条
//设置JScorePane
public static void test2(){
JFrame jFrame=new JFrame("Welcome to MichaelLee!");
String picPath="D:"+File.separator+"孙燕姿.jpg";
Icon icon=new ImageIcon(picPath);
JPanel panel=new JPanel();
JLabel label=new JLabel(icon);
panel.add(label);
JScrollPane scr1=null;
//垂直滚动条始终显示,水平滚动条根据需要显示
scr1=new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
jFrame.add(scr1);
jFrame.setSize(230,200);
jFrame.setLocation(400,300);
jFrame.setVisible(true);
}
由于图片的大小已经超过了容器的本身,所以只显示了部分内容。水平滚动条是根据需要来显示的,而垂直滚动条是始终显示的,可以通过改变窗口的大小来查看效果。
文本组件:
各个软件系统中都存在文本框,以方便用户输入数据,在Swing中也提供了同样的文本框组件:
单行文本框:JTextField
密码文本框:JPasswordField
多行文本框:JTextArea
JTextComponent的常用方法:
Public String getText()//返回文本框的所有内容
Public String getSelectedText()//返回文本框选定的内容
Public int getSelectedStart()//返回文本框选定内容的开始点
Public int getSelectedEnd()//返回文本框选定内容的结束点
Public void setText()//设置此文本框的内容
Public void select(int selectionStart,int selectionEnd)//将指定开始点和结束点之间的内容选定
单行输入文本框:
如果要实现一个单行的输入文本,则可以使用JtextField
Public JtextField()//构造了一个默认的文本框
Public JtextField(String text)//构造了一个指定文本内容的文本框
Public void setColumns(int columns)//设置显示长度
//使用JTextField定义普通单行布局框
public static void test3(){
JFrame frame=new JFrame("Welcome to MichaelLee");
JTextField name=new JTextField(30);
JTextField noed=new JTextField("mldn",10);
JLabel nameLabel=new JLabel("输入用户姓名!");
JLabel noedLabel=new JLabel("不可编辑文本");
noed.setEnabled(false);
name.setColumns(30);
noed.setColumns(10);
frame.setLayout(new GridLayout(2,2));
frame.add(nameLabel);
frame.add(name);
frame.add(noedLabel);
frame.add(noed);
frame.setSize(300,100);
frame.setLocation(300,200);
frame.setVisible(true);
}
从效果来看虽然使用setColumns()设置了显示的行数,但在显示上并没有任何的改变,主要是GridLayout在设置时会忽略这些设置值,让每一个格子具有相同的大小。如果要解决这样的问题,可以使用绝对布局。
//使用绝对定位显示
public static void test4(){
JFrame frame=new JFrame("Welcome to MichaelLee");
JTextField name=new JTextField(30);
JTextField noed=new JTextField("mldn",10);
JLabel nameLabel=new JLabel("输入用户姓名!");
JLabel noedLabel=new JLabel("不可编辑文本");
noed.setEnabled(false);
/*name.setColumns(30);
noed.setColumns(10);*/
nameLabel.setBounds(10,10,100,20);
noedLabel.setBounds(10,30,100,20);
name.setBounds(110,10,80,20);
noed.setBounds(110,30,50,20);
frame.setLayout(null);//这一句很重要,不写这一句程序就不知道是绝对定位
frame.add(nameLabel);
frame.add(name);
frame.add(noedLabel);
frame.add(noed);
frame.setSize(300,100);
frame.setLocation(300,200);
frame.setVisible(true);
}
密文输入组件:
JTextField是使用明文方式进行显示的,现在需要将回显的内容设置成其他字符,则可以使用JPassWordField
常用方法
Public JPasswordField()//构造默认的JPasswordField对象
Public JPasswordField(String text)//构造指定内容的JPasswordField对象
Public char setEchoChar(char c)//设置回显字符,默认为”*”
Public char getEchoChar()//得到回显字符
Public char[] getPassword()//得到此文本框的所有内容
//设置密文输入组件
public static void test5(){
JFrame frame=new JFrame("Welcome to MichaelLee");
JPasswordField jpf1=new JPasswordField();
JPasswordField jpf2=new JPasswordField();
jpf2.setEchoChar(‘#‘);
JLabel Label1=new JLabel("默认的回显:");
JLabel Label2=new JLabel("回显设置‘#’:");
/*name.setColumns(30);
noed.setColumns(10);*/
Label1.setBounds(10,10,100,20);
Label2.setBounds(10,30,100,20);
jpf1.setBounds(110,10,80,20);
jpf2.setBounds(110,30,80,20);
frame.setLayout(null);//这一句很重要,不写这一句程序就不知道是绝对定位
frame.add(Label1);
frame.add(jpf1);
frame.add(Label2);
frame.add(jpf2);
frame.setSize(300,100);
frame.setLocation(300,200);
frame.setVisible(true);
}
在文本框中输入内容,第一个密文框是默认的字符*号,第二个是#号
多行文本输入组件:
可以使用JTextArea实现多行文本的输入
Public JTextArea()//构造文本域,行数和列数为0
Public JTextArea(int rows,int columns)//构造文本域,指定文本域的行数和列数
Public JTextArea(String text,int rows,int columns)//指定构造文本与的内容,行数和列数
Public void append(String str)//向文本域中追加内容
Public void replaceRange(String str,int start,int end)//替换文本与中指定范围内的内容
Public void insert(String str,int pos)//向文本域中指定位置插入内容
Public void setLineWrap(boolean wrap)//是指换行策略
//使用TextArea
public static void test6(){
JFrame frame=new JFrame("Welcome to MichaelLee");
JTextArea jta=new JTextArea(3,10);
JLabel label=new JLabel("多行文本域:");
label.setBounds(10,10,120,20);
jta.setBounds(130,10,150,100);
frame.setLayout(null);
frame.add(label);
frame.add(jta);
frame.setSize(300,150);
frame.setLocation(300,200);
frame.setVisible(true);
}
如果一个文本域过大,则可以在文本域中添加滚动条。
//设置多行文本域,并加入滚动条
public static void test7(){
JFrame frame=new JFrame("Welcome to MichaelLee");
JTextArea jta=new JTextArea(3,20);
//jta.setLineWrap(true);//如果内容过长,自动换行
JScrollPane scr1=null;
//垂直滚动条始终显示,水平滚动条根据需要显示
scr1=new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
JLabel label=new JLabel("多行文本域:");
frame.setLayout(new GridLayout(2,1));
frame.add(label);
frame.add(scr1);
frame.setSize(300,150);
frame.setLocation(300,200);
frame.setVisible(true);
}