how2j.cn

相关下载
文件名 文件大小
j.png 437b
pics.rar 65k
本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



13分36秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)



示例 1 : 基本面板   
示例 2 : ContentPane   
示例 3 : SplitPanel   
示例 4 : JScrollPanel   
示例 5 : TabbedPanel   
示例 6 : CardLayerout   
示例 7 : 练习-SplitPanel   
示例 8 : 答案-SplitPanel   
示例 9 : 练习-按照eclipse的风格显示多个java文件   
示例 10 : 答案-按照eclipse的风格显示多个java文件   

示例 1 :

基本面板

JPanel即为基本面板
面板和JFrame一样都是容器,不过面板一般用来充当中间容器,把组件放在面板上,然后再把面板放在窗体上。
一旦移动一个面板,其上面的组件,就会全部统一跟着移动,采用这种方式,便于进行整体界面的设计
基本面板
package gui; import java.awt.Color; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class TestGUI { public static void main(String[] args) { JFrame f = new JFrame("LoL"); f.setSize(400, 300); f.setLocation(200, 200); f.setLayout(null); JPanel p1 = new JPanel(); // 设置面板大小 p1.setBounds(50, 50, 300, 60); // 设置面板背景颜色 p1.setBackground(Color.RED); // 这一句可以没有,因为JPanel默认就是采用的FlowLayout p1.setLayout(new FlowLayout()); JButton b1 = new JButton("英雄1"); JButton b2 = new JButton("英雄2"); JButton b3 = new JButton("英雄3"); // 把按钮加入面板 p1.add(b1); p1.add(b2); p1.add(b3); JPanel p2 = new JPanel(); JButton b4 = new JButton("英雄4"); JButton b5 = new JButton("英雄5"); JButton b6 = new JButton("英雄6"); p2.add(b4); p2.add(b5); p2.add(b6); p2.setBackground(Color.BLUE); p2.setBounds(10, 150, 300, 60); // 把面板加入窗口 f.add(p1); f.add(p2); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
示例 2 :

ContentPane

JFrame上有一层面板,叫做ContentPane
平时通过f.add()向JFrame增加组件,其实是向JFrame上的 ContentPane加东西
package gui; import javax.swing.JButton; import javax.swing.JFrame; public class TestGUI { public static void main(String[] args) { JFrame f = new JFrame("LoL"); f.setSize(400, 300); f.setLocation(200, 200); f.setLayout(null); JButton b = new JButton("一键秒对方基地挂"); b.setBounds(50, 50, 280, 30); f.add(b); // JFrame上有一层面板,叫做ContentPane // 平时通过f.add()向JFrame增加组件,其实是向JFrame上的 ContentPane加东西 // f.add等同于f.getContentPane().add(b); f.getContentPane().add(b); // b.getParent()获取按钮b所处于的容器 // 打印出来可以看到,实际上是ContentPane而非JFrame System.out.println(b.getParent()); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
示例 3 :

SplitPanel

创建一个水平JSplitPane,左边是pLeft,右边是pRight
SplitPanel
package gui; import java.awt.Color; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JSplitPane; public class TestGUI { public static void main(String[] args) { JFrame f = new JFrame("LoL"); f.setSize(400, 300); f.setLocation(200, 200); f.setLayout(null); JPanel pLeft = new JPanel(); pLeft.setBounds(50, 50, 300, 60); pLeft.setBackground(Color.RED); pLeft.setLayout(new FlowLayout()); JButton b1 = new JButton("盖伦"); JButton b2 = new JButton("提莫"); JButton b3 = new JButton("安妮"); pLeft.add(b1); pLeft.add(b2); pLeft.add(b3); JPanel pRight = new JPanel(); JButton b4 = new JButton("英雄4"); JButton b5 = new JButton("英雄5"); JButton b6 = new JButton("英雄6"); pRight.add(b4); pRight.add(b5); pRight.add(b6); pRight.setBackground(Color.BLUE); pRight.setBounds(10, 150, 300, 60); // 创建一个水平JSplitPane,左边是p1,右边是p2 JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pLeft, pRight); // 设置分割条的位置 sp.setDividerLocation(80); // 把sp当作ContentPane f.setContentPane(sp); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
示例 4 :

JScrollPanel

使用带滚动条的面板有两种方式
1. 在创建JScrollPane,把组件作为参数传进去

JScrollPane sp = new JScrollPane(ta);

2. 希望带滚动条的面板显示其他组件的时候,调用setViewportView

sp.setViewportView(ta);
JScrollPanel
package gui; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class TestGUI { public static void main(String[] args) { JFrame f = new JFrame("LoL"); f.setSize(400, 300); f.setLocation(200, 200); f.setLayout(null); //准备一个文本域,在里面放很多数据 JTextArea ta = new JTextArea(); for (int i = 0; i < 1000; i++) { ta.append(String.valueOf(i)); } //自动换行 ta.setLineWrap(true); JScrollPane sp = new JScrollPane(ta); f.setContentPane(sp); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
示例 5 :

TabbedPanel

TabbedPanel
package gui; import java.awt.Color; import java.awt.FlowLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTabbedPane; public class TestGUI { public static void main(String[] args) { JFrame f = new JFrame("LoL"); f.setSize(400, 300); f.setLocation(200, 200); f.setLayout(null); JPanel p1 = new JPanel(); p1.setBounds(50, 50, 300, 60); p1.setBackground(Color.RED); p1.setLayout(new FlowLayout()); JButton b1 = new JButton("英雄1"); JButton b2 = new JButton("英雄2"); JButton b3 = new JButton("英雄3"); p1.add(b1); p1.add(b2); p1.add(b3); JPanel p2 = new JPanel(); JButton b4 = new JButton("英雄4"); JButton b5 = new JButton("英雄5"); JButton b6 = new JButton("英雄6"); p2.add(b4); p2.add(b5); p2.add(b6); p2.setBackground(Color.BLUE); p2.setBounds(10, 150, 300, 60); JTabbedPane tp = new JTabbedPane(); tp.add(p1); tp.add(p2); // 设置tab的标题 tp.setTitleAt(0, "红色tab"); tp.setTitleAt(1, "蓝色tab"); ImageIcon i = new ImageIcon("e:/project/j2se/j.png"); tp.setIconAt(0,i ); tp.setIconAt(1,i ); f.setContentPane(tp); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
示例 6 :

CardLayerout

CardLayerout 布局器 很像TabbedPanel ,在本例里面上面是一个下拉框,下面是一个CardLayerout 的JPanel
这个JPanel里有两个面板,可以通过CardLayerout方便的切换
CardLayerout
package gui; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class TestGUI { public static void main(String[] args) { JFrame f = new JFrame("CardLayerout"); JPanel comboBoxPane = new JPanel(); String buttonPanel = "按钮面板"; String inputPanel = "输入框面板"; String comboBoxItems[] = { buttonPanel, inputPanel }; JComboBox<String> cb = new JComboBox<>(comboBoxItems); comboBoxPane.add(cb); // 两个Panel充当卡片 JPanel card1 = new JPanel(); card1.add(new JButton("按钮 1")); card1.add(new JButton("按钮 2")); card1.add(new JButton("按钮 3")); JPanel card2 = new JPanel(); card2.add(new JTextField("输入框", 20)); JPanel cards; // a panel that uses CardLayout cards = new JPanel(new CardLayout()); cards.add(card1, buttonPanel); cards.add(card2, inputPanel); f.add(comboBoxPane, BorderLayout.NORTH); f.add(cards, BorderLayout.CENTER); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(250, 150); f.setLocationRelativeTo(null); f.setVisible(true); cb.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent evt) { CardLayout cl = (CardLayout) (cards.getLayout()); cl.show(cards, (String) evt.getItem()); } }); } }
示例 7 :

练习-SplitPanel

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
设计一个像SplitPanel的左右风格的SplitPanel
左边放3个按钮,上面的文字分别是: 盖伦,提莫,安妮
右边默认显示盖伦
当左边按钮点击的时候,右边就会显示对应的图片

需要的头像可以下载区 下载pics.rar
练习-SplitPanel
示例 8 :

答案-SplitPanel

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

2分28秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


package gui; import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSplitPane; public class TestGUI { public static void main(String[] args) { JFrame f = new JFrame("LoL"); f.setSize(400, 300); f.setLocation(200, 200); f.setLayout(null); JPanel pLeft = new JPanel(); pLeft.setBounds(50, 50, 300, 60); pLeft.setBackground(Color.LIGHT_GRAY); pLeft.setLayout(new FlowLayout()); JButton b1 = new JButton("盖伦"); JButton b2 = new JButton("提莫"); JButton b3 = new JButton("安妮"); pLeft.add(b1); pLeft.add(b2); pLeft.add(b3); JPanel pRight = new JPanel(); JLabel lPic = new JLabel(""); ImageIcon i = new ImageIcon("e:/project/j2se/gareen.jpg"); lPic.setIcon(i); pRight.add(lPic); pRight.setBackground(Color.lightGray); pRight.setBounds(10, 150, 300, 60); // 创建一个水平JSplitPane,左边是p1,右边是p2 JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pLeft, pRight); // 设置分割条的位置 sp.setDividerLocation(80); // 把sp当作ContentPane f.setContentPane(sp); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); switchPic(b1,"gareen",lPic); switchPic(b2,"teemo",lPic); switchPic(b3,"annie",lPic); } private static void switchPic(JButton b1, String fileName, JLabel lPic) { b1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ImageIcon i = new ImageIcon("e:/project/j2se/"+fileName+".jpg"); lPic.setIcon(i); } }); } }
示例 9 :

练习-按照eclipse的风格显示多个java文件

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
参考eclipse的风格,借助TabbedPanel显示一个包下所有的java文件
假设包 jdbc 中有如下java文件
ConnectionPool.java
DAO.java
HeroDAO.java
TestConnectionPool.java
TestDAO.java
TestJDBC.java
练习-按照eclipse的风格显示多个java文件
示例 10 :

答案-按照eclipse的风格显示多个java文件

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

10分8秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


首先准备一个JavaFilePane 专门用于显示文件内容的Panel

然后在TestGUI中遍历e:/project/j2se/jdbc 下的文件,并根据这些文件生成JavaFilePane 。

接着把这些JavaFilePane 插入到TabbedPanel中即可
package gui; import java.awt.BorderLayout; import java.io.File; import java.io.FileReader; import java.io.IOException; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; public class JavaFilePane extends JPanel{ public JavaFilePane(File file){ this.setLayout(new BorderLayout()); String fileContent = getFileContent(file); JTextArea ta = new JTextArea(); ta.setText(fileContent); this.add(ta); } private String getFileContent(File f){ String fileContent = null; try (FileReader fr = new FileReader(f)) { char[] all = new char[(int) f.length()]; fr.read(all); fileContent= new String(all); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return fileContent; } public static void main(String[] args) { JFrame f =new JFrame(); f.setSize(400,300); f.setContentPane(new JavaFilePane(new File("E:/project/j2se/src/gui/JavaFilePane.java"))); f.setVisible(true); } }
package gui; import java.io.File; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JTabbedPane; public class TestGUI { public static void main(String[] args) { JFrame f = new JFrame("LoL"); f.setSize(800, 600); f.setLocationRelativeTo(null); f.setLayout(null); File folder = new File("E:/project/j2se/src/jdbc"); File[] fs=folder.listFiles(); JTabbedPane tp = new JTabbedPane(); ImageIcon icon = new ImageIcon("e:/project/j2se/j.png"); for (int i = 0; i < fs.length; i++) { JavaFilePane jfp =new JavaFilePane(fs[i]); tp.add(jfp); tp.setIconAt(i,icon ); tp.setTitleAt(i, shortName(fs[i].getName())); } f.setContentPane(tp); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } private static String shortName(String name) { int length = 6; if(name.length()>length){ return name.substring(0,length) + "..."; } return name; } }


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-06-25 自己做着做着发现 事件监听中修改外部成员的值需要改成final
白枫



第一题 练习-SplitPanel 自己做着做着发现 事件监听中修改外部成员的值需要改成final 前面对于对象而言final来也能调用方法来改变属性。 这里要改变外部属性i的值,发现声明i为final的话,就改变不了它的赋值,不final的话事件监听中又调用不了它 遂点开答案瞄了一眼 我…… 居然直接把事件监听扔进一个新方法里i作为一个形参去new新的ImageIcon对象了,有点6,社会社会_(:з」∠)_
package gui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TestGUI {
	public static void main(String[] args) {
		JFrame f = new JFrame("LoL");
		f.setSize(400, 300);
		f.setLocation(200, 200);
		f.setLayout(null);
		JPanel pLeft = new JPanel();
		pLeft.setBounds(50, 50, 300, 60);
		pLeft.setLayout(new FlowLayout());
		JButton b1 = new JButton("盖伦");
		JButton b2 = new JButton("提莫");
		JButton b3 = new JButton("安妮");
		pLeft.add(b1);
		pLeft.add(b2);
		pLeft.add(b3);
		JPanel pRight = new JPanel();
		JLabel l = new JLabel();
		ImageIcon i = null;
		l.setIcon(i);
		pRight.add(l);
		pRight.setBounds(10, 150, 300, 60);
		JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pLeft, pRight);
		sp.setDividerLocation(80);
		f.setContentPane(sp);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
		switchpic(b1, "gareen", l);
		switchpic(b2, "teemo", l);
		switchpic(b3, "annie", l);
	}
	private static void switchpic(JButton b, String fileName, JLabel l) {
		b.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ImageIcon i = new ImageIcon("e:/how2j/j2se/" + fileName + ".jpg");
				l.setIcon(i);
			}
		});
	}
}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-06-13 这个到底叫contentpanel还是叫contentpane啊?
Java小子
标题和内容都不一样








答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2018-04-17 关于swing的JTabbedPane
2018-02-18 在JLabel中连续添加图片是不是后面的覆盖前面的
2017-12-24 CardLayerout 这里最后面的监听器前面的章节没有讲过
2017-11-18 图形界面这一章节很多部分的Layout 写成Layerout了 ,站长。
2017-10-29 关于面板大小的问题
2017-10-08 还是不明白面板是用来做什么的,我看下一节的练习里也没有使用面板啊
2017-08-03 布局和面板
2017-06-16 JTabbedPane 如何设置成透明
2017-06-01 JSplitPane问题
2017-05-02 第二题怎么在textarea中添加下拉框啊?????
2017-02-19 楼主看看我的代码对不




提问之前请登陆
关于 JAVA 中级-图形界面-面板 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 620943819
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图