|
Posted on 2008-08-10 07:06 夢(mèng)與橋 閱讀(675) 評(píng)論(0) 編輯 收藏 所屬分類: java基礎(chǔ)
10、布局管理編程演示:
§流布局管理器(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("檢測(cè)用戶名");
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();
}
}
§網(wǎng)格布局管理器(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("網(wǎng)格布局演示");
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();
}
}
§網(wǎng)格袋布局管理器(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;//指定包含組件的顯示區(qū)域開(kāi)始邊的單元格
gc.gridy=row;//指定位于組件顯示區(qū)域的頂部的單元格
gc.gridwidth=width;//指定在組件顯示區(qū)域的一行中的單元格數(shù)
gc.gridheight=height;//指定在組件顯示區(qū)域的一列中的單元格數(shù)
g.setConstraints(c, gc);//設(shè)置此布局中指定組件的約束條件
p.add(c);
}
 public GridBagLayoutDemo() {
super("網(wǎng)格袋布局演示");
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("我是一個(gè)標(biāo)簽");
l2=new JLabel("我是另一個(gè)標(biāo)簽");
//布局JTextArea
gbc.weightx=0;//指定如何分布額外的水平空間
gbc.weighty=0;//指定如何分布額外的垂直空間
//BOTH:在水平方向和垂直方向上同時(shí)調(diào)整組件大小
//fill:當(dāng)組件的顯示區(qū)域大于它所請(qǐng)求的顯示區(qū)域的大小時(shí)使用此字段
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);
//布局標(biāo)簽l1
gbc.fill=GridBagConstraints.BOTH;
addComponent(l1,gbl,gbc,0,3,2,1);
setVisible(true);
//布局標(biāo)簽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);//設(shè)置的依次是x、y坐標(biāo),長(zhǎng)與寬
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個(gè)組件:事件、事件源和事件監(jiān)聽(tīng)器
(2)事件處理的工作原理:
§事件源是一個(gè)能夠注冊(cè)監(jiān)聽(tīng)器,且可為監(jiān)聽(tīng)器發(fā)送事件對(duì)象的對(duì)象
§一個(gè)監(jiān)聽(tīng)器對(duì)象是一個(gè)實(shí)現(xiàn)了專門的監(jiān)聽(tīng)器接口的類實(shí)例
§當(dāng)事件發(fā)生時(shí),事件源將事件對(duì)象發(fā)送給事件源所注冊(cè)的監(jiān)聽(tīng)器(一個(gè)或多個(gè))
§監(jiān)聽(tīng)器對(duì)象使用事件對(duì)象的信息來(lái)確定做出的反應(yīng)
(3)處理事件的一般步驟:
§定義要接收某事件的類并實(shí)現(xiàn)相應(yīng)的監(jiān)聽(tīng)器接口
§在事件源中注冊(cè)類
§接收對(duì)應(yīng)的事件對(duì)象,并通過(guò)監(jiān)聽(tīng)器接口中的方法進(jìn)行處理
(4)事件類型:AWT事件分為兩大類,低級(jí)事件和高級(jí)事件,前者是基于組件和容器的事件,后者是基于語(yǔ)義的事件。
§低級(jí)事件:
ComponentEvent——組件事件,組件尺寸的變化和移動(dòng),是所有低層事件的基類。
ContainerEvent——容器事件,組件增加和刪除。
WindowEvent——窗口事件,窗口被激活、關(guān)閉或者還原。
FucousEvent——焦點(diǎn)事件,組件獲得焦點(diǎn)或者失去焦點(diǎn)。
KeyEvent——鍵盤事件,鍵盤的按下或釋放。
MouseEvent——鼠標(biāo)事件,鼠標(biāo)鍵被按下、釋放、鼠標(biāo)移動(dòng)或者托動(dòng)。
MouseWheelEvent——鼠標(biāo)滾輪被滾動(dòng)。
§高級(jí)事件:
ActionEvent——?jiǎng)幼魇录粹o單擊、TextField中按下Enter鍵、菜單選擇、選擇列表框等。
AdjustmentEvent——調(diào)節(jié)事件,在滾動(dòng)條上移動(dòng)滑塊和調(diào)節(jié)數(shù)值。
ItemEvent——選擇列表框中的項(xiàng)目。
TextEvent——文本事件,文本對(duì)象發(fā)生改變。
(5)動(dòng)作事件示例程序:
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;
//構(gòu)造方法
 public ActionEventDemo() {
super("用戶登錄");
pnlMain=new JPanel();
this.getContentPane().add(pnlMain);
//實(shí)例化組件
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("點(diǎn)擊登錄");//工具提示文字
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);
//設(shè)置窗口屬性
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,"用戶名或密碼錯(cuò)誤");
}
 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);// 設(shè)置開(kāi)始點(diǎn)坐標(biāo)
lines = new ArrayList();
KeyHandler listener = new KeyHandler();
addKeyListener(listener);// 注冊(cè)事件監(jiān)聽(tīng)器
setFocusable(true);
}
// 添加坐標(biāo)
public void add(int dx, int dy) {
Point2D end = new Point2D.Double(last.getX()
+ dx, last.getY() + dy);// 得到終點(diǎn)坐標(biāo)
Line2D line = new Line2D.Double(last, end);
lines.add(line);
repaint();
last = end;
}
// 畫(huà)圖方法
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;
// 對(duì)小鍵盤方向鍵添加具體的事件響應(yīng)
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) {
}
// 按鍵被單擊事件監(jiān)聽(tīng)
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“添加事件響應(yīng)
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)鼠標(biāo)事件示例程序:
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("鼠標(biāo)事件演示");
pnlMain=new JPanel();
frmMain.getContentPane().add(pnlMain);
glMain=new GridLayout(2,2);
pnlMain.setLayout(glMain);
lblX=new JLabel("當(dāng)前鼠標(biāo)X坐標(biāo):");
lblY=new JLabel("當(dāng)前鼠標(biāo)Y坐標(biāo):");
txtX=new JTextField(5);
txtY=new JTextField(5);
pnlMain.add(lblX);
pnlMain.add(txtX);
pnlMain.add(lblY);
pnlMain.add(txtY);
//定義、綁定鼠標(biāo)事件監(jiān)聽(tīng)器對(duì)象
frmMain.addMouseMotionListener(this);
frmMain.setSize(250,150);
frmMain.setVisible(true);
}
//重寫(xiě)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();
}
}
|