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(); } }
- Swing-JFrame入门
- Java的Swing入门,继承JFrame报错问题
- Java---Swing(1)---------------------JFrame
- JFrame和Swing控件
- Swing框架—JFrame
- javax.swing.JFrame
- swing之JFrame 理解
- swing jframe FlashWindow
- SWING之JFrame
- swing中一个Jframe调用另一个Jframe
- swing jframe 框架面板知识
- Swing ——JFrame类
- JFrame入门示例
- 全屏SWING中JFrame窗口的例子
- JAVA学习笔记swing JFrame窗口学习
- Swing:JFrame 的各种窗体状态详解
- 关于 Swing JFrame 的 update不起作用
- myeclipse swing/matisse 跨jframe传递参数
- VBS中Run和Exec的区别
- 【swift-总结】控制流
- 宏定义
- java 泛型资源
- JVM解读(四):JVM内存溢出异常分析
- Swing-JFrame入门
- CSS3动画-过渡
- Installing Metasploit Framework on Mountain Lion and Mavericks
- VBS命令-进程操作代码(检测进程, 结束进程)
- PCBlayout设计
- errorlevel与%errorlevel%的区别 和 关于if errorlevel 命令
- MapReduce的类型与格式
- 自适应屏幕大小的网页
- 非常好的MATALB工具箱,包括SIFT,hog等