佈局管理編程演示:
§流佈局管理器(FlowLayout):
import javax.swing.*;
import java.awt.*;
public class FlowLayoutDemo extends JFrame{
JPanel p;
JLabel lblUser;
JTextField txtUser;
JButton btnCheck,btnExit;
public FlowLayoutDemo(){
super("流佈局演示");
setSize(250,150);
p=new JPanel();
p.setLayout(new FlowLayout());
getContentPane().add(p);
lblUser=new JLabel("用戶名:");
txtUser=new JTextField(16);
btnCheck=new JButton("檢測用戶名");
btnExit=new JButton("退出");
p.add(lblUser);
p.add(txtUser);
p.add(btnCheck);
p.add(btnExit);
setVisible(true);
}
public static void main(String[] args) {
new FlowLayoutDemo();
}
}
§邊界佈局管理器(BorderLayout): import javax.swing.*;
import java.awt.*;
public class BorderLayoutDemo extends JFrame{
JPanel p;
JButton b1,b2,b3,b4;
JTextArea ta;
public BorderLayoutDemo(){
super("邊界佈局演示");
setSize(250,150);
p=new JPanel();
p.setLayout(new BorderLayout());
getContentPane().add(p);
b1=new JButton("East");
b2=new JButton("West");
b3=new JButton("North");
b4=new JButton("South");
ta=new JTextArea("Center");
p.add(b1,"East");
p.add(b2,BorderLayout.WEST);
p.add("North",b3);
p.add("South",b4);
p.add(ta,"Center");
setVisible(true);
}
public static void main(String[] args) {
new BorderLayoutDemo();
}
} §網格佈局管理器(GridLayout): import javax.swing.*;
import java.awt.*;
public class GridLayoutDemo extends JFrame{
JPanel p;
JButton b1,b2,b3,b4;
JTextArea ta;
JTextField tf;
public GridLayoutDemo(){
super("網格佈局演示");
setSize(250,150);
p=new JPanel();
p.setLayout(new GridLayout(3,2));
getContentPane().add(p);
b1=new JButton("one");
b2=new JButton("two");
b3=new JButton("three");
b4=new JButton("four");
ta=new JTextArea("JTextArea");
tf=new JTextField("JTextField");
p.add(b1);
p.add(b2);
p.add(b3);
p.add(b4);
p.add(ta);
p.add(tf);
setVisible(true);
}
public static void main(String[] args) {
new GridLayoutDemo();
}
} §網格袋佈局管理器(GridBagLayout): import javax.swing.*;
import java.awt.*;
public class GridBagLayoutDemo extends JFrame{
JPanel p;
JTextArea ta;
JTextField tf;
JButton b1,b2;
JLabel l1,l2;
GridBagConstraints gbc;
GridBagLayout gbl;
private void addComponent(Component c,GridBagLayout g
,GridBagConstraints gc,int column ,int row,int width,int height)
{
gc.gridx=column;//指定包含組件的顯示區域開始邊的單元格
gc.gridy=row;//指定位於組件顯示區域的頂部的單元格
gc.gridwidth=width;//指定在組件顯示區域的一行中的單元格數
gc.gridheight=height;//指定在組件顯示區域的一列中的單元格數
g.setConstraints(c, gc);//設置此佈局中指定組件的約束條件
p.add(c);
}
public GridBagLayoutDemo(){
super("網格袋佈局演示");
setSize(250,150);
p=new JPanel();
gbc=new GridBagConstraints();
gbl=new GridBagLayout();
p.setLayout(gbl);
getContentPane().add(p);
ta=new JTextArea("我是文本域",5,10);
b1=new JButton("我是按鈕b1.");
b2=new JButton("我是按鈕b2");
tf=new JTextField("我是文本框");
l1=new JLabel("我是一個標簽");
l2=new JLabel("我是另一個標簽");
//佈局JTextArea
gbc.weightx=0;//指定如何分佈額外的水平空間
gbc.weighty=0;//指定如何分佈額外的垂直空間
//BOTH:在水平方向和垂直方向上同時調整組件大小
//fill:當組件的顯示區域大於它所請求的顯示區域的大小時使用此字段
gbc.fill=GridBagConstraints.BOTH;
addComponent(ta,gbl,gbc,0,0,1,3);
//佈局按鈕b1
gbc.fill=GridBagConstraints.HORIZONTAL;
addComponent(b1,gbl,gbc,1,0,2,1);
//佈局按鈕b2
gbc.fill=GridBagConstraints.HORIZONTAL;
addComponent(b2,gbl,gbc,1,1,2,1);
setVisible(true);
//佈局文本框tf
gbc.fill=GridBagConstraints.BOTH;
addComponent(tf,gbl,gbc,1,2,2,1);
setVisible(true);
//佈局標簽l1
gbc.fill=GridBagConstraints.BOTH;
addComponent(l1,gbl,gbc,0,3,2,1);
setVisible(true);
//佈局標簽l2
gbc.fill=GridBagConstraints.BOTH;
addComponent(l2,gbl,gbc,1,3,2,1);
setVisible(true);
}
public static void main(String[] args) {
new GridBagLayoutDemo();
}
}
§卡片佈局管理器(CardLayout): import javax.swing.*;
import java.awt.*;
public class CardLayoutDemo extends JFrame{
CardLayout cl;
JPanel p;
JButton b1,b2,b3,b4;
public CardLayoutDemo(){
super("卡片佈局演示");
setSize(150,250);
cl=new CardLayout();
p=new JPanel();
p.setLayout(cl);
getContentPane().add(p);
b1=new JButton("我是第一張卡片");
b2=new JButton("我是第二張卡片");
b3=new JButton("我是第三張卡片");
b4=new JButton("我是第四張卡片");
p.add("b1",b1);
p.add("b2",b2);
p.add("b3",b3);
p.add("b4",b4);
setVisible(true);
while(true){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
cl.next(p);
}
}
public static void main(String[] args) {
new CardLayoutDemo();
}
} §盒式佈局管理器(BoxLayout): import java.awt.FlowLayout;
import java.awt.TextField;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.Box;
import javax.swing.JFrame;
public class BoxLayoutDemo
{
public static void main(String args[])
{
JFrame frame=new JFrame("用戶登錄");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
TextField password=new TextField(15);
password.setEchoChar('*');
Box left,right,top,bottom,base,basebox;
top=Box.createHorizontalBox();
top.add(new JLabel("用戶登錄"),JLabel.CENTER);
left=Box.createVerticalBox();
left.add(new JLabel("用戶名:"));
left.add(Box.createVerticalStrut(8));
left.add(new JLabel("密碼:"));
right=Box.createVerticalBox();
right.add(new TextField(10));
right.add(Box.createVerticalStrut(8));
right.add(password);
bottom=Box.createHorizontalBox();
bottom.add(new JButton("登錄"));
bottom.add(Box.createVerticalStrut(10));
bottom.add(new JButton("重置"));
basebox=Box.createHorizontalBox();
basebox.add(left);
basebox.add(Box.createHorizontalStrut(10));
basebox.add(right);
base=Box.createVerticalBox();
base.add(top);
base.add(Box.createVerticalStrut(10));
base.add(basebox);
base.add(Box.createVerticalStrut(10));
base.add(bottom);
frame.setLayout(new FlowLayout());
frame.add(base);
frame.setVisible(true);
}
} §空佈局管理器(自定義佈局): import javax.swing.*;
import java.awt.*;
public class NullLayoutDemo extends JFrame{
JPanel p;
JButton b1,b2,b3,b4;
public NullLayoutDemo(){
super("自定義佈局演示");
setSize(250,150);
p=new JPanel();
p.setLayout(null);
getContentPane().add(p);
b1=new JButton("one");
b1.setBounds(10,20,100,30);//設置的依次是x、y坐標,長與寬
b2=new JButton("two");
b2.setBounds(120,20,100,30);
b3=new JButton("three");
b3.setBounds(10,70,100,30);
b4=new JButton("four");
b4.setBounds(120,70,100,30);
p.add(b1);
p.add(b2);
p.add(b3);
p.add(b4);
setVisible(true);
}
public static void main(String[] args) {
new NullLayoutDemo();
}
}11、事件處理
(1)Java事件模型:事件模型的3個組件:事件、事件源和事件監聽器
(2)事件處理的工作原理:
§事件源是一個能夠註冊監聽器,且可為監聽器發送事件對象的對象
§一個監聽器對象是一個實現瞭專門的監聽器接口的類實例
§當事件發生時,事件源將事件對象發送給事件源所註冊的監聽器(一個或多個)
§監聽器對象使用事件對象的信息來確定做出的反應
(3)處理事件的一般步驟:
§定義要接收某事件的類並實現相應的監聽器接口
§在事件源中註冊類
§接收對應的事件對象,並通過監聽器接口中的方法進行處理
(4)事件類型:AWT事件分為兩大類,低級事件和高級事件,前者是基於組件和容器的事件,後者是基於語義的事件。
§低級事件:
ComponentEvent——組件事件,組件尺寸的變化和移動,是所有低層事件的基類。
ContainerEvent——容器事件,組件增加和刪除。
WindowEvent——窗口事件,窗口被激活、關閉或者還原。
FucousEvent——焦點事件,組件獲得焦點或者失去焦點。
KeyEvent——鍵盤事件,鍵盤的按下或釋放。
MouseEvent——鼠標事件,鼠標鍵被按下、釋放、鼠標移動或者托動。
MouseWheelEvent——鼠標滾輪被滾動。
§高級事件:
ActionEvent——動作事件,按鈕單擊、TextField中按下Enter鍵、菜單選擇、選擇列表框等。
AdjustmentEvent——調節事件,在滾動條上移動滑塊和調節數值。
ItemEvent——選擇列表框中的項目。
TextEvent——文本事件,文本對象發生改變。
(5)動作事件示例程序: import javax.swing.*;
import java.awt.event.*;
public class ActionEventDemo extends JFrame implements ActionListener{
//聲明組件
JLabel lblTitle,lblUser,lblPass;
JTextField txtUser;
JPasswordField pwdPass;
JButton btnLogin,btnExit;
JPanel pnlMain;
//構造方法
public ActionEventDemo(){
super("用戶登錄");
pnlMain=new JPanel();
this.getContentPane().add(pnlMain);
//實例化組件
String address="G:\\00\\images\\";
lblTitle=new JLabel(new ImageIcon(address+"welcome.gif"));
lblUser=new JLabel("用戶名:");
txtUser=new JTextField(12);
lblPass=new JLabel("密碼:");
pwdPass=new JPasswordField(12);
//"登錄"按鈕
Icon imgLogin=new ImageIcon(address+"login.gif");
btnLogin=new JButton("登錄(L)",imgLogin);
btnLogin.setMnemonic('L');//鍵盤助記符
btnLogin.setToolTipText("點擊登錄");//工具提示文字
btnLogin.addActionListener(this);
//"退出"按鈕
Icon imgExit=new ImageIcon(address+"exit.gif");
btnExit=new JButton("退出(x)",imgExit);
btnLogin.setMnemonic('X');
btnExit.setToolTipText("退出登錄");
btnExit.addActionListener(this);
//添加組件到面板
pnlMain.add(lblTitle);
pnlMain.add(lblUser);
pnlMain.add(txtUser);
pnlMain.add(lblPass);
pnlMain.add(pwdPass);
pnlMain.add(btnLogin);
pnlMain.add(btnExit);
//設置窗口屬性
setSize(450,400);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent ae){
if(ae.getSource()==btnLogin){
if(txtUser.getText().equals("admin")&&pwdPass.getText().equals("admin"))
JOptionPane.showMessageDialog(null,"歡迎登錄");
else JOptionPane.showMessageDialog(null,"用戶名或密碼錯誤");
}
if(ae.getSource()==btnExit){
System.exit(0);
}
}
public static void main(String[] args) {
new ActionEventDemo();
}
}
(5)鍵盤事件示例程序: import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
public class KeyEventDemo {
public static void main(String args[]) {
SketchFrame frame = new SketchFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class SketchFrame extends JFrame {
public SketchFrame() {
setTitle("鍵盤事件");
setSize(300, 200);
final SketchPanel panel = new SketchPanel();
final Container contentPane = getContentPane();
contentPane.add(panel);
}
}
class SketchPanel extends JPanel {
private Point2D last;
private ArrayList lines;
private static final int INCREMENT = 10;
public SketchPanel() {
last = new Point2D.Double(100, 100);// 設置開始點坐標
lines = new ArrayList();
KeyHandler listener = new KeyHandler();
addKeyListener(listener);// 註冊事件監聽器
setFocusable(true);
}
// 添加坐標
public void add(int dx, int dy) {
Point2D end = new Point2D.Double(last.getX()
+ dx, last.getY() + dy);// 得到終點坐標
Line2D line = new Line2D.Double(last, end);
lines.add(line);
repaint();
last = end;
}
// 畫圖方法
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
for(int i=0;i<lines.size();i++){
g2.draw((Line2D)lines.get(i));
}
}
private class KeyHandler implements KeyListener {
// 按鍵被按下事件
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
int d;
d = INCREMENT;
// 對小鍵盤方向鍵添加具體的事件響應
if (keyCode == KeyEvent.VK_LEFT)
add(-d, 0);
else if (keyCode == KeyEvent.VK_RIGHT)
add(d, 0);
else if (keyCode == KeyEvent.VK_UP)
add(0, -d);
else if (keyCode == KeyEvent.VK_DOWN)
add(0, d);
}
public void keyReleased(KeyEvent e) {
}
// 按鍵被單擊事件監聽
public void keyTyped(KeyEvent e) {
char keyChar = e.getKeyChar();
int d;
if (Character.isUpperCase(keyChar)) {
d = INCREMENT;
keyChar = Character.toLowerCase(keyChar);
} else
d = INCREMENT;
//為鍵盤“h、l、k、j“添加事件響應
if (keyChar == 'h')
add(-d, 0);
else if (keyChar == 'l')
add(d, 0);
else if (keyChar == 'k')
add(0, -d);
else if (keyChar == 'j')
add(0, d);
}
}
}
(6)鼠標事件示例程序: import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MouseEventDemo extends MouseMotionAdapter{
JFrame frmMain;
int intX,intY;
JPanel pnlMain;
JLabel lblX,lblY;
JTextField txtX,txtY;
GridLayout glMain;
public MouseEventDemo(){
frmMain=new JFrame("鼠標事件演示");
pnlMain=new JPanel();
frmMain.getContentPane().add(pnlMain);
glMain=new GridLayout(2,2);
pnlMain.setLayout(glMain);
lblX=new JLabel("當前鼠標X坐標:");
lblY=new JLabel("當前鼠標Y坐標:");
txtX=new JTextField(5);
txtY=new JTextField(5);
pnlMain.add(lblX);
pnlMain.add(txtX);
pnlMain.add(lblY);
pnlMain.add(txtY);
//定義、綁定鼠標事件監聽器對象
frmMain.addMouseMotionListener(this);
frmMain.setSize(250,150);
frmMain.setVisible(true);
}
//重寫MmouseMotionActionListEner接口中指定方法
public void mouseMoved(MouseEvent e){
intX=e.getX();
intY=e.getY();
txtX.setText(String.valueOf(intX));
txtY.setText(String.valueOf(intY));
}
public static void main(String args[]){
MouseEventDemo med=new MouseEventDemo();
}
}