【JAVA】组件及事件处理-1(java Swing相关学习笔记)
简单记录一下java可视化的简单敲的代码。
建立窗口
import javax.swing.*;
import java.awt.*;
public class HelloworldGUi{
public static void main(String[] args){
JFrame frame =new JFrame("hello world");//创建一个标题为“hello world”的窗口;
frame.setLocation(300,300);//位置
frame.setSize(100,100);//初始大小
frame.setVisible(true);//能否调整窗口大小
frame.setVisible(true);//是否显示
JButton button = new JButton("come back to sky...");//创建按钮
button.setSize(30,30);//设置按钮大小
//button.setPreferredSize(new Dimension(30,30));初始为30*30像素点,如果按钮文本内容太长则适应文本
Container container = frame.getContentPane();//用Frame的getContentPane方法实例化一个Container类型的对象来
container.add(button);//向对象添加按钮
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
用到了javax.swing的JFrame类方法
- Java提供的JFrame类的实例是一个底层容器,即通常所称的窗口。其他组件必须被添加到底层容器中,以便借助这个地层容器和操作系统进行信息交互。
- JFrame类是Container类的间接子类。当需要一个窗口时,可使用JFrame或其子类创建一个对象。
JFrame常用方法
JFrame构造方法:
JFrame() 创建一个无标题的窗口。 JFrame(String s) 创建标题为s的窗口。
常用方法:
-
1**)public void setBounds(int a,int b,int width,int height** 设置窗口的初始位置是(a,b),即距屏幕左面a个像素、距屏幕上方b个像素;窗口的宽是width,高是height。
-
2**)public void setSize(int width,int height)** 设置窗口的大小。
-
3)public void setLocation(int x,int y) 设置窗口的位置,默认位置是(0,0)。
-
4)public void setVisible(boolean b) 设置窗口是否可见,窗口默认是不可见的。
-
5)public void setResizable(boolean b) 设置窗口是否可调整大小,默认可调整大小。
-
6)public void dispose() 撤消当前窗口,并释放当前窗口所使用的资源
-
7)public void setExtendedState(int state) 设置窗口的扩展状态.
-
8)public void setDefaultCloseOperation(int operation) 该方法用来设置单击窗体右上角的关闭图标后,程序会做出怎样的处理。如:EXIT_ON_CLOSE
-
9)public void setLayout(LayoutManager mgr) 设置此容器的布局管理器。
-
10)public Component add(Component comp) 将指定组件追加到此容器的尾部。
-
11**)public void setMenuBar(MenuBar mb)** 将此 frame 的菜单栏设置为指定的菜单栏。
-
12)public void validate() 使用 validate 方法会使容器再次布置其子组件。在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。
菜单
接着,一个window怎么能没有菜单呢,仿照他们的一般形式,尝试还原一个。
-
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)**为菜单项设置快捷
我补充了一个具体的窗口菜单,可以参考注释。(对按钮也有了更多说明,还是看代码具体)。
import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
public class HelloworldGUi{
public static void main(String[] args){
JFrame frame =new JFrame("hello world");//创建一个标题为“hello world”的窗口;
frame.setLocation(500,500);//位置
frame.setSize(1000,1000);//初始大小
frame.setVisible(true);//能否调整窗口大小
frame.setVisible(true);//是否显示
JButton button = new JButton("come back to sky...");//创建按钮
button.setSize(300,300);//设置按钮大小
button.setFont(new Font("Arial",Font.BOLD,24));//设置字体样式和大小
button.setLocation(500,500);//设置按键位置
//button.setPreferredSize(new Dimension(30,30));初始为30*30像素点,如果按钮文本内容太长则适应文本
Container container = frame.getContentPane();//用Frame的getContentPane方法实例化一个Container类型的对象来
container.add(button);//向对象添加按钮
JMenuBar menuBar = new JMenuBar();//创建一个菜单栏
JMenu filemenu = new JMenu("File");//船舰一个名为”File“的菜单
menuBar.add(filemenu);//将菜单添加到菜单栏
filemenu.add("New");//加菜单项
filemenu.add(("Open"));
filemenu.addSeparator();//加分割线
//设置子菜单项
JMenu saveMenu = new JMenu("Save");
saveMenu.add("Save");
saveMenu.add(("Save As"));
filemenu.add(saveMenu);
JMenu editmenu = new JMenu("Edit");
menuBar.add(editmenu);
//这组展示一下另一种添加菜单项的方式,以及如何添加图标,我们更提倡这种方式
JMenuItem Cut = new JMenuItem("Cut");//创建菜单条目
JMenuItem Copy = new JMenuItem("Copy");
JMenuItem Paste = new JMenuItem("Paste");
JMenuItem Delete = new JMenuItem("Delete");
Cut.setIcon(new ImageIcon("路径"));//为Cut条目添加图标
Cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_DOWN_MASK));//KeyStroke类的getKeyStroke需要键位和修饰符两个参数
Copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_DOWN_MASK));
Paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_DOWN_MASK));
Delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));//无需修饰符,参数为0
editmenu.add(Cut);
editmenu.add(Copy);
editmenu.addSeparator();
editmenu.add(Paste);
editmenu.add(Delete);
frame.setJMenuBar(menuBar);//将菜单设置到窗口
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
在IDEA上运行如图:
布局
我需要玩一会FSR。
这里有三种布局
- 流水布局
- 网格布局
- 边界布局
FlowLayout、GridLayout和BorderLayout是常用的布局管理器,它们的参数含义如下:
FlowLayout
FlowLayout是一个流式布局管理器,它会按照添加组件的顺序,自动换行排列组件。FlowLayout的构造方法如下:
FlowLayout(int align, int hgap, int vgap)
align
:指定组件在容器中的对齐方式,可以取以下值:FlowLayout.LEFT
:左对齐(默认值)FlowLayout.CENTER
:居中对齐FlowLayout.RIGHT
:右对齐
hgap
:指定组件之间的水平间距(默认值为5)vgap
:指定组件之间的垂直间距(默认值为5)
GridLayout
GridLayout是一个网格布局管理器,它会将容器分成若干行若干列的网格,每个网格只能放置一个组件。GridLayout的构造方法如下:
GridLayout(int rows, int cols, int hgap, int vgap)
rows
:指定网格的行数cols
:指定网格的列数hgap
:指定组件之间的水平间距(默认值为0)vgap
:指定组件之间的垂直间距(默认值为0)
BorderLayout
BorderLayout是一个边框布局管理器,它将容器分成5个区域:北、南、东、西、中。每个区域只能放置一个组件。BorderLayout的构造方法如下:
BorderLayout(int hgap, int vgap)
hgap
:指定组件之间的水平间距(默认值为0)vgap
:指定组件之间的垂直间距(默认值为0)
以上是三种常用布局管理器的参数含义。
流水布局
我处理了一下代码使得更模块化。
import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
public class HelloworldGUi{
public static void main(String[] args){
MyFrame frame = new MyFrame();
}
static class MyFrame extends JFrame{
JButton[] buttons = new JButton[10];
MyFrame() {
JFrame frame = new JFrame("hello world");//创建一个标题为“hello world”的窗口;
frame.setLocation(500, 500);//位置
frame.setSize(1000, 1000);//初始大小
frame.setVisible(true);//能否调整窗口大小
frame.setVisible(true);//是否显示
/*
JButton button = new JButton("come back to sky...");//创建按钮
button.setSize(300, 300);//设置按钮大小
button.setFont(new Font("Arial", Font.BOLD, 24));//设置字体样式和大小
button.setLocation(500, 500);//设置按键位置
//button.setPreferredSize(new Dimension(30,30));初始为30*30像素点,如果按钮文本内容太长则适应文本
Container container = frame.getContentPane();//用Frame的getContentPane方法实例化一个Container类型的对象来
container.add(button);//向对象添加按钮
*/
//按钮部分
Container container = frame.getContentPane();
FlowLayout f = new FlowLayout(FlowLayout.CENTER,150,150);//设置流水布局参数,实例化一个FlowLayout类的FlowLayout类型的对象,来设置参数
container.setLayout(f);//利用setLayout方法设置流水布局
for(int i = 0;i < buttons.length;i++) {
buttons[i] = new JButton("Button"+i);
buttons[i].setFont(new Font("Arail", Font.BOLD, 24));
container.add(buttons[i]);
}
//菜单部分
JMenuBar menuBar = new JMenuBar();//创建一个菜单栏
JMenu filemenu = new JMenu("File");//船舰一个名为”File“的菜单
menuBar.add(filemenu);//将菜单添加到菜单栏
filemenu.add("New");//加菜单项
filemenu.add(("Open"));
filemenu.addSeparator();//加分割线
//设置子菜单项
JMenu saveMenu = new JMenu("Save");
saveMenu.add("Save");
saveMenu.add(("Save As"));
filemenu.add(saveMenu);
JMenu editmenu = new JMenu("Edit");
menuBar.add(editmenu);
//这组展示一下另一种添加菜单项的方式,以及如何添加图标,我们更提倡这种方式
JMenuItem Cut = new JMenuItem("Cut");//创建菜单条目
JMenuItem Copy = new JMenuItem("Copy");
JMenuItem Paste = new JMenuItem("Paste");
JMenuItem Delete = new JMenuItem("Delete");
Cut.setIcon(new ImageIcon("C:\\Users\\唐浩钏\\document\\python\\avator(1).png"));//为Cut条目添加图标
Cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_DOWN_MASK));//KeyStroke类的getKeyStroke需要键位和修饰符两个参数
Copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK));
Paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_DOWN_MASK));
Delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));//无需修饰符,参数为0
editmenu.add(Cut);
editmenu.add(Copy);
editmenu.addSeparator();
editmenu.add(Paste);
editmenu.add(Delete);
frame.setJMenuBar(menuBar);//将菜单设置到窗口
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
}
网格布局
其他部分没有动,所以只提供按钮这里的代码,和流水布局很类似。
//按钮部分
Container container = frame.getContentPane();
/*FlowLayout f = new FlowLayout(FlowLayout.CENTER,150,150);//设置流水布局参数,实例化一个FlowLayout类的FlowLayout类型的对象,来设置参数
container.setLayout(f);//利用setLayout方法设置流水布局*/
GridLayout g = new GridLayout(3,4,10,10);
container.setLayout(g);
for(int i = 0;i < buttons.length;i++) {
buttons[i] = new JButton("Button"+i);
buttons[i].setFont(new Font("Arail", Font.BOLD, 24));
container.add(buttons[i]);
}
这是显示效果:
边界布局
注意只能用五个按钮,并且在使用add方法时要补充参数BorderLayout.EAST(SOUTH,NORTH,CENTER等),中间的按钮大小会自己填充。
import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
public class HelloworldGUi{
public static void main(String[] args){
MyFrame frame = new MyFrame();
}
static class MyFrame extends JFrame{
JButton[] buttons = new JButton[10];
MyFrame() {
JFrame frame = new JFrame("hello world");//创建一个标题为“hello world”的窗口;
frame.setLocation(500, 500);//位置
frame.setSize(1000, 1000);//初始大小
frame.setVisible(true);//能否调整窗口大小
frame.setVisible(true);//是否显示
/*
JButton button = new JButton("come back to sky...");//创建按钮
button.setSize(300, 300);//设置按钮大小
button.setFont(new Font("Arial", Font.BOLD, 24));//设置字体样式和大小
button.setLocation(500, 500);//设置按键位置
//button.setPreferredSize(new Dimension(30,30));初始为30*30像素点,如果按钮文本内容太长则适应文本
Container container = frame.getContentPane();//用Frame的getContentPane方法实例化一个Container类型的对象来
container.add(button);//向对象添加按钮
*/
//按钮部分
Container container = frame.getContentPane();
/*FlowLayout f = new FlowLayout(FlowLayout.CENTER,150,150);//设置流水布局参数,实例化一个FlowLayout类的FlowLayout类型的对象,来设置参数
container.setLayout(f);//利用setLayout方法设置流水布局*/
/*GridLayout g = new GridLayout(3,4,10,10);
container.setLayout(g);//网格布局*/
BorderLayout b = new BorderLayout(30,30);
container.setLayout(b);//边界布局
container.add(new JButton("东面"),BorderLayout.EAST);
container.add(new JButton("南面"),BorderLayout.SOUTH);
container.add(new JButton("西面"),BorderLayout.WEST);
container.add(new JButton("北面"),BorderLayout.NORTH);
container.add(new JButton("中间"),BorderLayout.CENTER);
/*for(int i = 0;i < buttons.length;i++) {
buttons[i] = new JButton("Button"+i);
buttons[i].setFont(new Font("Arail", Font.BOLD, 24));
container.add(buttons[i]);*/
//菜单部分
JMenuBar menuBar = new JMenuBar();//创建一个菜单栏
JMenu filemenu = new JMenu("File");//船舰一个名为”File“的菜单
menuBar.add(filemenu);//将菜单添加到菜单栏
filemenu.add("New");//加菜单项
filemenu.add(("Open"));
filemenu.addSeparator();//加分割线
//设置子菜单项
JMenu saveMenu = new JMenu("Save");
saveMenu.add("Save");
saveMenu.add(("Save As"));
filemenu.add(saveMenu);
JMenu editmenu = new JMenu("Edit");
menuBar.add(editmenu);
//这组展示一下另一种添加菜单项的方式,以及如何添加图标,我们更提倡这种方式
JMenuItem Cut = new JMenuItem("Cut");//创建菜单条目
JMenuItem Copy = new JMenuItem("Copy");
JMenuItem Paste = new JMenuItem("Paste");
JMenuItem Delete = new JMenuItem("Delete");
Cut.setIcon(new ImageIcon("C:\\Users\\唐浩钏\\document\\python\\avator(1).png"));//为Cut条目添加图标
Cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_DOWN_MASK));//KeyStroke类的getKeyStroke需要键位和修饰符两个参数
Copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK));
Paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_DOWN_MASK));
Delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));//无需修饰符,参数为0
editmenu.add(Cut);
editmenu.add(Copy);
editmenu.addSeparator();
editmenu.add(Paste);
editmenu.add(Delete);
frame.setJMenuBar(menuBar);//将菜单设置到窗口
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
}
如图:
面板
-
构造方法:JPanel p1=new JPanel();
-
为面板布局:面板对象.setLayout(部局管理器对象);
-
在面板上加载组件:面板对象.add(组件对象)。
调整了一下尺寸,使其看得顺眼,写代码的时候发现命名很重要啊…代号abc式的命名很容易搞乱归属关系,命名一定要一看就懂,复杂点也没关系…
import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
public class HelloworldGUi{
public static void main(String[] args){
MyFrame frame = new MyFrame();
}
static class MyFrame extends JFrame{
//JButton[] buttons = new JButton[10];
JPanel signingup = new JPanel();
JPanel accountpanel = new JPanel();
JPanel passwordpanel = new JPanel();
JPanel signupbutton = new JPanel();
JLabel account = new JLabel("登录账号");
JLabel password = new JLabel("登录密码");
JButton baccount = new JButton("登录");
JButton bpassword = new JButton("退出");
JTextField accountlength = new JTextField(9);
JTextField passwordlength = new JTextField(9);
MyFrame() {
JFrame frame = new JFrame("hello world");//创建一个标题为“hello world”的窗口;
frame.setLocation(500, 500);//位置
frame.setSize(300, 200);//初始大小
frame.setVisible(true);//能否调整窗口大小
frame.setVisible(true);//是否显示
/*
JButton button = new JButton("come back to sky...");//创建按钮
button.setSize(300, 300);//设置按钮大小
button.setFont(new Font("Arial", Font.BOLD, 24));//设置字体样式和大小
button.setLocation(500, 500);//设置按键位置
//button.setPreferredSize(new Dimension(30,30));初始为30*30像素点,如果按钮文本内容太长则适应文本
Container container = frame.getContentPane();//用Frame的getContentPane方法实例化一个Container类型的对象来
container.add(button);//向对象添加按钮
*/
//按钮部分
//Container container = frame.getContentPane();
/*FlowLayout f = new FlowLayout(FlowLayout.CENTER,150,150);//设置流水布局参数,实例化一个FlowLayout类的FlowLayout类型的对象,来设置参数
container.setLayout(f);//利用setLayout方法设置流水布局*/
/*GridLayout g = new GridLayout(3,4,10,10);
container.setLayout(g);//网格布局*/
/*BorderLayout b = new BorderLayout(30,30);
container.setLayout(b);//边界布局*/
/* container.add(new JButton("东面"),BorderLayout.EAST);
container.add(new JButton("南面"),BorderLayout.SOUTH);
container.add(new JButton("西面"),BorderLayout.WEST);
container.add(new JButton("北面"),BorderLayout.NORTH);
container.add(new JButton("中间"),BorderLayout.CENTER);
/*for(int i = 0;i < buttons.length;i++) {
buttons[i] = new JButton("Button"+i);
buttons[i].setFont(new Font("Arail", Font.BOLD, 24));
container.add(buttons[i]);*/
//菜单部分
JMenuBar menuBar = new JMenuBar();//创建一个菜单栏
JMenu filemenu = new JMenu("File");//船舰一个名为”File“的菜单
menuBar.add(filemenu);//将菜单添加到菜单栏
filemenu.add("New");//加菜单项
filemenu.add(("Open"));
filemenu.addSeparator();//加分割线
//设置子菜单项
JMenu saveMenu = new JMenu("Save");
saveMenu.add("Save");
saveMenu.add(("Save As"));
filemenu.add(saveMenu);
JMenu editmenu = new JMenu("Edit");
menuBar.add(editmenu);
//这组展示一下另一种添加菜单项的方式,以及如何添加图标,我们更提倡这种方式
JMenuItem Cut = new JMenuItem("Cut");//创建菜单条目
JMenuItem Copy = new JMenuItem("Copy");
JMenuItem Paste = new JMenuItem("Paste");
JMenuItem Delete = new JMenuItem("Delete");
Cut.setIcon(new ImageIcon("C:\\Users\\唐浩钏\\document\\python\\avator(1).png"));//为Cut条目添加图标
Cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_DOWN_MASK));//KeyStroke类的getKeyStroke需要键位和修饰符两个参数
Copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK));
Paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_DOWN_MASK));
Delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));//无需修饰符,参数为0
editmenu.add(Cut);
editmenu.add(Copy);
editmenu.addSeparator();
editmenu.add(Paste);
editmenu.add(Delete);
frame.setJMenuBar(menuBar);//将菜单设置到窗口
//设置面板
Container container = frame.getContentPane();
FlowLayout fleft = new FlowLayout(FlowLayout.CENTER,10,10);
FlowLayout fright = new FlowLayout(FlowLayout.RIGHT,10,10);
BorderLayout border = new BorderLayout(10,10);
GridLayout grid = new GridLayout(2,1);
container.setLayout(border);
accountpanel.setLayout(fleft);
passwordpanel.setLayout(fleft);
signupbutton.setLayout(fright);
signingup.setLayout(grid);
accountpanel.add(account);
accountpanel.add(accountlength);
passwordpanel.add(password);
passwordpanel.add(passwordlength);
signupbutton.add(baccount);
signupbutton.add(bpassword);
signingup.add(accountpanel);
signingup.add(passwordpanel);
container.add(signingup,BorderLayout.CENTER);
container.add(signupbutton,BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
}
运行效果如图:
那么关于java的Swing学习告一段落,要去复习算法导论了。。