Swing-JFrame入门

一个简单例子:
publicclass Test(){  
    public static void main(String[] args){  
        JFrame frame = new JFrame();  
        JPanel panel = new JPanel();  
        JTextArea textArea = new JTextArea();  
        panel.setLayout(new GridLayout());  
        textArea.setText("test");  
        //当TextArea里的内容过长时生成滚动条
        panel.add(new JScrollPane(textArea));  
        frame.add(panel);  
        frame.setSize(200,200);  
        frame.setVisible(true);  
    }  
}  
创建窗体
在开发Java应用程序时,通常情况下利用JFrame创建窗口。利用JFrame创建的窗口分别包含一个标题、最小化按钮、最大化按钮和关闭按钮
在利用JFrame创建窗口时,需要设置单击关闭按钮时执行的动作,设置方法为通过JFrame对象的setDefault CloseOperation(int operation)方法,该方法的入口参数可以从JFrame类的静态常量中选择,可选的静态常量如表1所示。

表1 JFrame类中用来设置关闭按钮动作的静态常量

设置单击关闭按钮时执行动作的典型代码如下:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) :

JFrame窗口的默认显示位置为从(0,0)点开始绘制,即从显示器的左上角开始绘制。通常情况下更希望显示在显示器的中央,可以通过Toolkit类 的静态方法getDefaultToolkit()获得一个Toolkit类的对象,然后通过Toolkit对象的getScreenSize()方法获 得一个Dimension类的对象,通过Dimension对象可以得到显示器的大小,例如显示器的宽度和高度,获得Dimension对象的典型代码如 下:

Dimension displaySize = Toolkit.getDefaultToolkit().getScreenSize();

通过JFrame对象的getSize()方法也可以得到一个Dimension类的对象,通过Dimension对象可以得到JFrame窗口的大小,例如JFrame窗口的宽度和高度,获得Dimension对象的典型代码如下:

Dimension frameSize = frame.getSize();

利用上面得到的两个Dimension类的对象,就可以计算出显示在显示器中央时的起始绘制点了,然后通过JFrame对象的setLocation(int x, int y)方法,设置JFrame窗口在显示器中的起始绘制点,典型代码如下:

frame.setLocation((displaySize.width - frameSize.width) / 2,(displaySize.height - frameSize.height) / 2);

利用JFrame创建的窗口默认是不可见的,即在运行时不在显示器上绘制窗口,设置为可见的方法是通过JFrame对象的setVisible(boolean b)方法,并将入口参数设为true,典型代码如下:

frame.setVisible(true);

下面将通过一个例子,实现利用JFrame创建一个图1所示的窗口。
下面的代码将创建一个标题为“利用JFrame创建窗口”的窗口,该窗口的关闭按钮执行的动作是退出窗口,该窗口将显示在显示器的中央,代码如下:

public static void main(String[] args) {  
JFrame frame = new JFrame("利用JFrame创建窗口"); // 创建指定标题的JFrame窗口对象
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭按钮的动作为退出窗口
frame.setSize(400, 300);                          // 设置窗口大小
Dimension displaySize = Toolkit.getDefaultToolkit().getScreenSize(); // 获得显示器大小对象
Dimension frameSize = frame.getSize();             // 获得窗口大小对象
if (frameSize.width > displaySize.width)  
frameSize.width = displaySize.width;           // 窗口的宽度不能大于显示器的宽度
if (frameSize.height > displaySize.height)  
frameSize.height = displaySize.height;          // 窗口的高度不能大于显示器的高度
frame.setLocation((displaySize.width - frameSize.width) / 2,  
(displaySize.height - frameSize.height) / 2); // 设置窗口居中显示器显示
frame.setVisible(true);                          // 设置窗口为可见的,默认为不可见
}  
修改图标
      setIconImage (Toolkit .  getDefaultToolkit ().  createImage ( getClass ().  getResource ( "login.png" )));
(注意:图片login.png要放在与调用该图片的类于同一个文件夹;另,Java好像不支持ico格式)
Java Swing如何实时刷新JTextArea

以显示刚才加append的内容
在代码中执行完textArea.append(“message”)后,如果你想让这个更新立刻显示在界面上而不是等swing的主线程返回后刷新,我们一般会在该语句后调用textArea.invalidate()和textArea.repaint()。
问题是这个方法并不能有任何效果,textArea的内容没有任何变化,这或许是swing的一个bug,有一个笨拙的办法可以实现这个效果,就是执行以下语句

  textArea.paintImmediately(textArea.getBounds());
或
  textArea.paintImmediately(textArea.getX(),textArea.getY(), textArea.getWidth(), textArea.getHeight());

这时,你会发现你刚才增加的消息已经被实时地显示出来了。

画图并添加鼠标事件
final Image img = Toolkit.getDefaultToolkit().getImage(  
                Test.class.getResource("map.png"));  
        JTextArea ta = new JTextArea() {  
            {  
                setOpaque(false);// 设置不透明的参数,缺少时背景图片不显示
            }  
publicvoid paint(Graphics g) {  
                g.drawImage(img, 0, 0, this);  
super.paint(g);  
            }  
        };  
        MouseListener ml = new MouseListener() {  
publicvoid mouseClicked(MouseEvent e) {  
if (e.getClickCount() == 2) {  
                    System.out.println("Mouse double clicked");  
                                  }  
                        }  
publicvoid mouseEntered(MouseEvent e) {  
// TODO Auto-generated method stub
            }  
publicvoid mouseExited(MouseEvent e) {  
// TODO Auto-generated method stub
            }  
publicvoid mousePressed(MouseEvent e) {  
// TODO Auto-generated method stub
            }  
publicvoid mouseReleased(MouseEvent e) {  
// TODO Auto-generated method stub
            }  
               };  
               ta.addMouseListener(ml);  
        ta.setBounds(0, 0, 300, 200);  
        ta.setEditable(false);  
另一个例子:在一个TextArea里写内容,其他两个同时显示
/*JTextArea是多行文本编辑器,JTextField是一个简单的单行文本编辑器,它们都由JTextComponent类派生,所以它们包含一些共同的方法,如设置和获取所显示的文本,指定文本是否可编辑,或者是否只读,管理文本内的光标位置以及管理文本选择等。
文本组件的模型是一个称为Document的对象,对于一个JTextArea或JTextField,要为之增加或删除文本,就会改变相应的Document。当出现某种改动时,要由文档本身(而不是可视的组件)来生成与文本相关的事件。因此,为了接收JTextArea修改的通知,就要向底层Document注册,而不是向JTextArea组件本身注册:
*/
JTextArea textArea = new JTextArea();  
Document d = textArea.getDocument();  
d.addDocumentListener(someListener);  
/*
一个例子如下,在任意的一个文本区中键入的内容,在三个区中都将得以体现。我们要做的就是让所有的文本区都共享一个数据模型。
*/
import java.awt.Container;  
import java.awt.GridLayout;  
import javax.swing.JFrame;  
import javax.swing.JScrollPane;  
import javax.swing.JTextArea;  
publicclass ShareModel {  
publicstaticvoid main(String[] args) {  
        JFrame frame = new JFrame("ShareModel");  
        JTextArea areaFiftyOne = new JTextArea();  
        JTextArea areaFiftyTwo = new JTextArea();  
        areaFiftyTwo.setDocument(areaFiftyOne.getDocument());  
        JTextArea areaFiftyThree = new JTextArea();  
        areaFiftyThree.setDocument(areaFiftyOne.getDocument());  
        Container content = frame.getContentPane();  
        content.setLayout(new GridLayout(3,1));  
        content.add(new JScrollPane(areaFiftyOne));  
        content.add(new JScrollPane(areaFiftyTwo));  
        content.add(new JScrollPane(areaFiftyThree));  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        frame.setSize(300,300);  
        frame.setVisible(true);  
    }  
}  
/*
在一个文本区中键入时,此文本区将接受键盘事件,它会调用文档中的方法来更新数据,相应的,文档会向其它文本区发送事件,通知出现了更新,从而使它们能够正确的显示文档的新数据。不过,所有这一切都无需我们关心。要做的只是通知文本区使用同一数据。Swing会接管其余的一切。
另外需要注意的,JTextArea没有滚动功能,超出文本区域的内容无法显示出来,通过鼠标拖动也无法看到。但它实现了Swing Scrollable接口。必须把它放置在JScrollPane的内部才能实现滚动。
*/
Java 关闭窗体的六种方法

//1.使用JFrame的enableEvents和processWindowEvent
//Frame1.java
import java.awt.*;  
import java.awt.event.*;  
import javax.swing.*;  
publicclass Frame1 extends JFrame {  
public Frame1() {  
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);  
this.setSize(new Dimension(400, 300));  
this.setTitle("Frame1");  
    }  
protectedvoid processWindowEvent(WindowEvent e) {  
super.processWindowEvent(e);  
if (e.getID() == WindowEvent.WINDOW_CLOSING) {  
            System.exit(0);  
        }  
    }  
}

//2.直接实现WindowListener接口
//Frame1.java
import java.awt.*;  
import java.awt.event.*;  
publicclass Frame1 extends Frame implements WindowListener {  
public Frame1() {  
this.setSize(new Dimension(400, 300));  
this.setTitle("Frame1");  
this.addWindowListener(this);  
    }  
publicvoid windowClosing(WindowEvent windowEvent) {  
        System.exit(0);  
    }  
publicvoid windowOpened(WindowEvent windowEvent) { }  
publicvoid windowClosed(WindowEvent windowEvent) { }  
publicvoid windowIconified(WindowEvent windowEvent) { }  
publicvoid windowDeiconified(WindowEvent windowEvent) { }  
publicvoid windowActivated(WindowEvent windowEvent) { }  
publicvoid windowDeactivated(WindowEvent windowEvent) { }  
} 

//3.直接继承窗体适配器WindowAdapter
//Frame1.java
import java.awt.*;  
import java.awt.event.*;  
publicclass Frame1 extends WindowAdapter {  
public Frame1() {  
        Frame f=new Frame();  
        f.setSize(new Dimension(400, 300));  
        f.setTitle("Frame1");  
        f.addWindowListener(this);  
        f.setVisible(true);  
    }  
publicstaticvoid main(String[] s){  
new Frame1();  
    }  
publicvoid windowClosing(WindowEvent windowEvent) {  
        System.exit(0);  
    }  
} 

//4.间接继承窗体适配器WindowAdapter
//Frame1.java
import java.awt.*;  
import java.awt.event.*;  
publicclass Frame1 extends Frame {  
public Frame1() {  
this.setSize(new Dimension(400, 300));  
this.setTitle("Frame1");  
this.addWindowListener(new winAdapter());  
this.setVisible(true);  
    }  
publicstaticvoid main(String[] s){  
new Frame1();  
    }  
}  
class winAdapter extends WindowAdapter{  
publicvoid windowClosing(WindowEvent windowEvent) {  
        System.exit(0);  
    }  
} 

//5.间接实现WindowListener接口
//Frame1.java
import java.awt.*;  
import java.awt.event.*;  
publicclass Frame1 extends Frame {  
public Frame1() {  
this.setSize(new Dimension(400, 300));  
this.setTitle("Frame1");  
this.addWindowListener(new winEventHandle());  
this.setVisible(true);  
    }  
publicstaticvoid main(String[] s){  
new Frame1();  
    }  
}  
class winEventHandle implements WindowListener {  
publicvoid windowClosing(WindowEvent windowEvent) {  
        System.exit(0);  
    }  
publicvoid windowOpened(WindowEvent windowEvent) { }  
publicvoid windowClosed(WindowEvent windowEvent) { }  
publicvoid windowIconified(WindowEvent windowEvent) { }  
publicvoid windowDeiconified(WindowEvent windowEvent) { }  
publicvoid windowActivated(WindowEvent windowEvent) { }  
publicvoid windowDeactivated(WindowEvent windowEvent) { }  
}

//6.使用Inner Class
//Frame1.java
import java.awt.*;  
import java.awt.event.*;  
publicclass Frame1{  
public Frame1(){  
    Frame f=new Frame();  
    f.addWindowListener(new WindowAdapter(){  
publicvoid windowClosing(WindowEvent e){  
            System.exit(0);  
        }  
    });  
    f.setSize(new Dimension(400, 300));  
    f.setVisible(true);  
}  
publicstaticvoid main(String[] s){  
new Frame1();  
    }  
}  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值