JFrame 窗口
主要方法:设置窗口标题,弹出位置,大小,可见性,背景颜色,大小固定
import javax.swing.JFrame;
import java.awt.Color;
//创建界面对象,传入标题
JFrame a=new JFrame("我的第一个界面");
//设置标题 a.setTitle("标题");
a.setBounds(50,50,500,500);//设置窗口信息,前两个为为弹出位置,后两个为窗口大小
//自定义 a.pack();
//设置弹出位置 a.setLocation(500,500); 设置窗口大小 a.setSize(100,100);
//a.setBackground(Color.RED);//设置窗口背景颜色
//a.setBackground(new Color(104, 243, 22));//设置窗口背景颜色
//均设置失败
/*java中如何对JFrame进行设置背景颜色和背景图片
窗口背景颜色是指直接调用JFrame或者Frame的setBackground(Color color)方法设置后显示出来的颜色。
其实,在你直接调用这个方法后,你的确设置了背景颜色,
而你看到的却不是直接的JFrame或者Frame,而是JFrame.getContentPane().
而JFrame上的contentPane默认是Color.WHITE的,
所以,无论你对JFrame或者Frame怎么设置背景颜色,你看到的都只是contentPane.
方法A:在完成初始化,调用getContentPane()方法得到一个contentPane容器,然后将其设置为不可见,即setVisible(false)。
核心代码this.getContentPane().setVisible(false);//得到contentPane容器,设置为不可见
方法B:将contentPane的颜色设置为你想要的颜色,而不是对JFrame本身设置,
核心代码:this.getContentPane().setBackground(Color.red);//设置contentPane为红色
将核心代码替换方法A核心代码即可实现
方法C:为JFrame添加一个Panel或者JLabel等其他组件,设置其颜色为你想要的颜色,然后将其覆盖JFrame窗口即可
JFrame默认是BorderLayoutJPanel默认是FlowLayout。
————————————————
版权声明:本文为优快云博主「Ryuka-fly」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/xlh1991/article/details/16986555
*/
a.setResizable(false);//设置窗口大小固定,不可调整
a.setVisible(true);//设置可见性
我们还有一个类是Frame,他们两个有什么区别呢
1. JFrame是Frame的子类,JFrame在javax.swing包内,Frame在包java.awt包中
2. 关闭窗口的方式不同 后面有具体例子
JFrame的关闭方式:setDefaultCloseOperation(EXIT_ON_CLOSE);
Frame的关闭方式:利用窗口监听事件
GUI主要靠两个包实现:awt与swing
主要是Swing和awt的区别,例如JPanel与Panel,JButton和Button,JLable与Lable,JDialog与Dialog,JApplet与Applet。
awt是底层(不带J),swing是封装(带J),swing是awt的优化,它比awt多出一些功能,要根据实际情况进行使用。
awt:抽象窗口工具包,早期编写图形界面应用程序的包。使用本地方法实现,为重量级控件
swing :为解决 AWT 存在的问题而新开发的图形界面包。Swing是对AWT的改良和扩展。不需要使用本地方法实现,为轻量级控件
swing上有四个顶级容器JFrame、JDialog、JApplet和JWindow。顶层容器类并不是轻量级组件,而是重量级组件
当轻量级组件和重量级组件一起使用时,如果组件区域有重叠,则“重量级”组件总是显示在最上面,因此这两种组件不建议一起使用。
JPanel 弹窗(作为JFrame中间容器)不能单独存在
主要方法同JFrame差不多,JPanel可以加到窗口上
import javax.swing.JPanel;
import java.awt.Color;
//创建弹窗对象,弹窗不能独立存在
JPanel p=new JPanel();
p.setBackground(Color.yellow);//设置弹窗颜色
a.add(p);//将弹窗添加到界面去,此时窗口颜色变了
JButton 按钮与 事件监听 ActionListener
添加按钮到容器上,按钮主要是用于触发监听事件
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//创建按钮
JButton b=new JButton("我的按钮");
/*a.add(b);//将按钮添加到窗口,整个窗口都是按钮*/
p.add(b);//按钮在标签右边
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("触发事件");
}});
//添加按钮触发事件,此例子所触发的事件是每点一次按钮就会打印一次触发事件
}
}
按钮还可以分为单选按钮和复选按钮
JLabel 标签
添加标签到容器上,可分为文本标签和图片标签
import javax.swing.JLabel;
//创建标签
JLabel l = new JLabel("Hello World");
p.add(l);//将标签添加到弹窗,此时背景颜色为黄色,标签位于第一行正中间
//a.add(l);//将标签添加到窗口,此时背景颜色为默认颜色,标签位于窗口中间顶格
标签可设置图标,图片标签可添加到容器中也可添加到按钮中
首先我们要将图片拖动到我们的软件包包中,如下图
再编写代码如下
public class Demo {
public static void main(String[] args) {
new myFrame("我的标题");
}
}
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class myFrame extends JFrame {
public myFrame(String title){
super(title);
setBounds(200,200,300,350);
setVisible(true);
Container container=getContentPane();//容器实例化
container.setBackground(Color.CYAN);
setDefaultCloseOperation(EXIT_ON_CLOSE);
//文字标签
// JLabel lable=new JLabel("hello world");
// this.add(lable);
// lable.setHorizontalAlignment(SwingConstants.CENTER);//让文本标签居中,设置水平对齐
//图标
JLabel label=new JLabel();
URL url=myFrame.class.getResource("微信图片_20220415104317.jpg");
//类名.class.getResource() 由字节码对象调用,接受一个字符串参数,获取目录
// 如果以”/”开头,就在classpath根目录下找(不会递归查找子目录)
// 如果不以”/”开头,就在调用getResource的字节码对象所在目录下找
ImageIcon imageIcon=new ImageIcon(url);
/*图标可添加在标签上,
label.setIcon(imageIcon);
container.add(label);*/
//也可添加在按钮上
JButton jButton =new JButton();
jButton.setIcon(imageIcon);
container.add(jButton);
}
}
布局管理器
组件在窗口与面板上的布局,一般分为一下三种,主要是要搞清楚不同布局的设置与静态变量代表意义,不同布局可以嵌套使用
import java.awt.FlowLayout;
import java.awt.BorderLayout;
import java.awt.GridLayout;
流式布局 分为左右中
p.setLayout(new FlowLayout());//流式布局,默认居中
p.setLayout(new FlowLayout(FlowLayout.LEFT));//流式布局,LEFT左RIGHT右
p.add(b);
边框布局 分为东西南北中
p.setLayout(new BorderLayout());//边框布局,默认居中CENTER
a.add(l,BorderLayout.EAST);//边框布局,东EAST西WEST南SOUTH北NOUTH中CENTER
表格布局 分为几行几列
p.setLayout(new GridLayout(2,3));//两行三列
JButton b1=new JButton("1");
JButton b2=new JButton("2");
JButton b3=new JButton("3");
JButton b4=new JButton("4");
JButton b5=new JButton("5");
JButton b6=new JButton("6");
p.add(b1);
p.add(b2);
p.add(b3);
p.add(b4);
p.add(b5);
p.add(b6);
TextFiled 输入框 与 窗口关闭事件
输入框用于输入文本,可添加到容器中
窗口监听可以实现窗口关闭事件,我们有专门的监听事件类ActionListener(还有一个专门用于监听窗口的类WindowListener)与窗口触发事件类WindowAdapter,若是直接使用窗口触发事件类需要重写多个方法,为图方便也可以再多写一个类继承窗口触发事件类(适配器模式),这样就可以挑自己需要的方法重写
public class test {
public static void main(String[] args){
new myFrame();
}
}
import java.awt.*;
import javax.swing.*;
public class myFrame extends Frame {
public myFrame(){
JTextField t=new JTextField();//新建输入框
add(t);//因为myFrame继承于Frame,因此可以直接用add方法
setVisible(true);//设置可见性
pack();//自定义窗口大小位置
MyActionListener myActionListener=new MyActionListener();//添加监听
t.addActionListener(myActionListener);//添加输入框触发事件
addWindowListener(new myWindowAdapter());//添加窗口关闭事件
}
}
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class myWindowAdapter extends WindowAdapter {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
public class MyActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JTextField field=(JTextField)e.getSource();//事件源是输入框输入的文本,将事件源转化为输入框对象即可使用他的方法
//用e.getSource()获得事件发起者
System.out.println(field.getText());//打印得到的文本
field.setText("");//敲下空格则全部消失,重新开始
}
}
画笔 与 鼠标监听
实现鼠标画点
awt有画笔,swing有画图
实现鼠标画点,我们要思考如何得到鼠标点击的点(鼠标监听器),如何存放收集到的点数据(ArrayList集合,Point对象),如何画点(使用迭代器遍历收集到的点数据,利用paint画笔画)
这些操作全部在同一个类中,因为鼠标点的数据要共用
//实现鼠标画点
public class PaintTest {
public static void main(String[] args){
new myPaint("画图");
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
public class myPaint extends JFrame {
ArrayList points;//集合存储画点
public myPaint(String n){//构造方法
setTitle(n);//将传入的字符串设置为标题
setBounds(100,100,400,400);//设置窗口位置,大小
add(new Paint());//添加面板
setResizable(false);//设置大小固定
setVisible(true);//最后设为可见
points=new ArrayList<>();//创建一个ArrayList集合存储鼠标点击的点
this.addMouseListener(new myMouseList());//鼠标监听器,针对窗口
setDefaultCloseOperation(EXIT_ON_CLOSE);//窗口关闭
}
public void paint(Graphics g) {//画画方法,需要监听鼠标事件
/* super.paint(g);//初始化
g.setColor(Color.RED);//画笔颜色
g.drawOval(100,100,50,50);//画空心圆
//g.fillOval(20,20,30,50);//画实心圆
g.fillRect(150,150,100,100);//画实心正方形
*/
Iterator iterator = points.iterator();//迭代器
while (iterator.hasNext()) {//当还有下一个点时,即该点不是最后一个点时
Point point = (Point) iterator.next();
g.setColor(Color.RED);//设置画笔颜色为红色
g.fillOval(point.x, point.y, 20, 20);//画点
}
}
public void addPaint(Point point) {//将点添加到集合
points.add(point);
}
private class myMouseList extends MouseAdapter {//内部类
public void mousePressed(MouseEvent e){//当鼠标按下时
myPaint p=(myPaint) e.getSource();//当我们点击时,点击的地方会形成一个点作为事件源
p.addPaint(new Point(e.getX(),e.getY()));//将点添加到面板
p.repaint();//刷新重画
}
}
}
键盘监听
public class KeyDemo {
public static void main(String[] args) {
new myKeyFrame("键盘监听");
}
}
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;
public class myKeyFrame extends Frame {
public myKeyFrame(String title){
super(title);
setBounds(100,100,300,300);
setBackground(Color.CYAN);
setResizable(false);
setVisible(true);
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_C){
System.out.println("you are press in C");
}
}
});
}
}
JDialog弹窗 自带窗口关闭事件
public class Demo {
public static void main(String[] args) {
new myFrame("我的标题");
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class myFrame extends JFrame {
public myFrame(String title){
super(title);
setBounds(200,200,300,350);
setVisible(true);
Container container=getContentPane();//容器实例化
container.setBackground(Color.CYAN);
setDefaultCloseOperation(EXIT_ON_CLOSE);
container.setLayout(null);
JButton button = new JButton("点击弹出对话框");
button.setBounds(100,100,100,150);
//使用监听事件,当按下按钮时弹出弹窗
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new myJDialog();
}
});
container.add(button);
}
}
import javax.swing.*;
import java.awt.*;
public class myJDialog extends JDialog{
//myJDialog.add(new JLabel("java"));不行
public myJDialog() {
setVisible(true);
setBounds(100,100,500,500);
//setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 默认已有这个功能
Container container = this.getContentPane();
container.add(new Label("hello world"));
}
}
列表 分为 下拉框JComboBox 与 列表框JList
文本框JTextField 参照上文的TsxtField
文本域JTextArea 文本域可以换行,文本框不能换行
密码框 JPasswordField
贪吃蛇案例
待续