Java之JFrame

表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创建窗口”的窗口,该窗口的关闭按钮执行的动作是退出窗口,该窗口将显示在显示器的中央,代码如下:

Java代码   收藏代码
  1. public static void main(String[] args) {  
  2. JFrame frame = new JFrame("利用JFrame创建窗口"); // 创建指定标题的JFrame窗口对象  
  3. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭按钮的动作为退出窗口  
  4. frame.setSize(400300);                          // 设置窗口大小  
  5. Dimension displaySize = Toolkit.getDefaultToolkit().getScreenSize(); // 获得显示器大小对象  
  6. Dimension frameSize = frame.getSize();             // 获得窗口大小对象  
  7. if (frameSize.width > displaySize.width)  
  8. frameSize.width = displaySize.width;           // 窗口的宽度不能大于显示器的宽度  
  9. if (frameSize.height > displaySize.height)  
  10. frameSize.height = displaySize.height;          // 窗口的高度不能大于显示器的高度  
  11. frame.setLocation((displaySize.width - frameSize.width) / 2,  
  12. (displaySize.height - frameSize.height) / 2); // 设置窗口居中显示器显示  
  13. frame.setVisible(true);                          // 设置窗口为可见的,默认为不可见  
  14. }  

 

3.修改图标:

      setIconImage (Toolkit .  getDefaultToolkit ().  createImage (
                    getClass ().  getResource ( "login.png" )));
    (注意:图片login.png要放在与调用该图片的类于同一个文件夹;另,Java好像不支持ico格式)

 

4.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());

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

 

5. 画图并添加鼠标事件

Java代码   收藏代码
  1. final Image img = Toolkit.getDefaultToolkit().getImage(  
  2.                 Test.class.getResource("map.png"));  
  3.         JTextArea ta = new JTextArea() {  
  4.             {  
  5.                 setOpaque(false);// 设置不透明的参数,缺少时背景图片不显示  
  6.             }  
  7.   
  8.             public void paint(Graphics g) {  
  9.                 g.drawImage(img, 00this);  
  10.                 super.paint(g);  
  11.             }  
  12.         };  
  13.   
  14.         MouseListener ml = new MouseListener() {  
  15.             public void mouseClicked(MouseEvent e) {  
  16.                 if (e.getClickCount() == 2) {  
  17.                     System.out.println("Mouse double clicked");  
  18.                                   }  
  19.                         }  
  20.                       public void mouseEntered(MouseEvent e) {  
  21.                 // TODO Auto-generated method stub  
  22.   
  23.             }  
  24.   
  25.             public void mouseExited(MouseEvent e) {  
  26.                 // TODO Auto-generated method stub  
  27.   
  28.             }  
  29.   
  30.             public void mousePressed(MouseEvent e) {  
  31.                 // TODO Auto-generated method stub  
  32.   
  33.             }  
  34.   
  35.             public void mouseReleased(MouseEvent e) {  
  36.                 // TODO Auto-generated method stub  
  37.   
  38.             }  
  39.                };  
  40.                ta.addMouseListener(ml);  
  41.         ta.setBounds(00300200);  
  42.         ta.setEditable(false);  
 

6.另一个例子:在一个TextArea里写内容,其他两个同时显示

Java代码   收藏代码
  1. /*JTextArea是多行文本编辑器,JTextField是一个简单的单行文本编辑器,它们都由JTextComponent类派生,所以它们包含一些共同的方法,如设置和获取所显示的文本,指定文本是否可编辑,或者是否只读,管理文本内的光标位置以及管理文本选择等。 
  2. 文本组件的模型是一个称为Document的对象,对于一个JTextArea或JTextField,要为之增加或删除文本,就会改变相应的Document。当出现某种改动时,要由文档本身(而不是可视的组件)来生成与文本相关的事件。因此,为了接收JTextArea修改的通知,就要向底层Document注册,而不是向JTextArea组件本身注册: 
  3. */  
  4. JTextArea textArea = new JTextArea();  
  5. Document d = textArea.getDocument();  
  6. d.addDocumentListener(someListener);  
  7. /* 
  8. 一个例子如下,在任意的一个文本区中键入的内容,在三个区中都将得以体现。我们要做的就是让所有的文本区都共享一个数据模型。 
  9. */  
  10. import java.awt.Container;  
  11. import java.awt.GridLayout;  
  12. import javax.swing.JFrame;  
  13. import javax.swing.JScrollPane;  
  14. import javax.swing.JTextArea;  
  15.   
  16. public class ShareModel {  
  17.      
  18.     public static void main(String[] args) {  
  19.         JFrame frame = new JFrame("ShareModel");  
  20.          
  21.         JTextArea areaFiftyOne = new JTextArea();  
  22.         JTextArea areaFiftyTwo = new JTextArea();  
  23.         areaFiftyTwo.setDocument(areaFiftyOne.getDocument());  
  24.         JTextArea areaFiftyThree = new JTextArea();  
  25.         areaFiftyThree.setDocument(areaFiftyOne.getDocument());  
  26.          
  27.         Container content = frame.getContentPane();  
  28.         content.setLayout(new GridLayout(3,1));  
  29.         content.add(new JScrollPane(areaFiftyOne));  
  30.         content.add(new JScrollPane(areaFiftyTwo));  
  31.         content.add(new JScrollPane(areaFiftyThree));  
  32.          
  33.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  34.         frame.setSize(300,300);  
  35.         frame.setVisible(true);  
  36.     }  
  37. }  
  38. /* 
  39. 在一个文本区中键入时,此文本区将接受键盘事件,它会调用文档中的方法来更新数据,相应的,文档会向其它文本区发送事件,通知出现了更新,从而使它们能够正确的显示文档的新数据。不过,所有这一切都无需我们关心。要做的只是通知文本区使用同一数据。Swing会接管其余的一切。 
  40. 另外需要注意的,JTextArea没有滚动功能,超出文本区域的内容无法显示出来,通过鼠标拖动也无法看到。但它实现了Swing Scrollable接口。必须把它放置在JScrollPane的内部才能实现滚动。 
  41. */  
 

 

 

 

7.Java 关闭窗体的六种方法 

-------------------------------------------------------------------------------- 

Java代码   收藏代码
  1. //1.使用JFrame的enableEvents和processWindowEvent  
  2. //Frame1.java  
  3. import java.awt.*;  
  4. import java.awt.event.*;  
  5. import javax.swing.*;  
  6. public class Frame1 extends JFrame {  
  7.     public Frame1() {  
  8.         enableEvents(AWTEvent.WINDOW_EVENT_MASK);  
  9.         this.setSize(new Dimension(400300));  
  10.         this.setTitle("Frame1");  
  11.     }  
  12.     protected void processWindowEvent(WindowEvent e) {  
  13.         super.processWindowEvent(e);  
  14.         if (e.getID() == WindowEvent.WINDOW_CLOSING) {  
  15.             System.exit(0);  
  16.         }  
  17.     }  
  18. }  
  19.   
  20. //2.直接实现WindowListener接口  
  21. //Frame1.java  
  22. import java.awt.*;  
  23. import java.awt.event.*;  
  24.   
  25. public class Frame1 extends Frame implements WindowListener {  
  26.     public Frame1() {  
  27.         this.setSize(new Dimension(400300));  
  28.         this.setTitle("Frame1");  
  29.         this.addWindowListener(this);  
  30.     }  
  31.     public void windowClosing(WindowEvent windowEvent) {  
  32.         System.exit(0);  
  33.     }  
  34.     public void windowOpened(WindowEvent windowEvent) { }  
  35.     public void windowClosed(WindowEvent windowEvent) { }  
  36.     public void windowIconified(WindowEvent windowEvent) { }  
  37.     public void windowDeiconified(WindowEvent windowEvent) { }  
  38.     public void windowActivated(WindowEvent windowEvent) { }  
  39.     public void windowDeactivated(WindowEvent windowEvent) { }  
  40. }  
  41.   
  42. //3.直接继承窗体适配器WindowAdapter  
  43. //Frame1.java  
  44. import java.awt.*;  
  45. import java.awt.event.*;  
  46.   
  47. public class Frame1 extends WindowAdapter {  
  48.     public Frame1() {  
  49.         Frame f=new Frame();  
  50.         f.setSize(new Dimension(400300));  
  51.         f.setTitle("Frame1");  
  52.         f.addWindowListener(this);  
  53.         f.setVisible(true);  
  54.     }  
  55.     public static void main(String[] s){  
  56.         new Frame1();  
  57.     }  
  58.     public void windowClosing(WindowEvent windowEvent) {  
  59.         System.exit(0);  
  60.     }  
  61. }  
  62.   
  63. //4.间接继承窗体适配器WindowAdapter  
  64. //Frame1.java  
  65. import java.awt.*;  
  66. import java.awt.event.*;  
  67. public class Frame1 extends Frame {  
  68.     public Frame1() {  
  69.         this.setSize(new Dimension(400300));  
  70.         this.setTitle("Frame1");  
  71.         this.addWindowListener(new winAdapter());  
  72.         this.setVisible(true);  
  73.     }  
  74.     public static void main(String[] s){  
  75.         new Frame1();  
  76.     }  
  77. }  
  78.   
  79. class winAdapter extends WindowAdapter{  
  80.     public void windowClosing(WindowEvent windowEvent) {  
  81.         System.exit(0);  
  82.     }  
  83. }  
  84.   
  85. //5.间接实现WindowListener接口  
  86. //Frame1.java  
  87. import java.awt.*;  
  88. import java.awt.event.*;  
  89. public class Frame1 extends Frame {  
  90.     public Frame1() {  
  91.         this.setSize(new Dimension(400300));  
  92.         this.setTitle("Frame1");  
  93.         this.addWindowListener(new winEventHandle());  
  94.         this.setVisible(true);  
  95.     }  
  96.     public static void main(String[] s){  
  97.         new Frame1();  
  98.     }  
  99. }  
  100.   
  101. class winEventHandle implements WindowListener {  
  102.     public void windowClosing(WindowEvent windowEvent) {  
  103.         System.exit(0);  
  104.     }  
  105.     public void windowOpened(WindowEvent windowEvent) { }  
  106.     public void windowClosed(WindowEvent windowEvent) { }  
  107.     public void windowIconified(WindowEvent windowEvent) { }  
  108.     public void windowDeiconified(WindowEvent windowEvent) { }  
  109.     public void windowActivated(WindowEvent windowEvent) { }  
  110.     public void windowDeactivated(WindowEvent windowEvent) { }  
  111. }  
  112.   
  113. //6.使用Inner Class  
  114. //Frame1.java  
  115. import java.awt.*;  
  116. import java.awt.event.*;  
  117. public class Frame1{  
  118.     public Frame1(){  
  119.     Frame f=new Frame();  
  120.     f.addWindowListener(new WindowAdapter(){  
  121.         public void windowClosing(WindowEvent e){  
  122.             System.exit(0);  
  123.         }  
  124.     });  
  125.     f.setSize(new Dimension(400300));  
  126.     f.setVisible(true);  
  127. }  
  128.     public static void main(String[] s){  
  129.         new Frame1();  
  130.     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值