目录
组件及事件处理
Java Swing概述
一、Swing特点
每个平台的GUI组件的显示会有所不同,但是在不同平台上运行使用Swing开发的应用程序时,就可以统一GUI组件的显示风格,因为Swing组件允许编程人员在跨平台时指定统一的外观和风格
Swing组件通常被称为“轻量级组件”,因为它完全由Java语言编写,而Java是不依赖于操作系统的语言,它可以在任何平台上运行,Swing的特点如下:
1、轻量级组件
2、可插入外观组件
二、Swing包
Swing包的层次结构和继承关系如下,其中比较重要的类是Component类、Container类和JComponent类。
在Swing组件中大多数GUI组件都是Component类的直接子类或间接子类,JComponent类是Swing组件各种特效的存放位置,这些组件的特效包括设定组件边界、GUI组件自动滚动等
在Swing组件中最重要的父类是Container类,而Container类有两个最重要的子类,分别是java.awt.Window与java.awt.Frame,除了以为的AWT类组件会继承这两个之外,现在的Swing组件也扩展了这两个类。
三、常用Swing组件
窗口
Java提供的JFrame类的实例就是一个底层容器,即窗口,JDialog类的实例也是一个底层容器,即对话框,其他组件必须被添加到底层容器中,借助底层容器和操作系统进行交互。JFrame类是Container类的间接子类,窗口也是一个容器,可以向其中添加组件。窗口默认被添加到显示器屏幕上,因此不允许将窗口添加到另一个容器里。
JFrame常用方法
JFrame构造方法:
- JFrame() 创建一个无标题的窗口。
- JFrame(String s) 创建标题为s的窗口。
常用方法:
- public void setBounds(int a,int b,int width,int height 设置窗口的初始位置是(a,b),即距屏幕左面a个像素、距屏幕上方b个像素;窗口的宽是width,高是height。
- public void setSize(int width,int height) 设置窗口的大小。
- public void setLocation(int x,int y) 设置窗口的位置,默认位置是(0,0)。
- public void setVisible(boolean b) 设置窗口是否可见,窗口默认是不可见的。
- public void setResizable(boolean b) 设置窗口是否可调整大小,默认可调整大小。
- public void dispose() 撤消当前窗口,并释放当前窗口所使用的资源。
- public void setExtendedState(int state) 设置窗口的扩展状态.
- public void setDefaultCloseOperation(int operation) 该方法用来设置单击窗体右上角的关闭图标后,程序会做出怎样的处理。如:EXIT_ON_CLOSE
- public void setLayout(LayoutManager mgr) 设置此容器的布局管理器。
- public Component add(Component comp) 将指定组件追加到此容器的尾部。
- public void setMenuBar(MenuBar mb) 将此 frame 的菜单栏设置为指定的菜单栏。
- public void validate() 使用 validate 方法会使容器再次布置其子组件。在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。
public class Text1 { public static void main(String[] args) { JFrame jFrame=new JFrame("窗口"); Container container=jFrame.getContentPane(); container.setBackground(Color.BLUE);//设置背景为蓝色 jFrame.setVisible(true);//设置窗口可见 jFrame.setBounds(100,100,100,100);//设置窗口的位置和长,宽 jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);窗口关闭效果 } }
菜单条、菜单、菜单项
1.菜单条
JComponent类的子类JMenubar负责创建菜单条,JFrame类有一个将菜单条放置到窗口中的方法:setJMenuBar(JMenuBar bar);该方法将菜单条添加到窗口的顶端。菜单条JMenuBar类构造方法:JMenuBar(); JMenuBar Mbar=new JMenuBar()
2.菜单
JComponent类的子类JMenu负责创建菜单。
菜单JMenu类构造方法:JMenu() ; JMenu(String s) ; JMenu m=new JMenu();
常用方法:
- public void add(JMenuItem item) 向菜单增加由参数item指定的菜单项
- public JMenuItem getItem(int n) 得到指定索引处的菜单选项。
- public int getItemCount() 得到菜单选项的数目。
3.菜单项
JComponent类的子类JMenuItem负责创建菜单项,JMenuItem类的主要方法有以下几种:
- JMenuItem(String s) 构造有标题的菜单项。
- JMenuItem(String text, Icon icon) 构造有标题和图标的菜单项
- public void setAccelerator(KeyStroke keyStroke)为菜单项设置快捷键
下例为摘抄:
public class Text2 extends JFrame{ JMenuBar jMenuBar; JMenu jMenu1,jMenu2; JMenuItem item1,item2; Text2(){ setLayout(new FlowLayout()); jMenuBar=new JMenuBar();//菜单条 jMenu1=new JMenu("菜单");//菜单 jMenu2=new JMenu("java");//菜单里的菜单 item1=new JMenuItem("c");//菜单项 item2=new JMenuItem("c++"); jMenu2.add(new JMenuItem("继承")); jMenu2.add(new JMenuItem("封装")); setJMenuBar(jMenuBar); jMenuBar.add(jMenu1); jMenu1.add(jMenu2); jMenu1.add(item1); jMenu1.add(item2); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100,100,200,200); } public static void main(String[] args) { Text2 text2=new Text2(); } }
常用组件与布局
常用组件
- JTextField:文本框:允许用户输入单行文本
- JTextArea:文本区:允许用户输入多行文本
- JButton:按钮:单击
- JLabel:标签:为用户提供提示信息
- JCheckBox:复选框:为用户提供多项选择,有选中与未选中两种状态
- JRadioButton:单选按钮:为用户提供单项选择
- JComboBox:下拉列表:单项选择
- JPasswordField:密码框,默认显字符是*,可通过setEchoChar(char c)重新设置显字符
1.文本框:由JComponent的子类JTextField创建文本框。
构造函数:JTextField( ) ; JTextField(int columns) ;
常用方法:public String getText();
public void setText(String t);
2.文本区:由JComponent的子类JTexArea创建文本区。
构造函数:JTextArea() ;JTextArea(int rows, int columns)
常用方法:public String getText();
public void setText(String t);
3.按钮:由JComponent的子类JButton类用来创建按钮。
构造函数:JButton() ; JButton(String text) ;
常用方法:public void addActionListener(ActionListener l);
4.标签:由JComponent的子类JLabel类用来创建标签。
构造函数:JLabel() ; JLabel(String text) ; JLabel(Icon image) ;
常用方法:public String getText();
public void setText(String t);
5.选择框:由JComponent的子类JCheckBox类用来创建选择框
构造函数: JCheckBox() ;JCheckBox(String text) ;
常用方法: public void addItemListener(ItemListener l)
public void addActionListener(ActionListener l)
ItemListener接口中:Object getItemSelectable()相当于getSource();
public int getStateChange();
若被选中SELECTED/DESEELCTED
6.单选按钮:由JComponent的子类JRadioButton类用来创建单项选择框。
构造函数: JRadioButton() ; JRadioButton(String text) ;
常用方法: public void addItemListener(ItemListener l)
7.下拉列表:由JComponent的子类JComboBox类用来创建下拉列表。
构造函数:JComboBox() ; JComboBox(Object[] items)
常用方法: public void addItemListener(ItemListener l)
public Object getSelectedItem();
public int getSelectedIndex()
8.密码框:由JComponent的子类JPasswordField创建密码框.
构造函数:JPasswordField() ; JPasswordField(int columns)
常用方法:public String getText();
public void setText(String t);
public void setEchoChar(char c)使用该方法重新设置回显字符.
public char[] getPassword()方法可以返回实际的密码常用容器
JComponent是Container的子类,因此JComponent子类创建的组件也都是容器。容器经常用来添加组件。JFrame是底层容器,本节提到的容器被习惯地称做中间容器,中间容器必须被添加到底层容器中才能发挥作用。
- JPanel面板:
构造方法:JPanel() ;如: JPanel p=new JPanel();
常用方法:public void add();默认是FlowLayout布局,可以向面板中添加组件,再把面板添加到其他容器中
- JTabbedPane:选项卡容器
当向选项卡容器添加组件时,会为这个组件设置选项卡,这样点击这个选项卡就会显示这个组件,选项卡默认在顶部从左向右排列。也可以通过JTabbedPane.TOP等设置位置,JTabbedPane容器可以使用:
add(String text,Component c);方法将组件c添加到JTabbedPane容器中,并指定和组件c对应的选项卡的文本提示是text。
- JScrollPane:滚动窗格
滚动窗格只可以添加一个组件,可以把一个组件放到一个滚动窗格中,然后通过滚动条来观看该组件。JTextArea不自带滚动条,因此就需要把文本区放到一个滚动窗格中。可以将文本区放在滚动窗格中,如:
JScrollPane jScrollPane=new JScrollPane(new TextArea())
- JSplitPane:拆分窗格
拆分窗格就是被分成两部分的容器。拆分窗格有两种类型:水平拆分和垂直拆分。水平拆分窗格用一条拆分线把窗格分成左右两部分,左面放一个组件,右面放一个组件,拆分线可以水平移动。垂直拆分窗格用一条拆分线把窗格分成上下两部分,上面放一个组件,下面放一个组件,拆分线可以垂直移动。
可分为左右或上下两部分,有两个构造方法:
JSplitPane(int a,Component b,Component c) //参数a决定时水平还是垂直:HORIZONTAL_SPLIT,VERTICAL_SPLIT //如 JSplitPane jSplitPane=new JSplitPane(JSplitPane.VERTICAL_SPLIT,new JButton(),new JButton())
JSplitPane(int a,boolean d,Component b,Component c) //参数d是决定拆分线移动时,组件是否连续变化,true是连续
- JLayeredPane:分层窗格
如果添加到容器中的组件经常需要处理重叠问题,就可以考虑将组件添加到分层窗格。分层窗格分成5个层,分层窗格使用
add(Jcomponent com, int layer);
常用布局
当把组件添加到容器中时,希望控制组件在容器中的位置,这就需要学习布局设计的知识。
我们将分别介绍java.awt包中的FlowLayout、BorderLayout、CardLayout、GridLayout布局类和java.swing.border包中的BoxLayout布局类。容器可以使用方法:
setLayout(布局对象);
来设置自己的布局,控制组件在容器中的位置1.FlowLayout布局:
是JPanel型容器的默认布局
1)创建布局对象 : FlowLayout flow=new FlowLayout();
2)容器con使用布局对象: con.setLayout(flow);
3)con可以使用Container类提供的add方法将组件顺序地添加到容器中
FlowLayout布局对象调用相应的方法可以重新设置布局的对齐方式等.
如: public void setAlignment(int align)2.BorderLayout布局:
BorderLayout 布局是Window型容器的默认布局 。
使用BorderLayout布局的容器con,可以使用add方法将一个组件b添加到中心区域:con.add(b,BorderLayout.CENTER);
或 con.add(BorderLayour.CENTER,b);3.CardLayout 布局 :
使用CardLayout的一般步骤如下:
1)创建CardLayout对象 CardLayout card=new CardLayout();
2)为容器设置布局 con.setLayout(card);
3)容器调用add(String s,Component b)将组件b加入容器,并给出了显示该组件的代号s。
4)布局对象card用CardLayout类提供的show()方法,显示容器con中组件代号为s的组件:card.show(con,s);
使用CardLayout 的容器可以容纳多个组件,但是实际上同一时刻容器只能从这些组件中选出一个来显示,就像一叠“扑克牌”每次只能显示最上面一张一样,这个被显示的组件将占据所有的容器空间,依次排序4.GridLayout布局 :
GridLayout布局策略是把容器划分成若干行乘若干列的网格区域,组件就位于这些划分出来的小格中。 GridLayout布局编辑器的一般步骤如下:
1)创建布局对象,指定划分网格的行数m和列数n
GridLayout grid=new new GridLayout(10,8);
2)使用GridLayout布局的容器调用方法add(Component c)将组件c加入容器。5.null布局
可以把一个容器的布局设置为null布局(空布局)。空布局容器可以准确地定位组件在容器的位置和大小。setBounds(int a,int b,int width,int height)方法是所有组件都拥有的一个方法,组件调用该方法可以设置本身的大小和在容器中的位置。6.BoxLayout布局
Box类的类(静态)方法 createHorizontalBox()获得一个行型盒式容器;
使用Box类的类(静态)方法 createVerticalBox()获得一个列型盒式容器。
想控制盒式布局容器中组件之间的距离,需使用水平支撑组件或垂直支撑。例子:
package com.GUI; import java.awt.*; import javax.swing.*; class PanelGridLayout extends JPanel{ PanelGridLayout(){ GridLayout grid=new GridLayout(12,12); //网格布局 setLayout(grid); Label label[][]=new Label[12][12]; for(int i=0;i<12;i++) { for(int j=0;j<12;j++) { label[i][j]=new Label(); if((i+j)%2==0) label[i][j].setBackground(Color.black); else label[i][j].setBackground(Color.white); add(label[i][j]); } } } } class PanelNullLayout extends JPanel { JButton button; JTextField text; PanelNullLayout() { setLayout(null); //空布局 button = new JButton("确定"); text = new JTextField(); add(text); add(button); text.setBounds(100,30,90,30); button.setBounds(190,30,66,30); } } class JshowLayout extends JFrame { PanelGridLayout pannelGrid; //网格布局的面板 PanelNullLayout panelNull ; //空布局的面板 JTabbedPane p; //选项卡窗格 JshowLayout() { setTitle("布局练习"); pannelGrid = new PanelGridLayout(); panelNull = new PanelNullLayout(); p = new JTabbedPane(); p.add("网格布局的面板",pannelGrid); p.add("空布局的面板",panelNull); add(p,BorderLayout.CENTER); add(new JButton("窗体是BorderLayout布局"),BorderLayout.NORTH); add(new JButton("南"),BorderLayout.SOUTH); add(new JButton("西"),BorderLayout.WEST); add(new JButton("东"),BorderLayout.EAST); setBounds(10,10,570,390); setVisible(true); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); validate(); } } public class ShowLayout { public static void main(String args[]) { new JshowLayout(); } }
处理事件
事件处理模式
(1)事件源:能触发事件的对象
(2)监视器:负责监视事件源对象
事件源.add???ActionEvent(监视器);
(3)处理事件的接口:监视器必须实现相应的接口ActionEvent事件
在文本框里输入文本回车,程序输出文本框中文本的长度(具体内容如下图所示)
ItemEvent事件
(1)ItemEvent事件源:选择框、下拉列
(2)注册监视器:addItemListener(ItemListener listen)
代码如下:AA a = new AA( ); box.addItemListener(a); Class AA implements ItemListener {undefined public void itemStateChanged(ItemEvent e) {undefined } }
(3)ItemListener接口:接口只有一个方法public void itemStateChanged(ItemEvent e)
(4)ItemEvent类中的方法:
——getSource()方法返回发生ItemEvent事件的事件源外
——getItemSelectable()方法返回发生Itemevent事件的事件源DocumentEvent事件
(1)DocumentEvent事件源
(2)注册监听器:addDucumentListener(DocumentListener listen);
Ducument doc = text。getDucument();
Doc.addDucumentListener(new A ( ));
Class A implements DocumentListener{undefined
}(3)DocumentListener接口:该接口有三个方法
——public void changedUpdate(DocumentEvent e)
——public void removeUpdate(DocumentEvent e)
——public void insertUpdate(DocumentEvent e)MouseEvent事件
(1)事件源:任何组件上都可以发生鼠标事件
——鼠标进入组件退出组件、在组件上方按下,松开,击鼠标
——拖动鼠标、运动鼠标等触发鼠标事件
(2)监听器
——addMouseListener(MouseListener listener)
——addMouseMotionListener(MouseMotionListener listener)
(3)处理事件接口:MouseListener接口有五个方法
——mousePressed(MouseEvent)负责处理在组件上按下鼠标键触发的鼠标事件
——mouseReleased(MouseEvent)负责处理在组件上释放鼠标键触发的鼠标事件
——mouseEntered(MouseEvent)负责处理鼠标进入组件触发的鼠标事件
——mouseExited(MouseEvent)负责处理鼠标离开组件触发的鼠标事件
——mouseClicked(MouseEvent)负责处理在组件上单击鼠标键触发的鼠标事件
MouseMotionListener接口有2个方法
——mouseDragged(MouseEvent)
——mouseMoved(MouseEvent)
MouseEvent中有下列几个重要的方法:
——getX()获取鼠标指针在事件源坐标系中的X坐标
——getY()获取鼠标指针在事件源坐标系中的Y坐标
——getModifiers()获取鼠标的左键或右键
——getClickCount()获取鼠标被单击的次数
——getSource()获取发生鼠标事件的事件源焦点事件
(1)事件源:任何组件都可以发生焦点事件,当组件获得焦点监视器后,如果组件从无输入焦点变成有输入焦点或从有输入焦点变成无输入焦点都会触发FocusEvent事件
(2)监视器:addFocusListener(FocusListener listener)
(3)处理事件的接口FocusListener有2个方法
——public void focusGained(FocusEvent e)
——public void focusLost(FocusEvent e)
(4)组件也可调用:public boolean requestFocusInWindow()方法获得输入焦点键盘事件
(1)事件源:当一个组件处于激活状态时,敲击键盘上一个键就导致这个组件触发键盘事件
(2)监视器:addKeyListener(KeyListener listener)
(3)处理事件接口KeyListener有3个方法
——public void keyPressed(KeyEvent e)
——public void keyTyped(KeyEvent e)
——public void KeyReleased(KeyEvent e)
KeyEvent类的public int getKeyCode()方法,可以判断哪个键被按下、敲击或释放,getKeyCode方法返回一个键码值,也可以用KeyEvent类的public char getKeyChar()判断哪个键被按下、敲击或释放,getKeyChar()方法返回键上的字符窗口事件
JFrame及子类创建的窗口可以调用setDefaultCloseOperation(int operation)方法设置窗口的关闭方式
参数Operation取JFrame的static常量:
——DO_NOTHING_ON_CLOSE(什么也不做)
——HIDE_ON_CLOSE(隐藏当前窗口)
——DISPOSE_ON_CLOSE(隐藏当前窗口,并解释窗体占有的其他资源)
——EXIT_ON_CLOSE(结束窗口所在的应用程序)
窗口事件,通过处理事件来满足程序的要求,需要注意的是,如果准备处理窗口事件,必须事先保证窗口的默认关闭方式为DO_NOTHING_ON_CLOSE(什么也不做)
(1)事件源:JFrame是Window(java.awt)的子类,凡是Window子类创建的对象可以发生WindowEvent事件,即窗口事件
(2)监视器:addWindowlistener(WindowListener listener);
(3)处理事件的接口WindowListener(有7个方法)
——windowActivated(WindowEvent e)当窗口从非激活状态到激活时,窗口的监视器调用该方法
——windowDeactivate(WindowEvent e)当窗口激活状态到非激活状态时,窗口的监视器调用该方法
——windowClosing(WindowEvent e)当窗口正在被关闭时,窗口的监视器调用该方法
——windowClosed(WindowEvent e)当窗口关闭后,窗口的监视器调用该方法
——windowIconified(WindowEvent e)当窗口图标化时,窗口的监视器调用该方法
——windowDeiconified(WindowEvent e)当窗口撤销图标化时,窗口的监视器调用该方法
——windowOpened(WindowEvent e)当窗口打开时,窗口的监视器调用该方法
Tips :当单击窗口右上角的关闭图标时,监视器首先调用windowClosing方法,如果在该方法中,使用System.exit(0);退出程序的运行,那么监视器就没有机会再调用windowClosed方法
事件总结
- 授权模式:Java的事件处理是基于授权模式,即事件源调用方法将某个对象注册为自己的监视器
- 接口回调:addXXXListener(XXXListener listener)方法中的参数是一个接口,listener可以引用任何实现了该接口的类所创建的对象,当事件源发生事件时,接口listener立刻回调被类实现的接口中的某个方法
- 方法绑定:当事件源触发事件发生后,监视器准确知道去调用哪个方法
- 保持松耦合:当事件源触发事件发生后,系统知道某个方法会被执行,但无须关心到底是哪个对象去调用了这个方法,因为任何实现接口的类的实例(做为监视器)都可以调用这个方法来处理事件
使用MVC结构
模型—视图—控制器(Model-View-Controller),简称为MVC,它是一种通过三个不同部分构造一个软件或组件的理想办法:
——模型(model):用于存储数据对象
——视图(view):为模型提供数据显示的对象
——控制器(controller):处理用户的交互操作,对于用户的操作作出响应,让模型和视图进行必要的交互,即通过视图修改、获取模型中的数据;当模型中的数据变化时,让视图更新显示
在设计程序时:可以将某个对象看作“模型”,然后为“模型”提供恰当的显示组件,即“视图”
为了对用户的操作作出响应,可以选择某个组件做“控制器”,当触发事件时,通过“视图”修改或得到“模型”中维护着的数据,并让“视图”更新显示
对话框
对话框分为有模式和无模式
——有模式:如果有模式的对话框处于激活状态时,只让程序响应对话框内部的事件,而且将堵塞其他线程的执行,用户不能再激活对话框所在存储中的其他窗口,直到对话框消失不见
——无模式:无模式对话框处于激活状态时,能再激活其他窗口,也不堵塞其他线程的执行消息对话框
(有模式对话框)
——用javax.swing包中的JOptionPane类的静态方法创建一个消息对话框
静态方法如图所示输入对话框
(有模式对话框)
静态方法如图所示:
确认对话框
(有模式对话框)
静态方法如图所示:
颜色对话框
(有模式对话框)
静态方法如图所示:
自定义对话框
常用构造方法如图所示:
树组件与表格组件
树组件
(1)DefaultMutableTreeNode节点
DefaultMutableTreeNode类的两个常用的构造方法是:
——DefaultMutableTreeNode(Object userObject)
——DefaultMutableTreeNode(Object userObject,boolean allowChildren)
(2)树上的TreeSelectionEvent事件使用addTreeSelectionListener(TreeSelectionListener listener)方法获得一个监视器表格组件
表格组件以行和列的形式显示数据,允许对表格中的数据进行编辑
(1)JTable有7个构造方法,这里介绍常用的三个
——JTable()创建默认的表格模型
——JTable(int a,int b)创建a行,b列的默认模型表格
——JTable(Object data[ ][ ],Object columnName[ ])创建默认表格模型对象,并且显示由data指定的二维数组的值,其列名由数组columnName指定
通过对表格中的数据进行编辑,可以修改表格中二维数组data中对应的数据。在表格中输入或修改数据后,需按回车或用鼠标单击表格的单元格确定所输入或修改的结果。当表格需要刷新显示时,让表格调用repaint方法
按钮绑定到键盘
将按钮绑定到键盘某个键的具体步骤
(1)获取输入映射
按钮首先调用:public final InputMap getInputMap(int condition)返回一个InputMap对象。
——InputMap inputmap = button.getInputMap(JCompent.WHEN_IN_FOCUSED_WINDOW);
参数condition取值JCompent类的下列static常量
——WHEN_FOCUSED
——WHEN_IN_FOCUSED_WINDOW
——WHEN_ANCESTOR_OF_FOCUSED_COMPONENT(2)绑定按钮的键盘操作
输入映射首先调用方法指定按钮的键盘操作:public void put(KeyStroke keyStroke,Object actionMapKey);
inputmap.put(KeyStroke.getKeyStroke(“A”),“dog”);(3)为按钮的键盘操作指定监视器
按钮调用方法:public final ActionMap getActionMap()返回一个ActionMap对象:ActionMap actionmap = button.getActionMap();然后,该对象actionmap调用方法:public void put(Object key,Action action)为按钮的键盘操作指定监视器(实现单击键盘上的键通知监视器的过程)
打印组件
应用程序可以使用PrintJob对象完成打印组件的工作
步骤如下:
(1)去ToolKit对象:组件调用getToolkit()方法返回系统提供的Toolkit对象的引用
(2)获得PrintJob对象:步骤1得到的Toolkit对象调用getPrintJob()方法返回一个PrintJob对象
(3)获取Graphics对象:PrintJob对象使用getGraphics()方法获得一个Graphics对象
(4)打印组件:步骤3获得的Graphics对象,——button.paintAll(g)将打印出该组件及子组件。
——pain(g)将打印出该组件本身,但不打印子组件,注意如果调用方法pain(g)将打印出该组件本身的形状,但不打组件上的其他信息,比如文字图形等打印位置:打印机总是从打印页的左上角开始打印组件,如果程序中有如下两条语句:
按钮_1.painAll(g);按钮_2.painAll(g); “按钮_2”就会被打印在“按钮_1”的上面,盖住按钮_1,为了避免这种情况的发生,Gaphics对象g可以使用Graphics类中的方法:
Translate(int x,int y)改变组件在打印页中打印的位置发布GUI、程序
发布GUI程序可以使用jar.exe把一些文件压缩成一个JAR文件
Win.java
import javax.swing.*; public class Win extends JFrame{ private static final long serialVersionUID = 1L; public static void main(String args[]){ JFrame jf = new JFrame(); jf.setVisible(true); jf.setBounds(200, 200, 200, 200); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setTitle("title"); } }
参考
《Java 2实用教程(第5版)》
https://blog.youkuaiyun.com/qq_29440983/article/details/103671839
https://blog.youkuaiyun.com/ayangann915/article/details/80470983