Swing-JFrame入门

来源:互联网 发布:李炎恢javascript视频 编辑:程序博客网 时间:2024/04/28 21:00

一个简单例子:

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.javaimport 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.javaimport 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.javaimport 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.javaimport 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.javaimport 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.javaimport 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();      }  }  
0 0
原创粉丝点击