1)常用的容器类,Frame和Panel
java.awt.Frame类:
public class Frame extends Window{}
java.awt.Frame是带有标题和边框的顶层窗口,它是java.awt.Window类的直接子类
例如:
Frame frame = new Frame();
frame.setTitle("我的容器");
frame.setSize(500,500);
frame.setLocation(700, 300);
frame.setBackground(Color.lightGray);
frame.setResizable(true);
frame.setVisible(true);
注:frame要显示出来,最后一定要设置它的的可见性为true
思考:怎么能让窗口每次位于屏幕的正中间
Toolkit toolkit = Toolkit.getDefaultToolkit();
int width = (int) toolkit.getScreenSize().getWidth();
int height = (int) toolkit.getScreenSize().getHeight();
java.awt.Panel类:
public class Panel extends Container{}
Panel是最简单的容器类,也成为面板,应用程序可以将其他组件放在面板提供的空间内,这些组件包括其他面板(嵌套)。
注:Panel面板不能单独显示,必须把它放到Frame中
例如:运行后显示不了,设置Panel的大小位置以及可见性也没用
Panel panel = new Panel();
panel.setSize(400, 400);
panel.setLocation(700, 300);
panel.setBackground(Color.blue);
panel.setVisible(true);
例如:运行后可以显示
Frame frame = new Frame();
Panel panel = new Panel();
panel.setBackground(Color.blue);
frame.setSize(400, 400);
frame.setLocation(700, 300);
frame.add(panel);
frame.setVisible(true);
2)常用的容器类,JFrame JPanel
javax.swing.JFrame类:
public class JFrame extends Frame{}
例如:
JFrame jFrame = new JFrame();
jFrame.setTitle("我的容器");
jFrame.setResizable(true);
jFrame.setSize(500,500);
jFrame.setLocation(700, 300);
jFrame.setBackground(Color.lightGray);
jFrame.setVisible(true);
javax.swing.JPanel类:
public class JPanel extends JComponent
JPanel是一般轻量级容器,作用及用法和java.awt.Panel类似,它也是不能单独显示的。
3)常用的组件类(主要以Swing的为主,除非Swing中没有该组件)
javax.swing.JButton 按钮
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
JButton btn = new JButton("登录");
panel.add(btn);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
javax.swing.JCheckBox 复选框
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
JCheckBox jck1 = new JCheckBox("篮球");
JCheckBox jck2 = new JCheckBox("足球");
panel.add(jck1);
panel.add(jck2);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
javax.swing.ButtonGroup 按钮组
javax.swing.JRadioButton 单选框
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
//需要把俩个单选按钮放到ButtonGroup中,表示为一组
ButtonGroup bg = new ButtonGroup();
JRadioButton rbtn1 = new JRadioButton("男");
JRadioButton rbtn2 = new JRadioButton("女",true);
bg.add(rbtn1);
bg.add(rbtn2);
panel.add(rbtn1);
panel.add(rbtn2);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
java.awt.Choice 下拉菜单
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
Choice ColorChooser = new Choice();
ColorChooser.add("Green");
ColorChooser.add("Red");
ColorChooser.add("Blue");
panel.add(ColorChooser);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
javax.swing.JComboBox 下拉菜单
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
JComboBox
box.addItem("test1");
box.addItem("test2");
box.addItem("test3");
panel.add(box);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
javax.swing.ImageIcon 图片/图标
javax.swing.JLabel 标签(可放置文本和图片)
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
JLabel label1 = new JLabel("大家好");
JLabel label2 = new JLabel();
label2.setIcon(new ImageIcon("src/com/briup/test/1.png"));
panel.add(label1);
panel.add(label2);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
注:按钮上也能类似的设置图片
javax.swing.JList 显示数据列表并且允许用户选择一个或多个项的组件(按住ctrl键多选)
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
String[] data = {"one", "two", "three", "four"};
JList
panel.add(myList);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
javax.swing.JScrollBar 滚动条
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
//垂直 VERTICAL, 水平 HORIZONTAL
JScrollBar bar = new JScrollBar(JScrollBar.HORIZONTAL);
bar.setPreferredSize(new Dimension(200, 20));
bar.setMinimum(0);
bar.setMaximum(100);
bar.setValue(50);
panel.add(bar);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
javax.swing.JTextArea 文本域
javax.swing.JScrollPane 滚动面板(一般结合其他组件使用)
例如:结合文本域
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
//需要给panel换一个布局管理器
panel.setLayout(new BorderLayout());
JTextArea area = new JTextArea();
area.setSize(100, 100);
JScrollPane scrollPane = new JScrollPane(area);
panel.add(scrollPane);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
javax.swing.JTextField 文本框
javax.swing.JPasswordField 密码框
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
JTextField field = new JTextField(10);
JPasswordField passwordField = new JPasswordField(10);
panel.add(field);
panel.add(passwordField);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
javax.swing.JMenuBar 菜单栏
javax.swing.JMenu 菜单
javax.swing.JMenuItem 菜单项
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
JMenuBar mBar = new JMenuBar();
JMenu sMenu, gMenu;
sMenu = new JMenu("系统");
gMenu = new JMenu("工具");
JMenuItem sItem, cItem, tItem;
sItem = new JMenuItem("开始导航");
cItem = new JMenuItem("刷新系统");
tItem = new JMenuItem("退出系统");
sMenu.add(sItem);
sMenu.addSeparator();
sMenu.add(cItem);
sMenu.addSeparator();
sMenu.add(tItem);
JMenuItem xyItem, ycItem;
xyItem = new JMenuItem("显示菜单");
ycItem = new JMenuItem("隐藏菜单");
gMenu.add(xyItem);
gMenu.addSeparator();
gMenu.add(ycItem);
mBar.add(sMenu);
mBar.add(gMenu);
panel.add(mBar);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
javax.swing.JDialog 对话框
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
JButton okBut = new JButton("确定");
//参数1 对话框属于哪个窗口
//参数2 对话框标题
//参数3 弹框对话框后,是否阻止用户进行其他组件的操作
JDialog dialog = new JDialog(jFrame, "提示信息", true);
dialog.setBounds(730, 325, 350, 150);
dialog.setLayout(new FlowLayout());
dialog.add(okBut);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
dialog.setVisible(true);
注:之后可以通过鼠标点击控制对话框的出现和消失
javax.swing.JProgressBar 进度条
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
JProgressBar bar = new JProgressBar();
//最小值为0
bar.setMinimum(0);
//最大值为100
bar.setMaximum(100);
//设置进度条中的值初始为0
bar.setValue(0);
//显示当前进度条的状态
bar.setStringPainted(true);
panel.add(bar);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
bar.setValue(40);
java.awt.Canvas 画布
注:必须为Canvas创建子类并重写paint方法
例如:
JFrame jFrame = new JFrame();
final JPanel panel = new JPanel();
Canvas canvas = new Canvas(){
@Override
public void paint(Graphics g) {
g.drawLine(0, 0, panel.getWidth(), panel.getHeight());
}
};
panel.setLayout(new BorderLayout());
panel.add(canvas);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
注:尝试在画布对象创建完后,添加如下代码观察效果
canvas.addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
int x = e.getX();
int y = e.getY();
Graphics g = canvas.getGraphics();
g.setColor(Color.RED);
g.fillOval(x, y, 10, 10);
}
});
注:addMouseMotionListener和addMouseListener所支持的事件是有区别的
4)常用的布局管理器的使用
注: JFrame的布局管理器默认是BorderLayout
JPanel的布局管理器默认是FlowLayout
BorderLayout 边界布局管理器
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
JButton north,south,west,east,center;
north = new JButton("north");
south = new JButton("south");
west = new JButton("west");
east = new JButton("east");
center = new JButton("center");
//把按钮添加到panel中,并指明添加到的位置
panel.add(north,BorderLayout.NORTH);
panel.add(south,BorderLayout.SOUTH);
panel.add(west,BorderLayout.WEST);
panel.add(east,BorderLayout.EAST);
//panel.add(center)这样写和下面的效果是一样的
//如果你不指定放到BorderLayout那个位置的时候
//他会默认的把组件放到中间那个位置
panel.add(center,BorderLayout.CENTER);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
FlowLayout 流式布局管理器
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
JButton[] buts = new JButton[50];
for(int i=1;i<=buts.length;i++){
if(i<10){
buts[i-1] = new JButton("0"+i);
}else if (i<=50) {
buts[i-1] = new JButton(""+i);
}
panel.add(buts[i-1]);
}
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
GridLayout 网格布局管理器
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(3,3));
JButton[] buts = new JButton[9];
//设置container的布局管理器为GridLayout
//GridLayout(3,3)表示布局为3行3列
//循环创建按钮并放到panel中
for(int i=0;i
panel.add(buts[i]);
}
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
CardLayout 卡片布局管理器
例如:
JFrame jFrame = new JFrame();
final JPanel panel = new JPanel();
panel.setLayout(new CardLayout());
JPanel[] jPanels = new JPanel[4];
//创建四个JPanel放到数组中并设置背景颜色
jPanels[0] = new JPanel();
jPanels[0].setBackground(Color.red);
jPanels[1] = new JPanel();
jPanels[1].setBackground(Color.blue);
jPanels[2] = new JPanel();
jPanels[2].setBackground(Color.cyan);
jPanels[3] = new JPanel();
jPanels[3].setBackground(Color.green);
//向CardLayout布局管理器中放置组件的时候一定要给组件起一个名字
panel.add("a",jPanels[0]);
panel.add("b",jPanels[1]);
panel.add("c",jPanels[2]);
panel.add("d",jPanels[3]);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);
注:现在所看到的结果是四个颜色不同的JPanel叠在一起的效果,看到是最上面一个JPanel
可以在上面例子中加入以下代码,看效果如何.
panel.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
//获得panel容器上面的布局管理器
//并转为CardLayout类型的对象
CardLayout cl = (CardLayout) panel.getLayout();
//显示CardLayout管理器中的下一个组件
//这个参数表示:在哪一个容器中设置的这个CardLayout管理器
cl.next(panel);
//cl.show(panel, "d");
}
});
注:JPanel和JPanel之间可以嵌套,每个JPanel又可以设置为不同的布局管理器,这样就可以得到大都数想要的组件布局情况了
自定义组件位置
有些时候也可以不使用任何布局管理器,用户通过坐标自己设置组件位置。
例如:
JFrame jFrame = new JFrame();
JPanel panel = new JPanel();
//把布局管理器设置为null
//表示不使用任何管理器
panel.setLayout(null);
JButton btn = new JButton("登录");
//设置组件的大小和位置
btn.setSize(100,30);
btn.setLocation(80,60);
panel.add(btn);
jFrame.setSize(400, 400);
jFrame.setLocation(700, 300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(panel);
jFrame.setVisible(true);