zoukankan      html  css  js  c++  java
  • Java中利用JFrame创建窗体

    1. 一个简单例子:

    Java代码  收藏代码
    1. public class Test(){  
    2.     public static void main(String[] args){  
    3.         JFrame frame = new JFrame();  
    4.         JPanel panel = new JPanel();  
    5.         JTextArea textArea = new JTextArea();  
    6.           
    7.         panel.setLayout(new GridLayout());  
    8.         textArea.setText("test");  
    9.         //当TextArea里的内容过长时生成滚动条  
    10.         panel.add(new JScrollPane(textArea));  
    11.         frame.add(panel);  
    12.           
    13.         frame.setSize(200,200);  
    14.         frame.setVisible(true);  
    15.     }  
    16. }  
     

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

    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.     }  
    131. }  
  • 相关阅读:
    探索Java8:(二)Function接口的使用
    Vue 动态图片加载路径问题和解决方法
    小工具:使用Python自动生成MD风格链接
    解决Navicat Premium 12 连接oracle数据库出现ORA-28547的问题
    Beetl模板引擎入门教程
    JSON.stringify()的深度使用
    nvm 查看node版本
    去掉点击a标签时产生的虚线框
    html 设置input框的记忆功能(联想内容)
    php post和get请求
  • 原文地址:https://www.cnblogs.com/pekkle/p/6568831.html
Copyright © 2011-2022 走看看