Java GUI-AWT
2016-01-20 15:48
411 查看
Java GUI-AWT
sf2gis@163.com
2015年12月29日
参考:《疯狂java讲义(第2版)》
注意:由于AWT已经被Swing替代,仅学习其基本功能,作为Swing的基础。
package lee;
import java.awt.Frame;
import java.awt.Window;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Framef=new Frame();
f.setBounds(30,30,200,200);
f.setVisible(true);
}
}
-|Component:基本组件
--|Container:容器
--|Button等具体组件
-|MenuComponent:菜单组件
--|MenuBar:菜单栏
--|MentItem:菜单项
---|Menu:菜单
位置:setLocation()。
大小和位置:setBounds()。
可见性(默认不可见):setVisible()。
删:
改:
查:getComponents(),getComponentAt(),getComponentCount()。
package lee;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.ScrollPane;
import java.awt.TextField;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
f.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 10));
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
Panelp1=new Panel();
p1.add(new Button("Hello"));
f.add(p1);
ScrollPanep2=new ScrollPane();
p2.add(new TextField(200));
f.add(p2);
}
}
//Main.java
/**
* Demo
*/
package lee;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextField;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODOAuto-generated method stub
Frame f=new Frame();
f.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 10));
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
f.add(new Button("Hello"));
f.add(new TextField(20));
}
}
//Main.java
/**
* Demo
*/
package lee;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
f.setLayout(new BorderLayout(20, 10));
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
f.add(new Button("NORTH"),BorderLayout.NORTH);
f.add(new Button("WEST"),BorderLayout.WEST);
f.add(new Button("CENTER"),BorderLayout.CENTER);
f.add(new Button("EAST"),BorderLayout.EAST);
f.add(new Button("SOUTH"),BorderLayout.SOUTH);
f.pack();
}
}
/**
* Demo
*/
package lee;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
f.setLayout(new GridLayout(3, 2));
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
f.add(new Button("1"));
f.add(new Button("2"));
f.add(new Button("3"));
f.add(new Button("4"));
f.add(new Button("5"));
f.pack();
}
}
/**
* Demo
*/
package lee;
import java.awt.Button;
import java.awt.Frame;
importjava.awt.GridBagConstraints;
import java.awt.GridBagLayout;
/**
* @author sf2gis@163.com
*
*/
public class Main {
private GridBagLayout gb;
private Frame f;
private GridBagConstraints gbc;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new Main().init();
}
public void init(){
f=new Frame();
gb=new GridBagLayout();
f.setLayout(gb);
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
gbc = new GridBagConstraints();
gbc.fill=GridBagConstraints.BOTH;
// gbc.weightx=1;
// gbc.weighty=1;
gbc.gridwidth=2;
gbc.gridwidth=GridBagConstraints.REMAINDER;
addButton(new Button("1"));
gbc.gridwidth=1;
gbc.gridheight=3;
addButton(new Button("2"));
gbc.gridheight=1;
gbc.gridwidth=GridBagConstraints.REMAINDER;
addButton(new Button("3"));
gbc.gridwidth=GridBagConstraints.REMAINDER;
addButton(new Button("4"));
gbc.gridwidth=GridBagConstraints.REMAINDER;
addButton(new Button("5"));
f.pack();
}
public void addButton(Button btn){
gb.setConstraints(btn, gbc);
f.add(btn);
}
}
/**
* Demo
*/
package lee;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Frame;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
CardLayout c=new CardLayout(30, 20);
f.setLayout(c);
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
f.add("1",new Button("1"));
f.add("2",new Button("2"));
f.add("3",new Button("3"));
f.add("4",new Button("4"));
f.add("5",new Button("5"));
f.pack();
c.show(f,"3");
}
}
/**
* Demo
*/
package lee;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Frame;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
f.setLayout(null);
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
Button btn1=new Button("1");
btn1.setBounds(0, 0, 100, 100);;
f.add(btn1);
Button btn2=new Button("2");
btn2.setBounds(50, 100, 100, 100);;
f.add(btn2);
}
}
/**
* Demo
*/
package lee;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import javax.swing.Box;
import javax.swing.BoxLayout;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
f.setLayout(new BorderLayout());
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
Box hori=Box.createHorizontalBox();
hori.add(new Button("1"));
f.add(hori,BorderLayout.NORTH);
Box ver=Box.createVerticalBox();
ver.add(new Button("2"));
f.add(ver,BorderLayout.WEST);
Box ver2=Box.createVerticalBox();
ver2.add(new Button("3"));
ver2.add(new Button("4"));
ver2.add(new Button("5"));
f.add(ver2,BorderLayout.CENTER);
f.pack();
}
}
。。。。。。
}
package lee;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
f.setBounds(0, 0, 200, 200);
f.setTitle("Hello,World!");
f.setVisible(true);
f.setLayout(new FlowLayout());
Buttonbtn1=new Button("Btn1");
f.add(btn1);
btn1.addActionListener(newActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("xx");
}
});
}
}
为了只处理关心的事件,可以使用事件适配器(默认实现了接口所有方法),只改写关心的方法。
-|菜单menu:用于旋转菜单项
--|菜单项menuitem:各个功能菜单按钮
---|标签String:显示的菜单文本
---|快捷键MenuShortcut:ctrl、shift等结合的虚拟键
/**
* Demo
*/
package lee;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.KeyEvent;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
f.setLayout(new BorderLayout());
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
//menubar
MenuBarmb=new MenuBar();
//file menu
Menu mFile=newMenu("File");
mb.add(mFile);
MenuItem mi=newMenuItem("Open",new MenuShortcut(KeyEvent.VK_A,false));
mFile.add(mi);
mFile.addSeparator();
MenuItem miSave=new MenuItem("Save",newMenuShortcut(KeyEvent.VK_S,false));
mFile.add(miSave);
//add menubar
f.setMenuBar(mb);
//event
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("Open");
}
});
miSave.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("Save");
}
});
}
}
-|菜单menu:用于旋转菜单项
--|菜单项menuitem:各个功能菜单按钮
---|标签String:显示的菜单文本
---|快捷键MenuShortcut:ctrl、shift等结合的虚拟键
finalPopupMenu pop=new PopupMenu("xx");
//file menu
Menu mFile=new Menu("File");
pop.add(mFile);
MenuItem mi=new MenuItem("Open",newMenuShortcut(KeyEvent.VK_A,false));
mFile.add(mi);
mFile.addSeparator();
MenuItem miSave=new MenuItem("Save",newMenuShortcut(KeyEvent.VK_S,false));
mFile.add(miSave);
f.add(pop);
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
if(e.isPopupTrigger()){
pop.show(f,e.getX(), e.getY());
}
}
});
/**
* Demo
*/
package lee;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
import java.awt.PopupMenu;
importjava.awt.event.ActionEvent;
import java.awt.event.ActionListener;
importjava.awt.event.KeyEvent;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
final Frame f=new Frame();
f.setLayout(new BorderLayout());
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
//popup
finalPopupMenu pop=new PopupMenu("xx");
//file menu
Menu mFile=new Menu("File");
pop.add(mFile);
MenuItem mi=new MenuItem("Open",newMenuShortcut(KeyEvent.VK_A,false));
mFile.add(mi);
mFile.addSeparator();
MenuItem miSave=new MenuItem("Save",newMenuShortcut(KeyEvent.VK_S,false));
mFile.add(miSave);
f.add(pop);
//event
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("Open");
}
});
miSave.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("Save");
}
});
f.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
if(e.isPopupTrigger()){
pop.show(f,e.getX(), e.getY());
}
}
});
}
}
private int shape;
@Override
publicvoid paint(Graphics g) {
// TODO Auto-generated method stub
if(0==shape){
g.drawRect(0, 0, 50, 50);
}
else{
g.drawOval(0,50,50,50);
}
}
public int getShape() {
return shape;
}
public void setShape(int shape) {
this.shape = shape;
}
}
c.setPreferredSize(newDimension(100,100));
/**
* Demo
*/
package lee;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
final Frame f=new Frame();
f.setLayout(new BorderLayout());
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
//add canvas
finalMyCanvas c = new MyCanvas();
c.setPreferredSize(newDimension(100,100));
f.add(c,BorderLayout.NORTH);
//add button
Button btn1=new Button("Rect");
Button btn2=new Button("Oval");
f.add(btn1,BorderLayout.WEST);
f.add(btn2,BorderLayout.CENTER);
//btn listener
btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
c.setShape(0);
c.repaint();
}
});
btn2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
c.setShape(1);
c.repaint();
}
});
}
}
//graphics canvas
class MyCanvas extends Canvas{
private int shape;
@Override
publicvoid paint(Graphics g) {
// TODO Auto-generated method stub
if(0==shape){
g.drawRect(0, 0, 50, 50);
}
else{
g.drawOval(0,50,50,50);
}
}
public int getShape() {
return shape;
}
public void setShape(int shape) {
this.shape = shape;
}
}
目标:绘制图形。
原理:抽象画笔提供各种绘图接口,具体实现由JVM根据具体底层OS实例化后传给paint()。
方法:绘制直线,字符串,矩形等图形。
Image srcImage=ImageIO.read(newFile("D:/Test/Penguins.jpg"));
g.drawImage(srcImage,0,0,100,100,null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
GraphicsgBuf=buf.getGraphics();
gBuf.drawOval(0,0, 50, 50);
g.drawOval(0, 0, 50, 50);
try {
ImageIO.write(buf, "jpeg", newFile("D:/Test/My.jpg"));
} catch(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* Demo
*/
package lee;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
final Frame f=new Frame();
f.setLayout(new BorderLayout());
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
//add canvas
final MyCanvas c = new MyCanvas();
c.setPreferredSize(new Dimension(100,100));
f.add(c,BorderLayout.NORTH);
//add button
Button btn1=new Button("Read");
Button btn2=new Button("Write");
f.add(btn1,BorderLayout.WEST);
f.add(btn2,BorderLayout.CENTER);
//btn listener
btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
c.setShape(0);
c.repaint();
}
});
btn2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
c.setShape(1);
c.repaint();
}
});
}
}
//graphics canvas
class MyCanvas extendsCanvas{
private int shape;
@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
if(0==shape){//read image
try {
Image srcImage=ImageIO.read(new File("D:/Test/Penguins.jpg"));
g.drawImage(srcImage,0,0,100,100,null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else{
BufferedImagebuf=new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
Graphics gBuf=buf.getGraphics();
gBuf.drawOval(0,0, 50, 50);
g.drawOval(0, 0, 50, 50);
try {
ImageIO.write(buf, "jpeg", newFile("D:/Test/My.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public int getShape() {
return shape;
}
public void setShape(int shape) {
this.shape = shape;
}
}
sf2gis@163.com
2015年12月29日
1 目标:提供Java的WriteOnce,RunAnywhere的目标,提供跨平台的GUI。
2 原理:针对不同平台调用OS底层的GUI,封装统一API。
但是对于平台特有的组件无法实现Java的跨平台目标,并且Java使用JNI调用底层GUI的方式也给跨平台带来不便。于是Java在后续的GUI中使用AWT的扩展版本Swing代替AWT。参考:《疯狂java讲义(第2版)》
注意:由于AWT已经被Swing替代,仅学习其基本功能,作为Swing的基础。
3 流程:创建组件,设置组件属性,显示组件。
//Main.javapackage lee;
import java.awt.Frame;
import java.awt.Window;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Framef=new Frame();
f.setBounds(30,30,200,200);
f.setVisible(true);
}
}
4 方法:GUI组件
参考:http://www.cnblogs.com/growup/archive/2010/04/24/1971548.html4.1 组织结构:
Object:基类-|Component:基本组件
--|Container:容器
--|Button等具体组件
-|MenuComponent:菜单组件
--|MenuBar:菜单栏
--|MentItem:菜单项
---|Menu:菜单
4.2 容器:用于组织其它组件,包括一个布局。
4.2.1分类:框架、对话框等。
4.2.1.1 窗口Window:抽象概念(很少使用),表示一块屏幕区域,无边框,不能调整大小。
根据子组件自动调整大小pack()。4.2.1.2 框架Frame:Window的子类,具有边框,菜单,能够调整大小等,与Win平台的Window,From很像。默认使用BorderLayout布局。
4.2.1.3 对话框Dialog:Window的子类,与Frame类似,无菜单。
4.2.1.4 面板Panel:用于盛放其它组件,默认使用FlowLayout布局。
4.2.1.5 滚动面板ScrollPane:用于盛放其它组件,默认使用BorderLayout布局(一般不需修改)。
4.2.2属性设置:大小,位置等。
大小:setSize(),位置:setLocation()。
大小和位置:setBounds()。
可见性(默认不可见):setVisible()。
4.2.3子组件设置:CRUD
增:add()。删:
改:
查:getComponents(),getComponentAt(),getComponentCount()。
4.2.4 示例
//Main.javapackage lee;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.ScrollPane;
import java.awt.TextField;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
f.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 10));
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
Panelp1=new Panel();
p1.add(new Button("Hello"));
f.add(p1);
ScrollPanep2=new ScrollPane();
p2.add(new TextField(200));
f.add(p2);
}
}
4.3 布局管理器:Layout
4.3.1目标:自动调整大小,避免不同平台位置和大小需要手动调整。
4.3.2原理:根据一定的规则自动调整大小和位置。
4.3.3方法:
4.3.3.1 FlowLayout:流动布局,按顺序排列,到达边界后折行。
可以指定对齐方式,间距(水平、垂直)。//Main.java
/**
* Demo
*/
package lee;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextField;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODOAuto-generated method stub
Frame f=new Frame();
f.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 10));
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
f.add(new Button("Hello"));
f.add(new TextField(20));
}
}
4.3.3.2 BorderLayout:分区布局,按五大区域分块(与easyui相同)。
默认添加到Center区域中。//Main.java
/**
* Demo
*/
package lee;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
f.setLayout(new BorderLayout(20, 10));
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
f.add(new Button("NORTH"),BorderLayout.NORTH);
f.add(new Button("WEST"),BorderLayout.WEST);
f.add(new Button("CENTER"),BorderLayout.CENTER);
f.add(new Button("EAST"),BorderLayout.EAST);
f.add(new Button("SOUTH"),BorderLayout.SOUTH);
f.pack();
}
}
4.3.3.3 GridLayout:表格,从左到右,从上到下组织。
//Main.java/**
* Demo
*/
package lee;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
f.setLayout(new GridLayout(3, 2));
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
f.add(new Button("1"));
f.add(new Button("2"));
f.add(new Button("3"));
f.add(new Button("4"));
f.add(new Button("5"));
f.pack();
}
}
4.3.3.4 GridBagLayout:可以合并单元格的表格 (好麻烦)。
//Main.java/**
* Demo
*/
package lee;
import java.awt.Button;
import java.awt.Frame;
importjava.awt.GridBagConstraints;
import java.awt.GridBagLayout;
/**
* @author sf2gis@163.com
*
*/
public class Main {
private GridBagLayout gb;
private Frame f;
private GridBagConstraints gbc;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new Main().init();
}
public void init(){
f=new Frame();
gb=new GridBagLayout();
f.setLayout(gb);
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
gbc = new GridBagConstraints();
gbc.fill=GridBagConstraints.BOTH;
// gbc.weightx=1;
// gbc.weighty=1;
gbc.gridwidth=2;
gbc.gridwidth=GridBagConstraints.REMAINDER;
addButton(new Button("1"));
gbc.gridwidth=1;
gbc.gridheight=3;
addButton(new Button("2"));
gbc.gridheight=1;
gbc.gridwidth=GridBagConstraints.REMAINDER;
addButton(new Button("3"));
gbc.gridwidth=GridBagConstraints.REMAINDER;
addButton(new Button("4"));
gbc.gridwidth=GridBagConstraints.REMAINDER;
addButton(new Button("5"));
f.pack();
}
public void addButton(Button btn){
gb.setConstraints(btn, gbc);
f.add(btn);
}
}
4.3.3.5 CardLayout:层叠布局,每次只显示一个。
//Main.java/**
* Demo
*/
package lee;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Frame;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
CardLayout c=new CardLayout(30, 20);
f.setLayout(c);
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
f.add("1",new Button("1"));
f.add("2",new Button("2"));
f.add("3",new Button("3"));
f.add("4",new Button("4"));
f.add("5",new Button("5"));
f.pack();
c.show(f,"3");
}
}
4.3.3.6 绝对定位:使用null作为布局(无布局,不具备跨平台性)。
//Main.java/**
* Demo
*/
package lee;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Frame;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
f.setLayout(null);
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
Button btn1=new Button("1");
btn1.setBounds(0, 0, 100, 100);;
f.add(btn1);
Button btn2=new Button("2");
btn2.setBounds(50, 100, 100, 100);;
f.add(btn2);
}
}
4.3.3.7 BoxLayout:GridBagLayout的简化版本。
//Main.java/**
* Demo
*/
package lee;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import javax.swing.Box;
import javax.swing.BoxLayout;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
f.setLayout(new BorderLayout());
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
Box hori=Box.createHorizontalBox();
hori.add(new Button("1"));
f.add(hori,BorderLayout.NORTH);
Box ver=Box.createVerticalBox();
ver.add(new Button("2"));
f.add(ver,BorderLayout.WEST);
Box ver2=Box.createVerticalBox();
ver2.add(new Button("3"));
ver2.add(new Button("4"));
ver2.add(new Button("5"));
f.add(ver2,BorderLayout.CENTER);
f.pack();
}
}
4.4 事件机制:事件源+监听对象注册
4.4.1目标:制定不同的事件,对应的监听接口(需要注册监听对象给组件),当组件触发事件时,发送事件给监听对象。
4.4.2原理:事件源管理其自身的事件,并管理注册的事件监听对象。当事件触发时,向所有的注册对象发送事件。
4.4.3流程:创建事件源,注册监听对象,触发事件,调用监听对象的处理函数。
4.4.3.1 创建事件源:创建组件对象。
Buttonbtn1=new Button("Btn1");4.4.3.2 注册监听对象:向组件的事件监听函数中添加监听对象(实现处理函数)(一般使用匿名类)。
btn1.addActionListener(newActionListener() {。。。。。。
}
4.4.3.3 触发对象,调用监听函数。
//Main.javapackage lee;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
f.setBounds(0, 0, 200, 200);
f.setTitle("Hello,World!");
f.setVisible(true);
f.setLayout(new FlowLayout());
Buttonbtn1=new Button("Btn1");
f.add(btn1);
btn1.addActionListener(newActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("xx");
}
});
}
}
4.4.4方法:事件分类、适配器
事件分为低级事件(基于组件的基本事件)和高级事件(低级事件的抽象)。每种事件都其对应的接口(可能含有多个事件)。为了只处理关心的事件,可以使用事件适配器(默认实现了接口所有方法),只改写关心的方法。
4.5 菜单:菜单条-菜单-菜单项(标签+快捷键)
4.5.1结构:树形结构,快捷键作为对象,以属性的形式设置。
菜单条menubar:用于放置菜单,使用container.setMenuBar(mb)添加菜单。-|菜单menu:用于旋转菜单项
--|菜单项menuitem:各个功能菜单按钮
---|标签String:显示的菜单文本
---|快捷键MenuShortcut:ctrl、shift等结合的虚拟键
4.5.2示例:
//Main.java/**
* Demo
*/
package lee;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.KeyEvent;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
f.setLayout(new BorderLayout());
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
//menubar
MenuBarmb=new MenuBar();
//file menu
Menu mFile=newMenu("File");
mb.add(mFile);
MenuItem mi=newMenuItem("Open",new MenuShortcut(KeyEvent.VK_A,false));
mFile.add(mi);
mFile.addSeparator();
MenuItem miSave=new MenuItem("Save",newMenuShortcut(KeyEvent.VK_S,false));
mFile.add(miSave);
//add menubar
f.setMenuBar(mb);
//event
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("Open");
}
});
miSave.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("Save");
}
});
}
}
4.6 弹出式菜单:弹出菜单-菜单-菜单项(标签+快捷键)
4.6.1结构(与菜单栏相似):树形结构,快捷键作为对象,以属性的形式设置。
弹出菜单:用于放置菜单,使用container.add(pop)添加菜单,使用pop.show()显示。-|菜单menu:用于旋转菜单项
--|菜单项menuitem:各个功能菜单按钮
---|标签String:显示的菜单文本
---|快捷键MenuShortcut:ctrl、shift等结合的虚拟键
4.6.2流程:构造弹出菜单,监听事件,响应右键弹出
4.6.2.1 构造弹出菜单
//popupfinalPopupMenu pop=new PopupMenu("xx");
//file menu
Menu mFile=new Menu("File");
pop.add(mFile);
MenuItem mi=new MenuItem("Open",newMenuShortcut(KeyEvent.VK_A,false));
mFile.add(mi);
mFile.addSeparator();
MenuItem miSave=new MenuItem("Save",newMenuShortcut(KeyEvent.VK_S,false));
mFile.add(miSave);
f.add(pop);
4.6.2.2 监听事件,响应右键弹出:需要弹出的组件上监听鼠标事件,响应右键
f.addMouseListener(newMouseAdapter() {@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
if(e.isPopupTrigger()){
pop.show(f,e.getX(), e.getY());
}
}
});
4.6.3示例:监听鼠标事件
//Main.java/**
* Demo
*/
package lee;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
import java.awt.PopupMenu;
importjava.awt.event.ActionEvent;
import java.awt.event.ActionListener;
importjava.awt.event.KeyEvent;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
final Frame f=new Frame();
f.setLayout(new BorderLayout());
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
//popup
finalPopupMenu pop=new PopupMenu("xx");
//file menu
Menu mFile=new Menu("File");
pop.add(mFile);
MenuItem mi=new MenuItem("Open",newMenuShortcut(KeyEvent.VK_A,false));
mFile.add(mi);
mFile.addSeparator();
MenuItem miSave=new MenuItem("Save",newMenuShortcut(KeyEvent.VK_S,false));
mFile.add(miSave);
f.add(pop);
//event
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("Open");
}
});
miSave.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("Save");
}
});
f.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
if(e.isPopupTrigger()){
pop.show(f,e.getX(), e.getY());
}
}
});
}
}
5 方法:2D绘图
5.1 目标:2D绘图,能够在界面上绘制出2D图形。
5.2 原理:所有绘图在Component上进行。Component使用paint(Graphicsg)进行实际绘制。更新时使用update(),主动要求绘制时调用repaint()。系统会自动控制各个组件的绘制。专门进行绘图的组件是Canvas。
repaint()调用update(),update()调用paint()。5.3 流程:继承Canvas,重写paint(), 向容器中添加Canvas对象并设置其大小。
5.3.1继承Canvas,重写paint():
class MyCanvas extends Canvas{private int shape;
@Override
publicvoid paint(Graphics g) {
// TODO Auto-generated method stub
if(0==shape){
g.drawRect(0, 0, 50, 50);
}
else{
g.drawOval(0,50,50,50);
}
}
public int getShape() {
return shape;
}
public void setShape(int shape) {
this.shape = shape;
}
}
5.3.2向容器中添加Canvas对象并设置其大小:
finalMyCanvas c = new MyCanvas();c.setPreferredSize(newDimension(100,100));
5.3.3示例
//Main.java/**
* Demo
*/
package lee;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
final Frame f=new Frame();
f.setLayout(new BorderLayout());
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
//add canvas
finalMyCanvas c = new MyCanvas();
c.setPreferredSize(newDimension(100,100));
f.add(c,BorderLayout.NORTH);
//add button
Button btn1=new Button("Rect");
Button btn2=new Button("Oval");
f.add(btn1,BorderLayout.WEST);
f.add(btn2,BorderLayout.CENTER);
//btn listener
btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
c.setShape(0);
c.repaint();
}
});
btn2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
c.setShape(1);
c.repaint();
}
});
}
}
//graphics canvas
class MyCanvas extends Canvas{
private int shape;
@Override
publicvoid paint(Graphics g) {
// TODO Auto-generated method stub
if(0==shape){
g.drawRect(0, 0, 50, 50);
}
else{
g.drawOval(0,50,50,50);
}
}
public int getShape() {
return shape;
}
public void setShape(int shape) {
this.shape = shape;
}
}
5.4 方法:graphics
参考:http://blog.csdn.net/qgjava/article/details/5860079目标:绘制图形。
原理:抽象画笔提供各种绘图接口,具体实现由JVM根据具体底层OS实例化后传给paint()。
方法:绘制直线,字符串,矩形等图形。
5.5 方法:位图读写
5.5.1目标:读取已有的图片,向文件写入图像。
5.5.2原理:ImageIO读写图片文件,使用BufferedImage作为图片缓存进行双缓冲。
5.5.3流程:读写图片
5.5.3.1 读取图片:读取图片,绘制。
try {Image srcImage=ImageIO.read(newFile("D:/Test/Penguins.jpg"));
g.drawImage(srcImage,0,0,100,100,null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
5.5.3.2 写出图片:创建缓冲区,获取画笔,绘制到缓冲区,写出。
BufferedImagebuf=new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);GraphicsgBuf=buf.getGraphics();
gBuf.drawOval(0,0, 50, 50);
g.drawOval(0, 0, 50, 50);
try {
ImageIO.write(buf, "jpeg", newFile("D:/Test/My.jpg"));
} catch(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
5.5.3.3 示例
//Main.java/**
* Demo
*/
package lee;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* @author sf2gis@163.com
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
final Frame f=new Frame();
f.setLayout(new BorderLayout());
f.setBounds(30,30,200,200);
f.setVisible(true);
f.setTitle("Hello,World!");
//add canvas
final MyCanvas c = new MyCanvas();
c.setPreferredSize(new Dimension(100,100));
f.add(c,BorderLayout.NORTH);
//add button
Button btn1=new Button("Read");
Button btn2=new Button("Write");
f.add(btn1,BorderLayout.WEST);
f.add(btn2,BorderLayout.CENTER);
//btn listener
btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
c.setShape(0);
c.repaint();
}
});
btn2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
c.setShape(1);
c.repaint();
}
});
}
}
//graphics canvas
class MyCanvas extendsCanvas{
private int shape;
@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
if(0==shape){//read image
try {
Image srcImage=ImageIO.read(new File("D:/Test/Penguins.jpg"));
g.drawImage(srcImage,0,0,100,100,null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else{
BufferedImagebuf=new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
Graphics gBuf=buf.getGraphics();
gBuf.drawOval(0,0, 50, 50);
g.drawOval(0, 0, 50, 50);
try {
ImageIO.write(buf, "jpeg", newFile("D:/Test/My.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public int getShape() {
return shape;
}
public void setShape(int shape) {
this.shape = shape;
}
}
6 示例
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- [转载]Activity中ConfigChanges属性的用法
- android之定时器AlarmManager
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- Web布局连载——两栏固定布局(五)
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序