双缓冲技术
package GUI;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestDrawLine1 extends Frame {
/**
* 以鼠标在窗口按下时作为起点,鼠标释放时为终点,划出一条直线,并在2个点处打印坐标。
*
* 双缓冲技术
*/
int x1,y1,x2,y2;
Image oimg = null;
Graphics og = null;
public void init(){
this.setSize(400, 400);
this.setTitle("划线");
//给窗口的关闭按钮注册事件监听器
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
//给窗口注册鼠标的按下,释放事件监听器。
this.addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent e) {
//获得当前按下的坐标
x1 = e.getX();
y1 = e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
//获得鼠标释放时的坐标
x2 = e.getX();
y2 = e.getY();
//将划线的功能设置为一个方法,要修改划线的功能时,只需要修改这个方法的方法体。
draw();
}
});
this.setVisible(true);
Dimension d = this.getSize();
oimg = this.createImage(d.width , d.height);
og = oimg.getGraphics();
}
public void draw(){
//创建一个Graphics对象
Graphics g = getGraphics();
//设置颜色
g.setColor(Color.RED);
//划直线
g.drawLine(x1, y1, x2, y2);
//注意写入字符串的时候,实际写的是一个矩形,参数为矩形的左下角,与别的编程语言不同。
g.drawString("(" + x1 + "," + y1 +")", x1, y1);
g.drawString("(" + x2 + "," + y2 +")", x2, y2);
og.setColor(Color.RED);
og.drawLine(x1, y1, x2, y2);
og.drawString("(" + x1 + "," + y1 +")", x1, y1);
og.drawString("(" + x2 + "," + y2 +")", x2, y2);
}
@Override
public void paint(Graphics g) {
if (oimg != null)
g.drawImage(oimg,0,0,this);
}
public static void main(String[] args) {
new TestDrawLine1().init();
}
}
package GUI;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class drawIamgeTest extends Frame {
/**
* 在窗口画出一张图片需要注意的问题:
* 图片没画出来时可能是图片的路径不对,也可能是drawImage()方法不一定划成功,需要根据返回值来判断
* 如果图像已经完整加载,并且其像素不再发生更改,则 drawImage 返回 true。否则,drawImage 返回 false
* 好的方法是将drawIamge()方法放在paint()方法中,能确保每次都能划成功,而且可以重绘。
*/
//创建一个Image对象时,内存中并不存在图片,只是在程序要使用到Image时才加载图片。
Image img = this.getToolkit().getImage("1.jpg");
public void init(){
this.setSize(400, 400);
this.setTitle("画图");
//给窗口的关闭按钮注册事件监听器
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
this.setVisible(true);
}
public void paint(Graphics g){
//这个方法返回类型为boolean类型,
g.drawImage(img, 0, 0, this);
}
public static void main(String[] args) {
new drawIamgeTest().init();
}
}
package GUI.checkbox;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Choice;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class CheckboxTest extends Frame {
/**
* 单选按钮和复选按钮(组合框)和下拉列表框
* 以及他们对应的事件监听器
*/
Checkbox cb = new Checkbox("你想成为黑马吗?");
//定义一个组合框组
CheckboxGroup cbg = new CheckboxGroup();
//定义一个属于同一组的单选按钮
Checkbox cb1 = new Checkbox("想", true, cbg);
Checkbox cb2 = new Checkbox("不想", false, cbg);
Choice c = new Choice();
public void init() {
setSize(500, 500);
setTitle("Checkbox");
FlowLayout fl = new FlowLayout();
setLayout(fl);
add(cb);
add(cb1);
add(cb2);
c.add("-------");
c.add("中国");
c.add("小日本");
add(c);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setVisible(true);
MyListener ml = new MyListener();
cb.addItemListener(ml);
cb1.addItemListener(ml);
cb2.addItemListener(ml);
//给下拉列表框注册事件监听器
c.addItemListener(new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
//方法一:
//返回当前选定项的索引。
int post = c.getSelectedIndex();
//根据序号,获取此 Choice 菜单中指定索引上的字符串
System.out.println(c.getItem(post));
//方法二:返回受事件影响的项(对象)
System.out.println(e.getItem());
}
});
}
class MyListener implements ItemListener {
@Override
public void itemStateChanged(ItemEvent e) {
//返回产生事件的 ItemSelectable 对象方式1
Checkbox cbs = (Checkbox) e.getItemSelectable();
//返回产生事件的 Checkbox 对象方式2
//Checkbox cbx = cbg.getSelectedCheckbox();
// 匹配事件源:可以用下面的两种方式
//方式一:比较产生事件对象的label属性值
if (cbs.getLabel().equals("你想成为黑马吗?")) {
//判断组合框是否选中
if(cbs.getState()){
System.out.println("选中啦!");
}else{
System.out.println("很遗憾没有选中!");
}
}
//方式二:直接比较对象
else if (cbs == cb1) {
//判断选择与否的方法1
if(e.getStateChange() == ItemEvent.SELECTED){
System.out.println("我很想成为黑马程序员");
}
}
else if (cbs == cb2) {
//判断选择与否的方法2
if(cbs.getState()){
System.out.println("我不想成为黑马程序员");
}/*else{//此处的else语句无效,即不能通过else来判断单选按钮没有选中。
//错! 我以前理解的错了啊!因为你的外面的那个判断已经确定了被选中的是cb2,你关于else的代码当然不能执行了,因为你假如单击了cb1 那么这个语句块不会被执行的
System.out.println("haha");
}*/
}
}
}
public static void main(String[] args) {
new CheckboxTest().init();
}
}
package GUI.dialog;
import java.awt.Button;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyDialog extends Dialog {
private TextField tf = new TextField(15);
private String str = null;
public String getInfo(){
return str;
}
public void setInfo(String str){
tf.setText(str);
}
public MyDialog(Frame owner,String title,boolean modal){
super(owner,title,modal);
setBounds(100,100, 200, 200);
Button b1 = new Button("应用");
Button b2 = new Button("确定");
add(tf,"North");
add(b1,"Center");
add(b2,"East");
//判断该对话框是否为模态的,若为模态,则“应用”按钮不可用。
if(this.isModal()){
b1.setEnabled(false);
}
b1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//此处同样遇到了在内部类中要使用外部类对象。
DialogTest dt = (DialogTest) MyDialog.this.getOwner();
//非模态的”应用“按钮”按钮,将文本框的信息显示到主界面的文本框中
dt.setInfo(tf.getText());
}
});
b2.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
if(MyDialog.this.isModal()){
str = tf.getText();
}else{
//非模态对话框时的确定按钮和模态对话框时的确定按钮功能基本一致
DialogTest dt = (DialogTest) MyDialog.this.getOwner();
//此处也和模态对话框一样直接返回str
dt.setInfo(tf.getText());
}
//关闭(非)模态对话框。
dispose();
}
});
}
}
package GUI.dialog;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class DialogTest extends Frame {
private TextField tf = new TextField(15);
public void setInfo(String str) {
tf.setText(str);
}
public void init(){
setSize(500,500);
Button b1 = new Button("模态对话框");
Button b2 = new Button("非模态对话框");
//布局管理器复习下,我记得有上北下南,左西右东 中五个部位,很久没看这个了。
add(tf,"North");
add(b1,"Center");
add(b2,"East");
setVisible(true);
addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
b1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//注意这个模态对话框的owner是外部类,不能用this,而要用外部类名+this
MyDialog md = new MyDialog(DialogTest.this,"modal dialog",true);
//获得主界面上的信息,显示到模态对话框的文本框中
md.setInfo(tf.getText());
//显示模态对话框
md.setVisible(true);
//下面的语句只有在模态对话框关闭后才能执行。
tf.setText(md.getInfo());
}
});
b2.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//创建非模态对话框
MyDialog md = new MyDialog(DialogTest.this,"modaless dialog",false);
//获得主界面上的信息,显示到非模态对话框的文本框中
md.setInfo(tf.getText());
//显示非模态对话框
md.setVisible(true);
}
});
}
public static void main(String[] args) {
new DialogTest().init();
}
}
package GUI.MenuBar;
import java.awt.CheckboxMenuItem;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestMenuBar extends Frame {
/**
* 创建菜单条,菜单,菜单项。编写菜单项的单击事件。
* 实现的功能:
* 1.普通菜单项的单击事件
* 2.一个普通菜单实现多个不同的功能,如:开始时是"打开",
* 单击打开后,菜单项的功能变为"关闭",多次单击这个菜单项实现多个功能的转换。
* 3.测试复选标记的菜单项,单选中和不选中时,作出不同的响应。监听器接口为ItemListener
*/
MenuBar mb = new MenuBar();
Menu m1 = new Menu("File");
Menu m2 = new Menu("Edit");
Menu m3 = new Menu("Tools");
Menu m4 = new Menu("Help");
Menu m5 = new Menu("Print");
MenuItem mi1 = new MenuItem("New");
MenuItem mi2 = new MenuItem("Open");
MenuItem mi3 = new MenuItem("Save");
MenuItem mi4 = new MenuItem("Preview");
MenuItem mi5 = new MenuItem("Setting");
/*在菜单项中创建一个分隔线,也可以用下面的方法,但是不建议使用。
MenuItem mi6 = new MenuItem("-");
m1.add(mi6);
*/
//创建一个具有复选标记的菜单项
CheckboxMenuItem cmi = new CheckboxMenuItem("Quit");
public void init(){
Frame f =new Frame("MeanBar");
f.setSize(500,500);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
m5.add(mi4);
m5.add(mi5);
m1.add(mi1);
m1.add(mi2);
m1.add(mi3);
m1.add(m5);
//将一个分隔线或连字符添加到菜单的当前位置
m1.addSeparator();
m1.add(cmi);
mb.add(m1);
mb.add(m2);
mb.add(m3);
mb.add(m4);
//给主窗体设置菜单条
f.setMenuBar(mb);
//注册事件监听器可以用如下的方法:用同一个事件监听器对象监听
MenuItemLister mLister = new MenuItemLister();
mi4.addActionListener(mLister);
mi5.addActionListener(mLister);
//测试一个菜单实现多种功能
mi2.addActionListener(mLister);
//测试复选标记的菜单项,单选中和不选中时,作出不同的响应。监听器接口为ItemListener
cmi.addItemListener(new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
if( ((CheckboxMenuItem)e.getSource()).getState()){
System.out.println("选中啦……");
}else{
System.out.println("可惜啦,没有选中……");
}
}
});
}
public static void main(String[] args) {
new TestMenuBar().init();
}
}
package GUI.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MenuItemLister implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("Preview")){
System.out.println("黑马 我来了");
}else if(e.getActionCommand().equals("Setting")){
System.out.println("I am Coming ……");
}
/*
* 此段代码实现了一个菜单项可以做多种事情
* 原理是:但单击最原始的菜单项时,作出响应,调用e.getSource()方法获得事件源
* 改变菜单项的label属性,setLabel(),再调用e.getActionCommand()方法
* 重新匹配事件。
*/
else if(e.getActionCommand().equals("Open")){
MenuItem m = (MenuItem) e.getSource();
m.setLabel("Close");
System.out.println("I am Opening ……");
}else if(e.getActionCommand().equals("Close")){
//获得最初发生 Event 的对象
MenuItem m = (MenuItem) e.getSource();
//改变label属性
m.setLabel("Open");
System.out.println("I am Closing ……");
}
}
}
package GUI.pane;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.ScrollPane;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class PaneTest extends Frame {
/**
* Panel 和ScrollPane
* Panel类是一个容器类,用于产生一种特殊的空白面板,可以容纳其他的组件,但不能独立存在。
* ScrollPane类是一种容器类,用于产生滚动窗口,通过滚动条在一个较小的容器窗口中显示较大的部件。
* Panel类和ScrollPane类都不能独立存在
* ScrollPane类中只能防止一个部件,如果想放置多个部件,需要将多个部件放置在Panel中,
* 再将Panel放置到ScrollPane中
*/
public void init(){
setSize(200, 200);
setTitle("ScrollPane");
TextArea ta1 = new TextArea("",10,50,TextArea.SCROLLBARS_NONE);
TextArea ta2 = new TextArea("",10,50,TextArea.SCROLLBARS_NONE);
TextField tf = new TextField(100);
Panel p = new Panel();
p.add(ta2);
p.add(tf);
ScrollPane sp1 = new ScrollPane();
ScrollPane sp2 = new ScrollPane();
sp1.add(ta1);
sp2.add(p);
add(sp1);
add(sp2);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setVisible(true);
}
public static void main(String[] args) {
new PaneTest().init();
}
}