上一次,我们学习了JFrame和JDialog这两个顶级容器的使用方法。现在,如果沿用之前的比喻,我们已经有了"纸",接下来就需要"墨水"了(当然,我们其实是"笔")。在Swing中,最常用的组件之一就是面板(Panel)。我个人更倾向于称之为"模块",因为在我看来,面板就是一个个功能模块。就像在一张纸上,我们不可能把所有小部件直接堆在一起,而是需要通过这些模块来进行组织和布局,然后再将这些模块整合到"纸"上。
Swing常用的面板有Jpanel,JScrollPane,JSplitPane,JSplitPane等等,这里我现在自学这三种,其它的我还没有学,如果学学了,我同样会更新文章的。
那么直接进入主题
JPanel的使用和注意事项
JPanel是一个最为基础的面板组件,所以所必须掌握的是这个面板组件,来看怎么创建一个面板。
JFrame jFrame = new JFrame(" JPanel案列测试");
jFrame.setSize(600,300);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建的面板
JPanel jPanel = new JPanel();
jPanel.setPreferredSize(new Dimension(300,150));
// 设置面板属性
jPanel.setBackground(Color.RED);
// 配置窗口布局(关键)
jFrame.setLayout(new FlowLayout()); // 无间距的居中流布局
// 添加面板到窗口
jFrame.add(jPanel);
// 窗口居中显示
jFrame.setVisible(true);
运行结果
可见一个主窗口中出现了一块红色区域,那么这片区域也就是我们的面板位置,当然,记得设置JFrame的布局管理器,不然默认的布局管理器会让这个面板充满整个的窗口,不容易观察, 这里的布局管理器后面介绍。
那么有了创建的代码,不可少的就是一些常用的方法。(这里我个人认为需要先学习CSS,不然的话不便于理解这些个代码的含义和用处。)
这里我给出了很多方法,可以说大部分了的方法都在了,
方法 | 参数类型 | 说明 | 示例 |
---|---|---|---|
构造方法(这三个其实是一个) | |||
JPanel() | 无 | 创建默认面板(使用 FlowLayout 布局) | new JPanel() |
JPanel(LayoutManager mgr) | LayoutManager | 创建指定布局的面板 | new JPanel(new BorderLayout()) |
setLayout(LayoutManager mgr) | LayoutManager | 设置面板的布局管理器 | panel.setLayout(new GridLayout(2,2)) |
组件操作(添加,删除,或者清空) | |||
add(Component comp) | Component | 添加子组件(默认布局下) | panel.add(new JButton("OK")) |
remove(Component comp) | Component | 移除指定子组件 | panel.remove(button) |
removeAll() | 无 | 移除所有子组件 | panel.removeAll() |
外观控制(背景,边框,颜色) | |||
setBackground(Color color) | Color | 设置背景颜色 | panel.setBackground(Color.RED) |
setBorder(Border border) | Border | 设置边框样式 | panel.setBorder(BorderFactory.createLineBorder(Color.BLUE)) |
setOpaque(boolean opaque) | boolean | 设置是否不透明(透明面板需设为 false ) | panel.setOpaque(false) |
尺寸控制(其实这三个也是一个意思) | |||
setPreferredSize(Dimension size) | Dimension | 设置首选尺寸(受布局管理器影响) | panel.setPreferredSize(new Dimension(300,200)) |
setMinimumSize(Dimension size) | Dimension | 设置最小尺寸 | panel.setMinimumSize(new Dimension(100,100)) |
setMaximumSize(Dimension size) | Dimension | 设置最大尺寸 | panel.setMaximumSize(new Dimension(500,500)) |
其他功能 | |||
updateUI() | 无 | 刷新UI样式(切换外观主题后需调用) | panel.updateUI() |
setToolTipText(String text) | String | 设置悬停提示文本 | panel.setToolTipText("操作面板") |
那么有什么需要注意的地方呢,我这里仅仅写过一次桌面窗口程序,我懂得不多,但有几个新手爱犯的错误。
1.记得设置窗口布局管理器,这一步很多人都忘了,切记。
2.不可以使用setSize了,虽然不报错,但是你无法设置面板尺寸。
3.不要忘记添加面板。
JScrollPane的使用和注意事项
那么这个滚动面板和普通面板有何区别,我们为什么要有这么一个滚动面板,存在的意义是什么?你想,面板是有大小的,会满的啊,但是我们设置为Pack()不就行了,可问题在于,Pack()是会改变面板的尺寸的,这样一来就容易使我们的面板出现变形,窗口布局失效的问题出现,所以大佬们就搞出来一个JScrollPane面板,大小不变,但是我可以滚动,那这样即使组件多出来,也不会改变面板尺寸,这样就解决了问题。
来看JScrollPane的创建
JScrollPane jscrollpane = new JScrollPane();//创建一个简单的面板,
那么这个就是基础的实现滚动面板的创建,这样创建的面板是和面板没有区别的,没变化,所以我们要加东西。
JScrollPane jScrollPane = new JScrollPane(Component view);//创建一个视图为view的滚动面板,其实这个视图就是实际显示的组件,当面板大小不够存下这个组件的,滚动条出现在面板下方或者右方。
JScrollPane jScrollPane1 = new JScrollPane(Component view_1 ,int vsbPolicy,int
hsbPolicy);//这个的区别就是你要设置一下滚动条出现的条件,不能向上一个一样自动的出行啊
那么这里所谓的滚动策略就如我说的,你要滚动条什么时候出来,(一直不用,需要的时候用,直接不用),具体的这个情况我用表格来介绍一下
策略类型 | 常量值 | 适用方向 | 说明 | 示例 |
---|---|---|---|---|
按需显示 | JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED <br>JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED | 水平/垂直 | 默认策略,仅在内容超出可视区域时显示滚动条 | new JScrollPane(component, VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_AS_NEEDED) |
始终显示 | JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS <br>JScrollPane.VERTICAL_SCROLLBAR_ALWAYS | 水平/垂直 | 无论内容是否超出区域,始终显示滚动条(滚动条可能禁用) | scrollPane.setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_ALWAYS) |
永不显示 | JScrollPane.HORIZONTAL_SCROLLBAR_NEVER <br>JScrollPane.VERTICAL_SCROLLBAR_NEVER | 水平/垂直 | 强制隐藏滚动条,即使内容溢出也不显示 | new JScrollPane(textArea, VERTICAL_SCROLLBAR_NEVER, HORIZONTAL_SCROLLBAR_NEVER) |
这里我写一个组合的, 垂直按需,水平勿用的这样一个效果。
new JScrollPane(table, VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_ALWAYS)
JFrame jFrame = new JFrame("滚动面板");
jFrame.setSize(600,300);
jFrame.setLayout(new GridBagLayout());
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 修正1:关闭操作
// 创建超长内容组件
JLabel view = new JLabel("这是测试文字");
view.setPreferredSize(new Dimension(300, 10000));
// 创建滚动面板(修正滚动策略常量引用)
JScrollPane scrollPane = new JScrollPane(view, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
// 设置滚动面板尺寸(可选)
scrollPane.setPreferredSize(new Dimension(300, 150));
// 这里为了可以清楚的演示,这是布局管理,后面我在介绍。先了解滚动面板
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0; // 禁止水平拉伸
gbc.weighty = 0; // 禁止垂直拉伸
gbc.insets = new Insets(10,10,10,10); // 添加边距
jFrame.add(scrollPane, gbc);
// 可选:设置窗口位置居中
jFrame.setLocationRelativeTo(null);
jFrame.setVisible(true);
运行结果
可以看见,这就是一个滚动策略的一个实际上的使用。那么滚动面板有什么特有的方法吗?当然是有的,还是列表说明这个滚动面板的这个常用方法
方法 | 参数/返回值 | 说明 | 示例 |
---|---|---|---|
构造方法 | |||
JScrollPane() | 无 | 创建空滚动面板(需后续设置视图组件) | new JScrollPane() |
| Component | 创建包含指定组件的滚动面板 | new JScrollPane(new JTextArea()) |
| 滚动条策略常量 | 指定垂直和水平滚动条策略 | new JScrollPane(VERTICAL_SCROLLBAR_ALWAYS, HORIZONTAL_SCROLLBAR_NEVER) |
视图控制 | |||
| Component | 设置滚动面板的主显示内容(核心方法) | scrollPane.setViewportView(new JTable(data, columns)) |
getViewport() | 返回 JViewport | 获取视口对象(用于高级操作,如监听滚动事件) | JViewport viewport = scrollPane.getViewport(); |
滚动条控制 | |||
setVerticalScrollBarPolicy(int policy) | VERTICAL_SCROLLBAR_* 常量 | 设置垂直滚动条显示策略(AS_NEEDED/ALWAYS/NEVER) | scrollPane.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS); |
setHorizontalScrollBarPolicy(int policy) | HORIZONTAL_SCROLLBAR_* 常量 | 设置水平滚动条显示策略 | scrollPane.setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_NEVER); |
getVerticalScrollBar() | 返回 JScrollBar | 获取垂直滚动条对象(用于自定义样式或行为) | JScrollBar vBar = scrollPane.getVerticalScrollBar(); |
getHorizontalScrollBar() | 返回 JScrollBar | 获取水平滚动条对象 | JScrollBar hBar = scrollPane.getHorizontalScrollBar(); |
边距与边框 | |||
| Border | 设置视口区域的边框 | scrollPane.setViewportBorder(BorderFactory.createLineBorder(Color.GRAY)); |
| 角落位置常量 + 组件 | 在滚动面板角落添加自定义组件(如右下角按钮) | scrollPane.setCorner(ScrollPaneConstants.LOWER_RIGHT_CORNER, new JButton("↘")); |
布局与渲染 | |||
| boolean | 启用/禁用鼠标滚轮滚动支持(默认启用) | scrollPane.setWheelScrollingEnabled(false); |
| Component | 设置行标题固定区域(如左侧行号栏) | scrollPane.setRowHeaderView(new JList<>(rowHeaders)); |
| Component | 设置列标题固定区域(如顶部表头) | scrollPane.setColumnHeaderView(new JLabel("Header")); |
以上就是JScrollPane的一些特有的方法,下面我来说一下注意事项。
1.一个滚动面板只能添加一个组件,多个组件添加先将这些组件放在面板中,然后在添加到滚动面板中。
2.注意设置滚动面板的滚动策略。
3.注意布局管理器的对于滚动面板的影响。
4.滚动条失效,一种情况是内容组件没有超过视口,或者滚动策略出现问题,第二种是父容器布局管理器覆盖了滚动面板的尺寸。
5.无法拖动滚动条,这个是事件阻塞的可能性很大,还有一种是你可能性是你电脑卡了,记得去检查鼠标事件。
以上就是今天学习的一个笔记,希望阅读到这篇文章的你能对于这个Swing组件有所理解,明天我们继续学习标签组件,文本组件以及按钮组件。