Java如何實(shí)現(xiàn)可折疊Panel方法示例
1.原理
原理非常簡(jiǎn)單:就是一個(gè)JLabel和JPanel。Jlabel顯示標(biāo)題文字以及標(biāo)明控件當(dāng)前是處于展開(kāi)還是折疊狀態(tài)的圖片;而JPanel主要就一個(gè)作用——承載控件的容器。JLabel通過(guò)響應(yīng)鼠標(biāo)事件來(lái)控制JPanel是否顯示。這樣就可以達(dá)到折疊或展開(kāi)的效果。
下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的示例代碼
2.代碼
public class JShrinkablePanel extends JPanel { private JLabellabel; private Stringtitle =""; private JPanelcontentPanel =null; private boolean isExpanded =true; private JListlist =new JList(); private IconiconExpand =null; private IconiconCollapse =null; public JShrinkablePanel(String title, JPanel contentPanel) { super(); this.title = title; this.contentPanel = contentPanel; initComponents(); initComponentsStatus(); initLayout(); initResources(); unRegisterEvents(); registerEvents(); } private void initComponents() { this.label =new JLabel(); } private void initComponentsStatus() { this.label.setHorizontalAlignment(JLabel.LEFT); this.label.setVerticalAlignment(JLabel.CENTER); this.label.setVerticalTextPosition(JLabel.CENTER); this.label.setBackground(this.list.getSelectionBackground()); this.iconExpand =new ImageIcon("src/Resources/Expand.png"); this.iconCollapse =new ImageIcon("src/Resources/Collapse.png"); } private void initLayout() { this.setLayout(new GridBagLayout()); this.add(this.label,new GridBagConstraints(0,0,1,1,1,0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,new Insets(0,0,0,0),0,0)); this.add(this.contentPanel,new GridBagConstraints(0,1,1,1,1,0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,new Insets(0,0,0,0),0,0)); } private void initResources() { this.label.setIcon(this.iconExpand); this.label.setText(this.title); } private void unRegisterEvents() { this.label.removeMouseListener(this.mouseListener); } private void registerEvents() { this.label.addMouseListener(this.mouseListener); } private MouseListenermouseListener =new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { isExpanded = !isExpanded; panelVisible(); } @Override public void mouseEntered(MouseEvent e) { label.setOpaque(true); label.repaint(); } @Override public void mouseExited(MouseEvent e) { label.setOpaque(false); label.repaint(); } }; private void panelVisible() { this.contentPanel.setVisible(this.isExpanded); this.label.setIcon(this.isExpanded ?this.iconExpand :this.iconCollapse); } public static void main(String[] args) { JFrame jf =new JFrame("JShrinkablePanel"); jf.setBounds(400,200,400,300); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel=new JPanel(); panel.add(new JButton("Just for show")); panel.setBorder(BorderFactory.createTitledBorder("Border")); JShrinkablePanel scrollPane=new JShrinkablePanel("TestJShrinkablePanel",panel); jf.add(scrollPane); jf.setVisible(true); } }
3.效果
panel展開(kāi)鼠標(biāo)在標(biāo)題Label上
panel展開(kāi)鼠標(biāo)沒(méi)在標(biāo)題Label上
panel折疊鼠標(biāo)在標(biāo)題Label上
panel折疊鼠標(biāo)沒(méi)在標(biāo)題Label上
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Java中的CAS鎖機(jī)制(無(wú)鎖、自旋鎖、樂(lè)觀鎖、輕量級(jí)鎖)詳解
這篇文章主要介紹了Java中的CAS鎖機(jī)制(無(wú)鎖、自旋鎖、樂(lè)觀鎖、輕量級(jí)鎖)詳解,CAS算法的作用是解決多線程條件下使用鎖造成性能損耗問(wèn)題的算法,保證了原子性,這個(gè)原子操作是由CPU來(lái)完成的,需要的朋友可以參考下2024-01-01Java Hutool 包工具類推薦 ExcelUtil詳解
這篇文章主要介紹了Java Hutool 包工具類推薦 ExcelUtil詳解,需要引入hutool包,版本號(hào)可根據(jù)實(shí)際情況更換,除hutool包之外,還需要引入操作Excel必要包,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09使用SpringCache操作Redis緩存數(shù)據(jù)的示例代碼
SpringCache是一個(gè)框架,實(shí)現(xiàn)了基于注解的緩存功能,只需要簡(jiǎn)單的加一個(gè)注解,就能實(shí)現(xiàn)緩存功能,本文給大家介紹了如何使用SpringCache操作Redis緩存數(shù)據(jù),文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-01-01Java實(shí)現(xiàn)優(yōu)先隊(duì)列式廣度優(yōu)先搜索算法的示例代碼
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)優(yōu)先隊(duì)列式廣度優(yōu)先搜索算法,文中通過(guò)一個(gè)示例帶大家具體了解了實(shí)現(xiàn)的方法,需要的可以參考一下2022-08-08Java后臺(tái)處理Json格式數(shù)據(jù)的方法
這篇文章主要介紹了Java后臺(tái)處理Json格式數(shù)據(jù)的方法的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06SpringBoot前后端分離實(shí)現(xiàn)個(gè)人博客系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了使用springboot+mybatis+前端vue,使用前后端分離架構(gòu)實(shí)現(xiàn)的個(gè)人博客系統(tǒng),感興趣的小伙伴可以動(dòng)手嘗試一下2022-06-06sql查詢返回值使用map封裝多個(gè)key和value實(shí)例
這篇文章主要介紹了sql查詢返回值使用map封裝多個(gè)key和value實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07MyBatis-plus+達(dá)夢(mèng)數(shù)據(jù)庫(kù)實(shí)現(xiàn)自動(dòng)生成代碼的示例
這篇文章主要介紹了MyBatis-plus+達(dá)夢(mèng)數(shù)據(jù)庫(kù)實(shí)現(xiàn)自動(dòng)生成代碼的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08