1、Java GUI 概述
GUI(Graphical User Interface,簡(jiǎn)稱 GUI,圖形用戶界面)是指采用圖形方式顯示的計(jì)算機(jī)操作用戶界面,與早期計(jì)算機(jī)使用的命令行界面相比,圖形界面對(duì)于用戶來(lái)說(shuō)在視覺上更易于接受。Java GUI主要有兩個(gè)核心庫(kù),分別是AWT(java.awt:Abstract Windows ToolKit(抽象窗口工具包))和Swing(javax.swing:AWT的擴(kuò)展),AWT需要調(diào)用本地系統(tǒng)方法來(lái)實(shí)現(xiàn)功能,屬重量級(jí)控件,而Swing是在AWT的基礎(chǔ)上,建立的一套圖像界面系統(tǒng),其中提供了更多的組件,而且完全由Java實(shí)現(xiàn),增強(qiáng)了移植性,屬輕量級(jí)組件。
2、容器
容器(Container)是組件(Component)的子類,一個(gè)容器可以容納多個(gè)組件,并使他們成為一個(gè)整體。容器可以簡(jiǎn)化圖形化界面的設(shè)計(jì),以整體結(jié)構(gòu)來(lái)布置界面,所有的組件都可以通過(guò)add()方法加入容器中。容器共有四種類型,分別是窗口(JFrame)、彈窗(JDialog)、面板(JPanel)、滾動(dòng)面板(JScrollPanel)。
2、1 窗口
Frame或JFrame類用于創(chuàng)建一個(gè)具有標(biāo)題欄的框架窗口作為程序的主要界面,它不依賴其他容器可以單獨(dú)存在。
public class JFrameUse { public static void main(String[] args) { // 初始化窗口 JFrame jFrame = new JFrame(“這個(gè)是窗口的標(biāo)題”); // 設(shè)置窗口的位置和大小 jFrame.setBounds(400, 300, 500, 500); // 設(shè)置窗口的背景顏色 jFrame.setBackground(new Color(175, 114, 114)); // 設(shè)置窗口是否可見 jFrame.setVisible(true); // 設(shè)置窗口是否可以縮放 jFrame.setResizable(false); /** * 設(shè)置窗口的相對(duì)位置。 * 如果 comp 整個(gè)顯示區(qū)域在屏幕內(nèi), 則將窗口放置到 comp 的中心; * 如果 comp 顯示區(qū)域有部分不在屏幕內(nèi), 則將該窗口放置在最接近 comp 中心的一側(cè); * comp 為 null, 表示將窗口放置到屏幕中心。 */ jFrame.setLocationRelativeTo(null); /** * 設(shè)置窗口關(guān)閉按鈕點(diǎn)擊后的默認(rèn)操作, 參考值: * WindowConstants.DO_NOTHING_ON_CLOSE: 不執(zhí)行任何操作。 * WindowConstants.HIDE_ON_CLOSE: 隱藏窗口(不會(huì)結(jié)束進(jìn)程), 再次調(diào)用 setVisible(true) 將再次顯示。 * WindowConstants.DISPOSE_ON_CLOSE: 銷毀窗口, 如果所有可顯示的窗口都被 DISPOSE, 則可能會(huì)自動(dòng)結(jié)束進(jìn)程。 * WindowConstants.EXIT_ON_CLOSE: 退出進(jìn)程。 */ jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); }}
2、2 彈窗和對(duì)話框
JDialog,對(duì)話框,使用 JDialog 類可以創(chuàng)建自定義有的對(duì)話框,或者調(diào)用 JOptionPane 中的多個(gè)靜態(tài)方法快速創(chuàng)建各種標(biāo)準(zhǔn)的對(duì)話框。JOptionPane是JavaSwing內(nèi)部已實(shí)現(xiàn)好的,以靜態(tài)方法的形式提供調(diào)用,能夠快速方便的彈出要求用戶提供值或向其發(fā)出通知的標(biāo)準(zhǔn)對(duì)話框。主要具有以下幾種那類型:
- showMessageDialog:消息對(duì)話框,向用戶展示一個(gè)消息,沒(méi)有返回值。
- showConfirmDialog:確認(rèn)對(duì)話框,詢問(wèn)一個(gè)問(wèn)題是否執(zhí)行。
- showInputDialog:輸入對(duì)話框,要求用戶提供某些輸入。
- showOptionDialog:選項(xiàng)對(duì)話框,上述三項(xiàng)的大統(tǒng)一,自定義按鈕文本,詢問(wèn)用戶需要點(diǎn)擊哪個(gè)按鈕。
上述四個(gè)類型的方法(包括其若干重載)的參數(shù)遵循一致的模式,下面介紹各參數(shù)的含義:
- parentComponent: 對(duì)話框的父級(jí)組件,決定對(duì)話框顯示的位置,對(duì)話框的顯示會(huì)盡量緊靠組件的中心,如果傳 null,則顯示在屏幕的中心。
- title: 對(duì)話框標(biāo)題。
- message: 消息內(nèi)容。
- optionType: 選項(xiàng)按鈕的類型。
- selectionValues、initialSelectionValue: 提供的輸入選項(xiàng),以及默認(rèn)選中的選項(xiàng)。
- icon: 自定義的對(duì)話框圖標(biāo),如果傳 null,則圖標(biāo)類型由 messageType 決定。
- messageType: 消息類型,主要是提供默認(rèn)的對(duì)話框圖標(biāo)。可能的值為:JOptionPane.PLAIN_MESSAGE 簡(jiǎn)單消息(不使用圖標(biāo))JOptionPane.INFORMATION_MESSAGE 信息消息(默認(rèn))JOptionPane.QUESTION_MESSAGE 問(wèn)題消息JOptionPane.WARNING_MESSAGE 警告消息JOptionPane.ERROR_MESSAGE 錯(cuò)誤消息
對(duì)話框
class JOptionPaneUse { public JOptionPaneUse() { final JFrame jf = new JFrame(“測(cè)試窗口”); jf.setSize(400, 400); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); /* * 1. 消息對(duì)話框(信息消息) */ JButton btn01 = new JButton(“showMessageDialog(信息消息)”); btn01.addActionListener(e -> { // 消息對(duì)話框無(wú)返回, 僅做通知作用 JOptionPane.showMessageDialog(jf, “通知信息”, “消息標(biāo)題”, JOptionPane.INFORMATION_MESSAGE ); }); /* * 2. 消息對(duì)話框(警告消息) */ JButton btn02 = new JButton(“showMessageDialog(警告消息)”); btn02.addActionListener(e -> { // 消息對(duì)話框無(wú)返回, 僅做通知作用 JOptionPane.showMessageDialog(jf, “警告信息”, “消息標(biāo)題”, JOptionPane.WARNING_MESSAGE); }); /* * 3. 確認(rèn)對(duì)話框 */ JButton btn03 = new JButton(“showConfirmDialog”); btn03.addActionListener(e -> { /* * 返回用戶點(diǎn)擊的選項(xiàng), 值為下面三者之一: * 是: JOptionPane.YES_OPTION * 否: JOptionPane.NO_OPTION * 取消: JOptionPane.CANCEL_OPTION * 關(guān)閉: JOptionPane.CLOSED_OPTION */ int result = JOptionPane.showConfirmDialog(jf, “確認(rèn)刪除?”, “提示”, JOptionPane.YES_NO_CANCEL_OPTION); System.out.println(“選擇結(jié)果: ” + result); }); /* * 4. 輸入對(duì)話框(文本框輸入) */ JButton btn04 = new JButton(“showInputDialog(文本框輸入)”); btn04.addActionListener(e -> { // 顯示輸入對(duì)話框, 返回輸入的內(nèi)容 String inputContent = JOptionPane.showInputDialog(jf, “輸入你的名字:”, “默認(rèn)內(nèi)容”); System.out.println(“輸入的內(nèi)容: ” + inputContent); }); /* * 5. 輸入對(duì)話框(下拉框選擇) */ JButton btn05 = new JButton(“showInputDialog(下拉框選擇)”); btn05.addActionListener(e -> { Object[] selectionValues = new Object[]{“香蕉”, “雪梨”, “蘋果”}; // 顯示輸入對(duì)話框, 返回選擇的內(nèi)容, 點(diǎn)擊取消或關(guān)閉, 則返回null Object inputContent = JOptionPane.showInputDialog(jf, “選擇一項(xiàng): “, “標(biāo)題”, JOptionPane.PLAIN_MESSAGE, null, selectionValues, selectionValues[0]); System.out.println(“輸入的內(nèi)容: ” + inputContent); }); /* * 6. 選項(xiàng)對(duì)話框 */ JButton btn06 = new JButton(“showOptionDialog”); btn06.addActionListener(e -> { // 選項(xiàng)按鈕 Object[] options = new Object[]{“香蕉”, “雪梨”, “蘋果”}; // 顯示選項(xiàng)對(duì)話框, 返回選擇的選項(xiàng)索引, 點(diǎn)擊關(guān)閉按鈕返回-1 int optionSelected = JOptionPane.showOptionDialog(jf, “請(qǐng)點(diǎn)擊一個(gè)按鈕選擇一項(xiàng)”, “對(duì)話框標(biāo)題”, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE, null, options, // 如果傳null, 則按鈕為 optionType 類型所表示的按鈕(也就是確認(rèn)對(duì)話框) options[0] ); if (optionSelected >= 0) { System.out.println(“點(diǎn)擊的按鈕: ” + options[optionSelected]); } }); // 垂直排列按鈕 Box vBox = Box.createVerticalBox(); vBox.add(btn01); vBox.add(btn02); vBox.add(btn03); vBox.add(btn04); vBox.add(btn05); vBox.add(btn06); JPanel panel = new JPanel(); panel.add(vBox); jf.setContentPane(panel); jf.setVisible(true); }}
自定義彈窗
class JDialogUse { public JDialogUse() { final JFrame jf = new JFrame(“測(cè)試窗口”); jf.setSize(300, 300); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JButton btn = new JButton(“顯示自定義對(duì)話框”); btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { showCustomDialog(jf, jf); } }); JPanel panel = new JPanel(); panel.add(btn); jf.setContentPane(panel); jf.setVisible(true); } /** * 顯示一個(gè)自定義的對(duì)話框 * * @param owner 對(duì)話框的擁有者 * @param parentComponent 對(duì)話框的父級(jí)組件 */ private static void showCustomDialog(Frame owner, Component parentComponent) { // 創(chuàng)建一個(gè)模態(tài)對(duì)話框 final JDialog dialog = new JDialog(owner, “提示”, true); // 設(shè)置對(duì)話框的寬高 dialog.setSize(250, 150); // 設(shè)置對(duì)話框大小不可改變 dialog.setResizable(false); // 設(shè)置對(duì)話框相對(duì)顯示的位置 dialog.setLocationRelativeTo(parentComponent); // 創(chuàng)建一個(gè)標(biāo)簽顯示消息內(nèi)容 JLabel messageLabel = new JLabel(“對(duì)話框消息內(nèi)容”); // 創(chuàng)建一個(gè)按鈕用于關(guān)閉對(duì)話框 JButton okBtn = new JButton(“確定”); okBtn.addActionListener(e -> { // 關(guān)閉對(duì)話框 dialog.dispose(); }); // 創(chuàng)建對(duì)話框的內(nèi)容面板, 在面板內(nèi)可以根據(jù)自己的需要添加任何組件并做任意是布局 JPanel panel = new JPanel(); // 添加組件到面板 panel.add(messageLabel); panel.add(okBtn); // 設(shè)置對(duì)話框的內(nèi)容面板 dialog.setContentPane(panel); // 顯示對(duì)話框 dialog.setVisible(true); }}
2、3 面板
面板也是一個(gè)容器,但是它不能單獨(dú)存在,只能存在于窗口中,一個(gè)面板對(duì)象代表了一個(gè)長(zhǎng)方形的區(qū)域,在這個(gè)區(qū)域中可以容納其他組件,在程序中通常會(huì)使面板來(lái)實(shí)現(xiàn)一些特殊的布局。
普通面板
public class JPanelUse { public static void main(String[] args) { // 初始化窗口 JFrame jFrame = new JFrame(“面板窗口”); jFrame.setVisible(true); jFrame.setSize(400, 400); jFrame.setLocationRelativeTo(null); jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 初始化面板:采用默認(rèn)的流式布局或指定布局 JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); // 設(shè)置面板大小 jPanel.setSize(100, 100); // 設(shè)置面板背景顏色 jPanel.setBackground(new Color(164, 24, 24)); // 將面板添加到窗口 jFrame.add(jPanel); }}
滾動(dòng)面板
JScrollPane,滾動(dòng)面板,支持水平和垂直滾動(dòng)視圖。文本區(qū)域、表格等需要顯示較多數(shù)據(jù)而空間又有限時(shí),通常使用 JScrollPane 進(jìn)行包裹以實(shí)現(xiàn)滾動(dòng)顯示。
public class JScrollPaneUse { public JScrollPaneUse() { JFrame jFrame = new JFrame(“面板窗口”); // 創(chuàng)建文本區(qū)域組件 JTextArea textArea = new JTextArea(“這是一個(gè)文本”); // 自動(dòng)換行 textArea.setLineWrap(true); // 設(shè)置字體 textArea.setFont(new Font(null, Font.PLAIN, 18)); // 初始化滾動(dòng)面板面板 /** * 全參構(gòu)造參數(shù)說(shuō)明: * view: 需要滾動(dòng)顯示的視圖組件 * vsbPolicy: 垂直滾動(dòng)條的顯示策略 * ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED // 需要時(shí)顯示(默認(rèn)) * ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER // 從不顯示 * ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS // 總是顯示 * hsbPolicy: 水平滾動(dòng)條的顯示策略 * ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED // 需要時(shí)顯示(默認(rèn)) * ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER // 從不顯示 * ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS // 總是顯示 * 常用方法 * 設(shè)置滾動(dòng)顯示視圖內(nèi)容組件:setViewportView(Component view) * 設(shè)置垂直滾動(dòng)條的顯示策略:setVerticalScrollBarPolicy(int policy) * 設(shè)置水平滾動(dòng)條的顯示策略:setHorizontalScrollBarPolicy(int policy) */ JScrollPane jScrollPane = new JScrollPane( textArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER ); jFrame.setContentPane(jScrollPane); // 窗口設(shè)置為公共代碼,后面全部省略 jFrame.setVisible(true); jFrame.setSize(400, 400); jFrame.setLocationRelativeTo(null); jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); }}
分隔面板
JSplitPane,分隔面板,用于分隔兩個(gè)(只能兩個(gè))組件,兩個(gè)組件通過(guò)水平/垂直分隔條分別 左右 或 上下 顯示,并且可以拖動(dòng)分隔條調(diào)整兩個(gè)組件顯示區(qū)域的大小。
class JSplitPaneUse{ public JSplitPaneUse() { JFrame jFrame = new JFrame(“分隔面板窗口”); /** * 全參構(gòu)造參數(shù)說(shuō)明 * orientation: 分隔的方向(默認(rèn)水平),HORIZONTAL_SPLIT:水平左右分隔;VERTICAL_SPLIT:垂直上下分隔 * continuousLayout: 拖動(dòng)分隔條時(shí),是否連續(xù)重繪組件,如果為flase,則拖動(dòng)分隔條停止后才重繪組件。 * leftComponent: 左邊/上面 顯示的組件 * rightComponent: 右邊/下面 顯示的組件 * 常用方法 * setOrientation(int orientation): 設(shè)置分隔的方向,水平(左右) 或 垂直(上下) 分隔 * setLeftComponent(Component comp):設(shè)置 左邊/上面 顯示的組件 * setRightComponent(Component comp):設(shè)置 左邊/下面 顯示的組件 * setContinuousLayout(boolean continuousLayout): 設(shè)置 拖動(dòng)分隔條 時(shí)是否 連續(xù)重繪 組件 * setOneTouchExpandable(boolean newValue):分隔條上是否顯示快速 折疊/展開 兩邊組件的小按鈕 * setDividerSize(int newSize):設(shè)置分隔條的大小(寬度) * setDividerLocation(int location):設(shè)置分隔條的位置,相對(duì)于 左邊/頂部 的像素長(zhǎng)度 */ JSplitPane jSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, new JButton(“左邊按鈕”), new JButton(“右邊按鈕”)); jSplitPane.setDividerLocation(200); jFrame.setContentPane(jSplitPane); // 省略公共代碼 }}
選項(xiàng)卡面板
JTabbedPane,選項(xiàng)卡面板。它允許用戶通過(guò)點(diǎn)擊給定標(biāo)題或圖標(biāo)的選項(xiàng)卡,在一組組件之間進(jìn)行切換顯示。
class JTabbedPaneUse { public JTabbedPaneUse() { JFrame jFrame = new JFrame(“選項(xiàng)卡面板窗口”); /** * 全參構(gòu)造參數(shù)說(shuō)明: * tabPlacement: 選項(xiàng)卡標(biāo)題的位置, 值為 JTabbedPane.TOP/BOTTOM/LEFT/RIGHT, 默認(rèn)為 TOP * tabLayoutPolicy: 選項(xiàng)卡位置不能放入所有的選項(xiàng)卡時(shí),放置選項(xiàng)卡的策略,值JTabbedPane.WRAP_TAB_LAYOUT/SCROLL_TAB_LAYOUT * 常用方法 * addTab(String 標(biāo)題, Icon 圖標(biāo), Component 內(nèi)容組件, String 提示文本):添加選擇項(xiàng)卡 * insertTab(String title, Icon icon, Component component, String tip, int index):在指定位置插入選項(xiàng)卡 * remove(Component component):移除指定內(nèi)容控件的選項(xiàng)卡 * remove(int index):移除指定位置的選項(xiàng) * setSelectedIndex(int index):設(shè)置當(dāng)前選中的選項(xiàng)卡 * getSelectedIndex():獲取當(dāng)前選中的選項(xiàng)卡索引 * getSelectedComponent():獲取當(dāng)前選中的選項(xiàng)卡對(duì)應(yīng)的內(nèi)容組件 * setTitleAt(int index, String title):設(shè)置 index 位置的選項(xiàng)卡的標(biāo)題 * setIconAt(int index, Icon icon):設(shè)置 index 位置的選項(xiàng)卡的圖標(biāo) * setEnabledAt(int index, boolean enabled):設(shè)置 index 位置的選項(xiàng)卡是否可用 * setComponentAt(int index, Component component):將 index 位置的內(nèi)容組件設(shè)置為 component */ // 初始化一個(gè)選項(xiàng)面板,默認(rèn)選項(xiàng)卡在頂部,放不下了換行 JTabbedPane jTabbedPane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.WRAP_TAB_LAYOUT); // 創(chuàng)建選項(xiàng)卡 jTabbedPane.addTab(“選項(xiàng)卡1”, new JButton(“測(cè)試按鈕”)); jTabbedPane.addTab(“選項(xiàng)卡2”, new JButton(“測(cè)試按鈕”)); jFrame.setContentPane(jTabbedPane); // 省略公共代碼 }}
3、布局
3.1、流式布局
FlowLayout,流式布局管理器,按水平方向依次排列放置組件,排滿一行,換下一行繼續(xù)排列。排列方向(左到右 或 右到左)取決于容器的componentOrientation屬性(該屬性屬于Component),它可能的值如下:
- ComponentOrientation.LEFT_TO_RIGHT(默認(rèn))
- ComponentOrientation.RIGHT_TO_LEFT
同一行(水平方向)的組件的對(duì)齊方式由 FlowLayout 的align屬性確定,它可能的值如下:
- FlowLayout.LEFT : 左對(duì)齊
- FlowLayout.CENTER : 居中對(duì)齊(默認(rèn))
- FlowLayout.RIGHT : 右對(duì)齊
- FlowLayout.LEADING : 與容器方向的開始邊對(duì)齊,例如,對(duì)于從左到右的方向,則與左邊對(duì)齊
- FlowLayout.TRAILING : 與容器方向的結(jié)束邊對(duì)齊,例如,對(duì)于從左到右的方向,則與右邊對(duì)齊。
class FlowLayoutUse { public FlowLayoutUse() { JFrame jFrame = new JFrame(“流式布局窗口”); // 創(chuàng)建面板并指定為流式布局 JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); // 創(chuàng)建兩個(gè)按鈕 JButton jButton1 = new JButton(“按鈕1”); JButton jButton2 = new JButton(“按鈕2”); // 將按鈕添加到面板中 jPanel.add(jButton1); jPanel.add(jButton2); // 將面板添加到窗口中 jFrame.setContentPane(jPanel); // 省略公共代碼 }}
3.2、網(wǎng)格布局
GridLayout,網(wǎng)格布局管理器,它以矩形網(wǎng)格形式對(duì)容器的組件進(jìn)行布置,把容器按行列分成大小相等的矩形網(wǎng)格,一個(gè)網(wǎng)格中放置一個(gè)組件,組件寬高自動(dòng)撐滿網(wǎng)格。以行數(shù)和總數(shù)優(yōu)先: 通過(guò)構(gòu)造方法或 setRows 和 setColumns 方法將行數(shù)和列數(shù)都設(shè)置為非零值時(shí),指定的列數(shù)將被忽略。列數(shù)通過(guò)指定的行數(shù)和布局中的組件總數(shù)來(lái)確定。因此,例如,如果指定了三行和兩列,在布局中添加了九個(gè)組件,則它們將顯示為三行三列。僅當(dāng)將行數(shù)設(shè)置為零時(shí),指定列數(shù)才對(duì)布局有效。
class GridLayoutUse { public GridLayoutUse() { JFrame jFrame = new JFrame(“網(wǎng)格布局窗口”); // 創(chuàng)建一個(gè)面板并使用網(wǎng)格布局 JPanel jPanel = new JPanel(new GridLayout(2, 2)); // 創(chuàng)建五個(gè)按鈕,測(cè)試2行2列超出效果 JButton jButton1 = new JButton(“按鈕1”); JButton jButton2 = new JButton(“按鈕2”); JButton jButton3 = new JButton(“按鈕3”); JButton jButton4 = new JButton(“按鈕4”); JButton jButton5 = new JButton(“按鈕5”); jPanel.add(jButton1); jPanel.add(jButton2); jPanel.add(jButton3); jPanel.add(jButton4); jPanel.add(jButton5); jFrame.setContentPane(jPanel); // 省略公共代碼 }}
3.3、邊框布局
BorderLayout,邊界布局管理器,它把 Container 按方位分為 5 個(gè)區(qū)域(東、西、南、北、中),每個(gè)區(qū)域放置一個(gè)組件。
class BorderLayoutUse { public BorderLayoutUse() { JFrame jFrame = new JFrame(“網(wǎng)格布局窗口”); // 創(chuàng)建一個(gè)面板并使用邊框布局 JPanel jPanel = new JPanel(new BorderLayout()); // 創(chuàng)建五個(gè)按鈕,測(cè)試2行2列超出效果 JButton jButton1 = new JButton(“東”); JButton jButton2 = new JButton(“西”); JButton jButton3 = new JButton(“南”); JButton jButton4 = new JButton(“北”); JButton jButton5 = new JButton(“中”); jPanel.add(jButton1, BorderLayout.EAST); jPanel.add(jButton2, BorderLayout.WEST); jPanel.add(jButton3, BorderLayout.SOUTH); jPanel.add(jButton4, BorderLayout.NORTH); jPanel.add(jButton5, BorderLayout.CENTER); jFrame.setContentPane(jPanel); // 省略公共代碼 }}
4、組件
4.1、基本組件
標(biāo)簽
JLabel,標(biāo)簽,主要用于展示文本或圖片,也可以同時(shí)顯示文本和圖片。
class JLabelUse { public JLabelUse() { JFrame jFrame = new JFrame(“標(biāo)簽窗口”); JPanel jPanel = new JPanel(); // 只顯示文本的標(biāo)簽 JLabel textLabel = new JLabel(“只顯示文本的標(biāo)簽”); textLabel.setFont(new Font(null, Font.PLAIN, 25)); jPanel.add(textLabel); // 只顯示圖片的標(biāo)簽 JLabel imgLabel = new JLabel(new ImageIcon(“bj.jpg”)); jPanel.add(imgLabel); // 同時(shí)顯示文本和圖片的標(biāo)簽:水平方向文本在圖片中心 JLabel jLabel = new JLabel(“顯示文本”, new ImageIcon(“bj.jpg”), SwingConstants.CENTER); jPanel.add(jLabel); jFrame.setContentPane(jPanel); // 省略公共代碼 }}
按鈕
class JButtonAndRadioAndCheckBox { public JButtonAndRadioAndCheckBox() { JFrame jFrame = new JFrame(“標(biāo)簽窗口”); JPanel jPanel = new JPanel(); /** * 普通圖片按鈕 */ JButton jButton = new JButton(“圖片按鈕”, new ImageIcon(“bj.jpg”)); jButton.addActionListener(e -> { System.out.println(“圖片按鈕被點(diǎn)擊了”); }); jPanel.add(jButton); /** * 單選按鈕 */ // 創(chuàng)建按鈕組,將單選按鈕添加到該組,確保只能選擇其一 ButtonGroup buttonGroup = new ButtonGroup(); // 創(chuàng)建單選按鈕 JRadioButton man = new JRadioButton(“男”); JRadioButton woman = new JRadioButton(“女”); // 設(shè)置第一個(gè)被選中 man.setSelected(true); // 將按鈕添加到按鈕組中 buttonGroup.add(man); buttonGroup.add(woman); // 將按鈕添加到面板中 jPanel.add(man); jPanel.add(woman); /** * 多選按鈕 */ // 添加多選按鈕 JCheckBox jCheckBox1 = new JCheckBox(“香蕉”); JCheckBox jCheckBox2 = new JCheckBox(“蘋果”); JCheckBox jCheckBox3 = new JCheckBox(“梨子”); JCheckBox jCheckBox4 = new JCheckBox(“黃瓜”); // 添加事件監(jiān)聽,添加第一個(gè)復(fù)選框的狀態(tài)被改變的監(jiān)聽(其他復(fù)選框如果需要監(jiān)聽狀態(tài)改變,則可按此方法添加監(jiān)聽) jCheckBox1.addChangeListener(e -> { // 獲取事件源(即復(fù)選框本身) JCheckBox jCheckBox = (JCheckBox) e.getSource(); System.out.println(jCheckBox.getText() + ” 是否選中: ” + jCheckBox.isSelected()); }); jCheckBox1.setSelected(true); jPanel.add(jCheckBox1); jPanel.add(jCheckBox2); jPanel.add(jCheckBox3); jPanel.add(jCheckBox4); jFrame.setContentPane(jPanel); // 省略公共代碼 }}
列表
JComboBox,下拉框。JComboBox以下列列表的形式展示多個(gè)選項(xiàng),用戶可以從下拉列表中選擇一個(gè)值。如果設(shè)置JComboBox為可編輯狀態(tài),除了選擇指定的選項(xiàng)值外,還允許用戶自行輸入值(自行輸入的值索引為-1)。
JList,列表框。JList 以列表的形式展示多個(gè)選項(xiàng),允許用戶選擇一個(gè)或多個(gè)選項(xiàng)。其中的選項(xiàng)內(nèi)容由一個(gè) ListModel 實(shí)例來(lái)維護(hù)。JList 不實(shí)現(xiàn)直接滾動(dòng),需要滾動(dòng)顯示,可以結(jié)合 JScrollPane 實(shí)現(xiàn)滾動(dòng)效果。
class JComboBoxAndJList { public JComboBoxAndJList() { JFrame jFrame = new JFrame(“列表窗口”); JPanel jPanel = new JPanel(); JLabel jLabel = new JLabel(“水果”); /** * 下拉框:這里的數(shù)組列表可以使用Vector集合進(jìn)行 */ final JComboBox jComboBox = new JComboBox(new String[]{“香蕉”, “雪梨”, “蘋果”, “荔枝”}); // 添加條目選中狀態(tài)改變的監(jiān)聽器 jComboBox.addItemListener(e -> { // 只處理選中的狀態(tài) if (e.getStateChange() == ItemEvent.SELECTED) { System.out.println(“選中: ” + jComboBox.getSelectedIndex() + ” = ” + jComboBox.getSelectedItem()); } }); jPanel.add(jLabel); jPanel.add(jComboBox); /** * 列表框 */ final JList jList = new JList(); // 設(shè)置一下首選大小 jList.setPreferredSize(new Dimension(200, 100)); // 允許可間斷的多選 jList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); // 設(shè)置選項(xiàng)數(shù)據(jù)(內(nèi)部將自動(dòng)封裝成 ListModel ),這里的數(shù)組列表可以使用Vector集合進(jìn)行 jList.setListData(new String[]{“香蕉”, “雪梨”, “蘋果”, “荔枝”}); // 添加選項(xiàng)選中狀態(tài)被改變的監(jiān)聽器 jList.addListSelectionListener(e -> { // 獲取所有被選中的選項(xiàng)索引 int[] indices = jList.getSelectedIndices(); // 獲取選項(xiàng)數(shù)據(jù)的 ListModel ListModel listModel = jList.getModel(); // 輸出選中的選項(xiàng) for (int index : indices) { System.out.println(“選中: ” + index + ” = ” + listModel.getElementAt(index)); } System.out.println(); }); jPanel.add(jList); jFrame.setContentPane(jPanel); // 省略公共代碼 }}
文本框
JTextField,文本框。JTextField 用來(lái)編輯單行的文本。
JPasswordField,密碼框。JPasswordField 繼承自 JTextField,只是顯示輸入的內(nèi)容時(shí)用特定的字符替換顯示(例如 * 或 ),用法和 JTextField 基本一致。
JTextArea,文本區(qū)域。JTextArea 用來(lái)編輯多行的文本。JTextArea 除了允許多行編輯外,其他基本用法和 JTextField 基本一致。
class JTextFieldAndJPasswordFieldAndJTextAreaUse { public JTextFieldAndJPasswordFieldAndJTextAreaUse() { JFrame jFrame = new JFrame(“列表窗口”); JPanel jPanel = new JPanel(new GridLayout(3,1)); /** * 文本框 */ final JTextField jTextField = new JTextField(10); jTextField.setFont(new Font(null, Font.PLAIN, 20)); jPanel.add(new JLabel(“用戶名”)); jPanel.add(jTextField); /** * 密碼框 */ final JPasswordField jPasswordField = new JPasswordField(32); jPanel.add(new JLabel(“密 碼”)); jPanel.add(jPasswordField); /** * 文本域 */ // 創(chuàng)建一個(gè) 5 行 10 列的文本區(qū)域 JTextArea jTextArea = new JTextArea(5, 10); // 自動(dòng)換行 jTextArea.setLineWrap(true); jPanel.add(new JLabel(“文本域”)); jPanel.add(jTextArea); jFrame.setContentPane(jPanel); // 省略公共代碼 }}
進(jìn)度條和滑塊
JProgressBar,進(jìn)度條。以可視化形式顯示某些任務(wù)進(jìn)度的組件,進(jìn)度條中心可顯示進(jìn)度百分比的文本表示形式。一個(gè)任務(wù)的進(jìn)度長(zhǎng)度未知時(shí),可將進(jìn)度條設(shè)置為不確定模式。不確定模式的進(jìn)度條持續(xù)地顯示動(dòng)畫來(lái)表示正進(jìn)行的操作。當(dāng)可以確定任務(wù)長(zhǎng)度和進(jìn)度量時(shí),則可設(shè)置進(jìn)度條的最大最小值,以及更新進(jìn)度條的進(jìn)度值,將其切換回確定模式。
JSlider,滑塊。以圖形方式在有界區(qū)間內(nèi)通過(guò)移動(dòng)滑塊來(lái)選擇值的組件。滑塊可以顯示主刻度標(biāo)記以及主刻度之間的次刻度標(biāo)記??潭葮?biāo)記之間的值的個(gè)數(shù)由 setMajorTickSpacing(int) 和 setMinorTickSpacing(int) 來(lái)控制??潭葮?biāo)記的繪制由 setPaintTicks(boolean) 控制?;瑝K也可以在固定時(shí)間間隔(或在任意位置)沿滑塊刻度打印文本標(biāo)簽。標(biāo)簽的繪制由 setLabelTable(Dictionary) 和 setPaintLabels(boolean) 控制。PS: 當(dāng)滑塊獲得焦點(diǎn)后,按鍵盤上的 上下左右鍵 也可以滑動(dòng)滑塊。
class JProgressBarAndJSliderUse { public JProgressBarAndJSliderUse() { JFrame jFrame = new JFrame(“列表窗口”); JPanel jPanel = new JPanel(new GridLayout(3, 1)); /** * 進(jìn)度條: * 全參構(gòu)造參數(shù)說(shuō)明:JProgressBar(int orient, int min, int max) * orient: 進(jìn)度條的方向,SwingConstants.VERTICAL 或 SwingConstants.HORIZONTAL,默認(rèn)為水平方向 * min: 最小進(jìn)度值;max: 最大進(jìn)度值 * 常用方法: * 設(shè)置最小進(jìn)度值、最大進(jìn)度值和當(dāng)前進(jìn)度值:setMinimum(int min),setMaximum(int max),setValue(int n) * 獲取當(dāng)前進(jìn)度值:getValue() * 獲取當(dāng)前進(jìn)度的百分比:getPercentComplete() * 是否繪制百分比文本(進(jìn)度條中間顯示的百分?jǐn)?shù)):setStringPainted(boolean b) * 設(shè)置進(jìn)度條進(jìn)度是否為不確定模式:setIndeterminate(boolean newValue) * 設(shè)置進(jìn)度條的方向,SwingConstants.VERTICAL 或 SwingConstants.HORIZONTAL:setOrientation(int newOrientation) * 添加進(jìn)度條的進(jìn)度改變監(jiān)聽器:addChangeListener(ChangeListener l) */ JProgressBar jProgressBar = new JProgressBar(0, 100); jProgressBar.setValue(20); jProgressBar.addChangeListener(e -> { System.out.println(“當(dāng)前進(jìn)度值: ” + jProgressBar.getValue() + “; ” + “進(jìn)度百分比: ” + jProgressBar.getPercentComplete()); }); jPanel.add(jProgressBar); /** * 滑塊: * 全參構(gòu)造參數(shù)說(shuō)明:JSlider(int orientation, int min, int max, int value) * orientation: 滑塊的方向,SwingConstants.VERTICAL 或 SwingConstants.HORIZONTAL,默認(rèn)為水平方向 * min: 滑塊的最小值; max: 滑塊的最大值 * value: 滑塊的初始值(默認(rèn)為 最小值 和 最大值 之間的 中間值) * 常用方法: * 設(shè)置滑塊的最小值、最大值、當(dāng)前值:setMinimum(int min),setMaximum(int max),setValue(int n) * 獲取滑塊的當(dāng)前值:getValue() * 設(shè)置主刻度標(biāo)記間隔:setMajorTickSpacing(int n) * 設(shè)置單個(gè)主刻度內(nèi)的次刻度標(biāo)記間隔:setMinorTickSpacing(int n) * 設(shè)置是否繪制刻度線:setPaintTicks(boolean b) * 設(shè)置是否繪制刻度標(biāo)簽(刻度值文本):setPaintLabels(boolean b) * 設(shè)置是否繪制滑道:setPaintTrack(boolean b) * 設(shè)置是否顛倒刻度值(刻度值從大到?。簊etInverted(boolean b) * 設(shè)置滑塊是否對(duì)齊到刻度。設(shè)置為 true,則滑塊最終只能在有刻度的位置取值,即滑塊取值不連續(xù):setSnapToTicks(boolean b) * 添加滑塊的值改變監(jiān)聽器:addChangeListener(ChangeListener l) */ JSlider jSlider = new JSlider(0, 20, 10); // 設(shè)置主刻度間隔 jSlider.setMajorTickSpacing(5); // 設(shè)置次刻度間隔 jSlider.setMinorTickSpacing(1); // 繪制刻度和標(biāo)簽 jSlider.setPaintTicks(true); jSlider.setPaintLabels(true); jSlider.addChangeListener(e -> { System.out.println(“當(dāng)前值: ” + jSlider.getValue()); }); jPanel.add(jSlider); jFrame.setContentPane(jPanel); // 省略公共代碼 }}
4.2、復(fù)雜組件
文件和顏色選擇器
JFileChooser,文件選取器。JFileChooser為用戶選擇文件提供了一種簡(jiǎn)單的機(jī)制,包括打開文件和保存文件。構(gòu)造方法和常用方法如下:
方法 | 功能 |
JFileChooser(String currentDirectoryPath) | currentDirectoryPath: 打開文件選取器時(shí)默認(rèn)顯示的文件夾(默認(rèn)為用戶文件夾) |
JFileChooser(File currentDirectory) | currentDirectory: 打開文件選取器時(shí)默認(rèn)顯示的文件夾(默認(rèn)為用戶文件夾) |
void setCurrentDirectory(File dir) | 設(shè)置默認(rèn)顯示的文件夾 |
void setFileSelectionMode(int mode) | 設(shè)置文件選擇模式,F(xiàn)ILES_AND_DIRECTORIES: 文件和文件夾都可以選,其他的二選一 |
void setMultiSelectionEnabled(boolean b) | 設(shè)置是否允許同時(shí)選擇多個(gè)(默認(rèn)為不允許) |
void addChoosableFileFilter(FileFilter filter) | 添加可供用戶選擇的文件過(guò)濾器 |
void setFileFilter(FileFilter filter) | 設(shè)置默認(rèn)使用的文件過(guò)濾器 |
void setSelectedFile(File file) | 設(shè)置默認(rèn)被選中的文件 |
File[] getSelectedFiles() | 獲取選擇的文件(一般在用戶選擇完文件點(diǎn)擊了確認(rèn)或保存后通過(guò)該方法獲取選中的文件) |
class FileSelectedUse { public FileSelectedUse() { JFrame jFrame = new JFrame(); JPanel jPanel = new JPanel(); /** * 顯示 打開文件 或 保存文件 的對(duì)話框(線程將被阻塞, 直到選擇框被關(guān)閉):showOpenDialog(Component parent), showSaveDialog(Component parent) * 參數(shù): * parent: 文件選取器對(duì)話框的父組件, 對(duì)話框?qū)?huì)盡量顯示在靠近 parent 的中心; 如果傳 null, 則顯示在屏幕中心。 * 返回值: * JFileChooser.CANCEL_OPTION: 點(diǎn)擊了取消或關(guān)閉 * JFileChooser.APPROVE_OPTION: 點(diǎn)擊了確認(rèn)或保存 * JFileChooser.ERROR_OPTION: 出現(xiàn)錯(cuò)誤 */ final JTextArea jTextArea = new JTextArea(10, 30); jTextArea.setLineWrap(true); jPanel.add(jTextArea); JButton openBtn = new JButton(“打開”); openBtn.addActionListener(e -> showFileOpenDialog(jFrame, jTextArea)); jPanel.add(openBtn); JButton saveBtn = new JButton(“保存”); saveBtn.addActionListener(e -> showFileSaveDialog(jFrame, jTextArea)); jPanel.add(saveBtn); jFrame.setContentPane(jPanel); // 省略公共代碼 } /** * 打開文件 * @param parent 組件 * @param msgTextArea 文本域 */ private static void showFileOpenDialog(Component parent, JTextArea msgTextArea) { // 創(chuàng)建一個(gè)默認(rèn)的文件選取器 JFileChooser fileChooser = new JFileChooser(); // 設(shè)置默認(rèn)顯示的文件夾為當(dāng)前文件夾 fileChooser.setCurrentDirectory(new File(“.”)); // 設(shè)置文件選擇的模式(只選文件、只選文件夾、文件和文件均可選) fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); // 設(shè)置是否允許多選 fileChooser.setMultiSelectionEnabled(true); // 添加可用的文件過(guò)濾器(FileNameExtensionFilter 的第一個(gè)參數(shù)是描述, 后面是需要過(guò)濾的文件擴(kuò)展名 可變參數(shù)) fileChooser.addChoosableFileFilter(new FileNameExtensionFilter(“zip(*.zip, *.rar)”, “zip”, “rar”)); // 設(shè)置默認(rèn)使用的文件過(guò)濾器 fileChooser.setFileFilter(new FileNameExtensionFilter(“image(*.jpg, *.png, *.gif)”, “jpg”, “png”, “gif”)); // 打開文件選擇框(線程將被阻塞, 直到選擇框被關(guān)閉) int result = fileChooser.showOpenDialog(parent); if (result == JFileChooser.APPROVE_OPTION) { // 如果點(diǎn)擊了”確定”, 則獲取選擇的文件路徑 File file = fileChooser.getSelectedFile(); // 如果允許選擇多個(gè)文件, 則通過(guò)下面方法獲取選擇的所有文件 msgTextArea.append(“打開文件: ” + file.getAbsolutePath() + “”); } } /** * 選擇文件保存路徑 * @param parent 組件 * @param msgTextArea 文本域 */ private static void showFileSaveDialog(Component parent, JTextArea msgTextArea) { // 創(chuàng)建一個(gè)默認(rèn)的文件選取器 JFileChooser fileChooser = new JFileChooser(); // 設(shè)置打開文件選擇框后默認(rèn)輸入的文件名 fileChooser.setSelectedFile(new File(“測(cè)試文件.zip”)); // 打開文件選擇框(線程將被阻塞, 直到選擇框被關(guān)閉) int result = fileChooser.showSaveDialog(parent); if (result == JFileChooser.APPROVE_OPTION) { // 如果點(diǎn)擊了”保存”, 則獲取選擇的保存路徑 File file = fileChooser.getSelectedFile(); msgTextArea.append(“保存到文件: ” + file.getAbsolutePath() + “”); } }}
JColorChooser,顏色選取器。JColorChooser提供一個(gè)用于允許用戶操作和選擇顏色的控制器對(duì)話框。
class ColorSelectedUse { public ColorSelectedUse() { JFrame jFrame = new JFrame(); JPanel jPanel = new JPanel(); final JLabel jLabel = new JLabel(); jLabel.setPreferredSize(new Dimension(150, 150)); jLabel.setOpaque(true); jPanel.add(jLabel); JButton jButton = new JButton(“選擇顏色”); jButton.addActionListener(e -> { /** * 顯示一個(gè)顏色選取器對(duì)話框(線程將被阻塞, 直到對(duì)話框被關(guān)閉) * 參數(shù)說(shuō)明: * component: 對(duì)話框的父組件, 對(duì)話框?qū)⒕o靠 component 的中心顯示; 如果傳 null, 則對(duì)話框顯示在屏幕中心。 * title: 對(duì)話框標(biāo)題。 * initialColor: 初始選中的顏色; 如果傳 null, 則默認(rèn)為非透明白色。 * 返回值: * 返回選擇的顏色; 如果點(diǎn)擊了取消或關(guān)閉, 則返回 null。 */ Color color = JColorChooser.showDialog(jFrame, “選取顏色”, null); // 如果用戶取消或關(guān)閉窗口, 則返回的 color 為 null if (color == null) { return; } // 把選取的顏色設(shè)置為標(biāo)簽的背景 jLabel.setBackground(color); // 獲取顏色的 ARGB 各個(gè)分量值 int alpha = color.getAlpha(); int red = color.getRed(); int green = color.getGreen(); int blue = color.getBlue(); jLabel.setText(“A=” + String.format(“%02x”, alpha) + “, ” + String.format(“#%02x%02x%02x”, red, green, blue)); }); jPanel.add(jButton); jFrame.setContentPane(jPanel); // 省略公共代碼 }}
菜單欄和工具欄
JMenuBar,菜單欄。菜單欄組件添加到 JFrame 窗口后,在窗口的內(nèi)容顯示區(qū)域的頂部出現(xiàn)。實(shí)現(xiàn)一個(gè)菜單欄主要涉及三種類:
- JMenuBar:表示一個(gè)菜單欄。
- JMenu:表示菜單欄上的一個(gè)一級(jí)菜單。
- JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem:表示一級(jí)菜單下的一個(gè)子菜單項(xiàng),三者分別表示 普通的子菜單、帶復(fù)選框的子菜單、帶單選按鈕的子菜單。
PS: JMenu 繼承自 JMenuItem,所以一個(gè) JMenu 也可以當(dāng)做是一個(gè)二級(jí)子菜單項(xiàng),通過(guò) JMenu 和 JMenuItem 之間的嵌套,可實(shí)現(xiàn)多級(jí)子菜單效果。構(gòu)造參數(shù)和常用方法如下
類 | 方法 | 功能 |
JMenuItem | void setText(String text) | 設(shè)置菜單顯示的文本 |
JMenuItem | void setIcon(Icon defaultIcon) | 設(shè)置菜單顯示的圖標(biāo) |
全參構(gòu)造 | JMenuItem(String text, Icon icon) | text: 菜單顯示的文本,icon: 菜單顯示的圖標(biāo) |
JMenuItem | void setMnemonic(int mnemonic) | 設(shè)置菜單的鍵盤助記符 |
JMenuItem | void setAccelerator(KeyStroke keyStroke) | 設(shè)置修改鍵,使用鍵盤快捷鍵直接觸發(fā)菜單項(xiàng)的動(dòng)作 |
JMenuItem | void addActionListener(ActionListener l) | 添加菜單被點(diǎn)擊的監(jiān)聽器 |
JMenuItem | void setActionCommand(String actionCommand) | 可以再監(jiān)聽器回調(diào)時(shí)通過(guò)命令名稱區(qū)別是哪個(gè)菜單項(xiàng)觸發(fā)的動(dòng)作。 |
JMenu | JMenuItem add(JMenuItem menuItem) | 添加子菜單到JMenu中 |
JMenu | void addSeparator() | 添加一個(gè)子菜單分割線 |
class JMenuBarUse{ public JMenuBarUse() { JFrame jFrame = new JFrame(); JPanel jPanel = new JPanel(); // 創(chuàng)建一個(gè)菜單欄 JMenuBar jMenuBar = new JMenuBar(); // 創(chuàng)建一級(jí)菜單 JMenu fileMenu = new JMenu(“文件”); JMenu editMenu = new JMenu(“編輯”); // 將一級(jí)菜單添加到菜單欄 jMenuBar.add(fileMenu); jMenuBar.add(editMenu); // 創(chuàng)建文件菜單的子菜單 JMenuItem openMenuItem = new JMenuItem(“打開”); JMenuItem newMenuItem = new JMenuItem(“新建”); fileMenu.add(newMenuItem); fileMenu.add(openMenuItem); jPanel.add(jMenuBar); // 省略公共代碼 }}
JToolBar,工具欄。JToolBar 提供了一個(gè)用來(lái)顯示常用控件的容器組件。對(duì)于大多數(shù)的外觀,用戶可以將工具欄拖到其父容器四“邊”中的一邊,并支持在單獨(dú)的窗口中浮動(dòng)顯示。為了正確執(zhí)行拖動(dòng),建議將 JToolBar 實(shí)例添加到容器四“邊”中的一邊(其中容器的布局管理器為 BorderLayout),并且不在其他四“邊”中添加任何子級(jí)。構(gòu)造方法和常用方法如下:
方法 | 功能 |
JToolBar(String name, int orientation) | name: 工具欄名稱,懸浮顯示時(shí)為懸浮窗口的標(biāo)題。orientation: 工具欄方向,默認(rèn)水平 |
Component add(Component comp) | 添加 工具組件 到 工具欄 |
void addSeparator(Dimension size) | 添加 分隔符組件 到 工具欄 |
Component getComponentAtIndex(int index) | 獲取工具欄中指定位置的組件(包括分隔符) |
void setFloatable(boolean b) | 設(shè)置工具欄是否可拖動(dòng) |
void setOrientation(int o) | 設(shè)置工具欄方向,值為 SwingConstants.HORIZONTAL 或 SwingConstants.VERTICAL |
void setMargin(Insets m) | 設(shè)置工具欄邊緣和其內(nèi)部工具組件之間的邊距(內(nèi)邊距) |
void setBorderPainted(boolean b) | 是否需要繪制邊框 |
class JToolBarUse{ public JToolBarUse() { JFrame jFrame = new JFrame(); JPanel jPanel = new JPanel(); // 創(chuàng)建一個(gè)工具欄 JToolBar jToolBar = new JToolBar(“測(cè)試工具欄”); JButton jButton = new JButton(“按鈕”); jToolBar.add(jButton); jPanel.add(jToolBar); // 省略公共代碼 }}
5、事件
5.1、鼠標(biāo)監(jiān)聽事件
class MouseListenerUse { public MouseListenerUse() { JFrame jFrame = new JFrame(“鼠標(biāo)監(jiān)聽”); JPanel jPanel = new JPanel(); /** * 鼠標(biāo)監(jiān)聽器 */ jPanel.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { System.out.println(“鼠標(biāo)進(jìn)入組件區(qū)域”); } @Override public void mouseExited(MouseEvent e) { System.out.println(“鼠標(biāo)離開組建區(qū)域”); } @Override public void mousePressed(MouseEvent e) { // 獲取按下的坐標(biāo)(相對(duì)于組件) System.out.println(“相對(duì)組件” + e.getPoint() + “,橫坐標(biāo):” + e.getX() + “, 縱坐標(biāo):” + e.getY()); // 獲取按下的坐標(biāo)(相對(duì)于屏幕) System.out.println(“相對(duì)屏幕” + e.getLocationOnScreen() + “,橫坐標(biāo):” + e.getXOnScreen() + “, 縱坐標(biāo):” + e.getYOnScreen()); } @Override public void mouseReleased(MouseEvent e) { System.out.println(“鼠標(biāo)釋放”); } @Override public void mouseClicked(MouseEvent e) { // 鼠標(biāo)在組件區(qū)域內(nèi)按下并釋放(中間沒(méi)有移動(dòng)光標(biāo))才識(shí)別為被點(diǎn)擊 System.out.println(“鼠標(biāo)點(diǎn)擊”); } }); /** * 鼠標(biāo)移動(dòng)/拖動(dòng)監(jiān)聽器 */ jPanel.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent e) { // 鼠標(biāo)保持按下狀態(tài)移動(dòng)即為拖動(dòng) System.out.println(“鼠標(biāo)拖動(dòng)”); } @Override public void mouseMoved(MouseEvent e) { System.out.println(“鼠標(biāo)移動(dòng)”); } }); /** * 鼠標(biāo)滾輪監(jiān)聽器 */ jPanel.addMouseWheelListener(new MouseWheelListener() { @Override public void mouseWheelMoved(MouseWheelEvent e) { // e.getWheelRotation() 為滾輪滾動(dòng)多少的度量 System.out.println(“mouseWheelMoved: ” + e.getWheelRotation()); } }); // 省略公共代碼 }}
5.2、鍵盤監(jiān)聽事件
組件監(jiān)聽鍵盤的按鍵,該組件必須要獲取到焦點(diǎn)。
如果一個(gè)窗口內(nèi)沒(méi)有可獲取焦點(diǎn)的組件,一般打開窗口后焦點(diǎn)為窗口所有,可以把鍵盤監(jiān)聽器設(shè)置到窗口(JFrame)身上。
如果窗口內(nèi)還有其他組件可獲取焦點(diǎn)(例如按鈕、文本框),窗口打開后焦點(diǎn)會(huì)被內(nèi)部組件獲得,如果想要在窗口打開期間都能監(jiān)聽鍵盤按鍵,可以為所有可獲得焦點(diǎn)的組件都設(shè)置一個(gè)鍵盤監(jiān)聽器。
class KeyListenerUse{ public KeyListenerUse() { JFrame jFrame = new JFrame(“鍵盤監(jiān)聽”); jFrame.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { // 獲取鍵值,和 KeyEvent.VK_XXXX 常量比較確定所按下的按鍵 System.out.println(“按下: ” + e.getKeyCode() + “,鍵值為:” + e.getKeyCode()); } @Override public void keyTyped(KeyEvent e) { // e.getKeyChar() 獲取鍵入的字符 System.out.println(“鍵入: ” + e.getKeyChar()); } @Override public void keyReleased(KeyEvent e) { System.out.println(“釋放: ” + e.getKeyCode()); } }); jFrame.setVisible(true); }}
5.3、窗口監(jiān)聽事件
窗口監(jiān)聽器只有窗口類組件支持,例如 JFrame、JDialog。目前經(jīng)過(guò)測(cè)試,使用最多的莫過(guò)于窗口關(guān)閉和窗口激活。
class WindowListenerUse{ public WindowListenerUse() { JFrame jFrame = new JFrame(“窗口監(jiān)聽”); jFrame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.out.println(“窗口被關(guān)閉了”); } @Override public void windowActivated(WindowEvent e) { System.out.println(“窗口被激活了”); } }); jFrame.setVisible(true); }}
- 1、Java GUI 概述
- 2、容器
- 2、1 窗口
- 2、2 彈窗和對(duì)話框
- 對(duì)話框
- 自定義彈窗
- 2、3 面板
- 普通面板
- 滾動(dòng)面板
- 分隔面板
- 選項(xiàng)卡面板
- 3、布局
- 3.1、流式布局
- 3.2、網(wǎng)格布局
- 3.3、邊框布局
- 4、組件
- 4.1、基本組件
- 標(biāo)簽
- 按鈕
- 列表
- 文本框
- 進(jìn)度條和滑塊
- 4.2、復(fù)雜組件
- 文件和顏色選擇器
- 菜單欄和工具欄
- 5、事件
- 5.1、鼠標(biāo)監(jiān)聽事件
- 5.2、鍵盤監(jiān)聽事件
- 5.3、窗口監(jiān)聽事件
本文作者: 靜守己心、笑淡浮華
出處: https://www.cnblogs.com/mmgmj/p/16397070.html