how2j.cn

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



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



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

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); } }
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); } }
创建一个水平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); } }
使用带滚动条的面板有两种方式
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); } }
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); } }
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

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

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

答案-SplitPanel

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


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文件

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

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

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费5个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费5个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


首先准备一个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公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2020-06-16 为何无法设置图片的边框位置
江湖小白江小白




用CardLayout左splitPanel作业 但是为社么无论怎么设置容器的边框,最后图片位置还是不变。
加载中
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.FlowLayout;
import javax.swing.JSplitPane;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.ImageIcon;
import java.awt.CardLayout;
public class Demo1{	
	public static void main (String[] args){	
		JFrame jf = new JFrame("LOL");
		jf.setSize(400,300);
		jf.setLocation(200,100);
		jf.setLayout(null);

		JPanel jp1 = new JPanel();
		jp1.setBounds(50,50,200,50);
		jp1.setLayout(new FlowLayout());		
		JButton gareen =new JButton("盖伦");
		JButton teemo = new JButton("提莫");
		JButton annie = new JButton("安妮");
		jp1.add(gareen);
		jp1.add(teemo);
		jp1.add(annie);

		JPanel jp2 = new JPanel();
		jp2.setBounds(50,150,300,80);
		CardLayout cl1 = new CardLayout();
		jp2.setLayout(cl1);

		JLabel jl1 = new JLabel();
		ImageIcon ii1 = new ImageIcon("D:\\javadevelopment\\editorprogram\\pics\\gareen.jpg");
		jl1.setIcon(ii1);
		jl1.setBounds(200,100,ii1.getIconWidth(),ii1.getIconHeight());
		JLabel jl2 = new JLabel();
		ImageIcon ii2 = new ImageIcon("D:\\javadevelopment\\editorprogram\\pics\\teemo.jpg");
		jl2.setIcon(ii2);
		jl2.setBounds(200,100,ii2.getIconWidth(),ii2.getIconHeight());
		JLabel jl3 = new JLabel();
		ImageIcon ii3 = new ImageIcon("D:\\javadevelopment\\editorprogram\\pics\\annie.jpg");
		jl3.setIcon(ii3);
		jl3.setBounds(200,100,ii3.getIconWidth(),ii3.getIconHeight());

		jp2.add(jl1);
		jp2.add(jl2);
		jp2.add(jl3);

		JSplitPane jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jp1,jp2);
		jsp.setDividerLocation(100);		
		jf.setContentPane(jsp);

		jf.setVisible(true);

		gareen.addActionListener(e->cl1.first(jp2));
		teemo.addActionListener(e->cl1.next(jp2));
		annie.addActionListener(e->cl1.last(jp2));
	}
}

							





回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2020-06-14 练习-SplitPanel
HappySimon




SplitPanel
public class DemoSwingSplitPanel {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("LOL");
        jFrame.setSize(400, 300);
        jFrame.setLocation(200, 200);
        jFrame.setLayout(null);
        JPanel lJpanel = new JPanel();
        lJpanel.setBounds(50, 50, 300, 60);
        lJpanel.setLayout(new FlowLayout());
        JButton jButton1 = new JButton("盖伦");
        JButton jButton2 = new JButton("提莫");
        JButton jButton3 = new JButton("安妮");
        lJpanel.add(jButton1);
        lJpanel.add(jButton2);
        lJpanel.add(jButton3);

        JPanel rJpanel = new JPanel();
        rJpanel.setBounds(50, 150, 300, 80);
        JLabel jLabel = new JLabel();
        ImageIcon imageIcon1 = new ImageIcon("src\\main\\java\\com\\how2j\\imageicon\\gareen.jpg");
        ImageIcon imageIcon2 = new ImageIcon("src\\main\\java\\com\\how2j\\imageicon\\teemo.jpg");
        ImageIcon imageIcon3 = new ImageIcon("src\\main\\java\\com\\how2j\\imageicon\\annie.jpg");
        jLabel.setBounds(20, 20, imageIcon1.getIconWidth(), imageIcon1.getIconHeight());
        jButton1.addActionListener(e -> jLabel.setIcon(imageIcon1));
        jLabel.setBounds(20, 20, imageIcon2.getIconWidth(), imageIcon2.getIconHeight());
        jButton2.addActionListener(e -> jLabel.setIcon(imageIcon2));
        jLabel.setBounds(20, 20, imageIcon3.getIconWidth(), imageIcon3.getIconHeight());
        jButton3.addActionListener(e -> jLabel.setIcon(imageIcon3));
        rJpanel.add(jLabel);
        JSplitPane jSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, lJpanel, rJpanel);
        jSplitPane.setDividerLocation(80);
        jFrame.setContentPane(jSplitPane);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setVisible(true);
    }
}

							


1 个答案

zZzMoneyy
答案时间:2020-06-26



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2020-04-28 CardLayerout
2020-03-27 练习-SplitPanel
2020-02-27 个人练习一


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 28 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 中级-图形界面-面板 的提问

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

上传截图