Swing组件——JPanel和JScrollPane

上一次,我们学习了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设置是否不透明(透明面板需设为 falsepanel.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()

JScrollPane

(Component view)

Component创建包含指定组件的滚动面板new JScrollPane(new JTextArea())

JScrollPane

(int vsbPolicy, int hsbPolicy)

滚动条策略常量指定垂直和水平滚动条策略new JScrollPane(VERTICAL_SCROLLBAR_ALWAYS, HORIZONTAL_SCROLLBAR_NEVER)
视图控制

setViewportView(

Component view)

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();
边距与边框

setViewportBorder

(Border border)

Border设置视口区域的边框scrollPane.setViewportBorder(BorderFactory.createLineBorder(Color.GRAY));

setCorner

(String key, Component corner)

角落位置常量 + 组件在滚动面板角落添加自定义组件(如右下角按钮)scrollPane.setCorner(ScrollPaneConstants.LOWER_RIGHT_CORNER, new JButton("↘"));
布局与渲染

setWheelScrollingEnabled

(boolean enable)

boolean启用/禁用鼠标滚轮滚动支持(默认启用)scrollPane.setWheelScrollingEnabled(false);

setRowHeaderView

(Component view)

Component设置行标题固定区域(如左侧行号栏)scrollPane.setRowHeaderView(new JList<>(rowHeaders));

setColumnHeaderView

(Component view)

Component设置列标题固定区域(如顶部表头)scrollPane.setColumnHeaderView(new JLabel("Header"));

以上就是JScrollPane的一些特有的方法,下面我来说一下注意事项。

1.一个滚动面板只能添加一个组件,多个组件添加先将这些组件放在面板中,然后在添加到滚动面板中。

2.注意设置滚动面板的滚动策略。

3.注意布局管理器的对于滚动面板的影响。

4.滚动条失效,一种情况是内容组件没有超过视口,或者滚动策略出现问题,第二种是父容器布局管理器覆盖了滚动面板的尺寸。

5.无法拖动滚动条,这个是事件阻塞的可能性很大,还有一种是你可能性是你电脑卡了,记得去检查鼠标事件。

以上就是今天学习的一个笔记,希望阅读到这篇文章的你能对于这个Swing组件有所理解,明天我们继续学习标签组件,文本组件以及按钮组件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值