Java開發筆記(一百三十)Swing的選擇框

来源:https://www.cnblogs.com/pinlantu/archive/2019/07/29/11266839.html
-Advertisement-
Play Games

不管是AWT還是Swing,都把選擇框分成兩類:覆選框和單選按鈕,這兩類控制項無論是外觀上還是功能上均有顯著差異。例如,在外觀方面,覆選框是在方框內打勾,而單選按鈕是在圓圈內畫圓點;在功能方面,覆選框允許多選,而同組的單選按鈕只能選擇其中一個。然而AWT的覆選框和單選按鈕統統採用Checkbox類型, ...


不管是AWT還是Swing,都把選擇框分成兩類:覆選框和單選按鈕,這兩類控制項無論是外觀上還是功能上均有顯著差異。例如,在外觀方面,覆選框是在方框內打勾,而單選按鈕是在圓圈內畫圓點;在功能方面,覆選框允許多選,而同組的單選按鈕只能選擇其中一個。然而AWT的覆選框和單選按鈕統統採用Checkbox類型,區別之處在於是否加入了單選組CheckboxGroup。這不可避免又帶來困惑,同樣是Checkbox類型,代碼該如何區分某個選擇框到底是覆選框還是單選按鈕?顯然AWT的控制項設計很不合理,非常容易引起混淆,為此Swing乾脆將它倆徹底分開,各自分配對應的控制項類型,從此井水不犯河水,大家才能相安無事。
Swing給覆選框起的名字叫JCheckBox,該控制項與AWT的Checkbox用法相似,但在細節上存在下列差異:
1、對於JCheckBox來說,setLabel方法已經廢棄,改為使用統一的setText方法來設置文本。同時獲取控制項文本的getLabel方法也改成了getText方法。
2、getState方法被直接取消了,JCheckBox改為調用isSelected方法判斷當前覆選框是否選中。同時設置選中狀態的setState方法也改成了setSelected方法。
下麵是利用JCheckBox點菜的代碼例子:

		JPanel panelTop = new JPanel(); // 創建頂部面板
		JCheckBox ck1 = new JCheckBox("麻婆豆腐"); // 創建一個覆選框
		JCheckBox ck3 = new JCheckBox("清蒸桂花魚"); // 創建一個覆選框
		JCheckBox ck2 = new JCheckBox("香辣小龍蝦"); // 創建一個覆選框
		panelTop.add(ck1); // 在頂部面板上添加覆選框
		panelTop.add(ck2); // 在頂部面板上添加覆選框
		panelTop.add(ck3); // 在頂部面板上添加覆選框
		frame.add(panelTop, BorderLayout.NORTH); // 把頂部面板添加到視窗的北邊(上方)
		JCheckBox[] boxArray = new JCheckBox[]{ck1, ck2, ck3}; // 構建覆選框數組
		ck1.addItemListener(new ItemListener() { // 給覆選框添加一個點擊監聽器
			public void itemStateChanged(ItemEvent e) { // 覆選框的狀態發生變化
				// getStateChange方法用於獲取覆選框的當前狀態。1為勾選,0為取消勾選
				labelCenter.setText(String.format("您%s了%s",
						(e.getStateChange() == 1 ? "點" : "取消"), ck1.getText()));
				labelBottom.setText("當前已點菜餚包括:" + getCheckedItem(boxArray));
			}
		});
		ck2.addItemListener(new ItemListener() { // 給覆選框添加一個點擊監聽器
			public void itemStateChanged(ItemEvent e) { // 覆選框的狀態發生變化
				// getStateChange方法用於獲取覆選框的當前狀態。1為勾選,0為取消勾選
				labelCenter.setText(String.format("您%s了%s",
						(e.getStateChange() == 1 ? "點" : "取消"), ck2.getText()));
				labelBottom.setText("當前已點菜餚包括:" + getCheckedItem(boxArray));
			}
		});
		ck3.addItemListener(new ItemListener() { // 給覆選框添加一個點擊監聽器
			public void itemStateChanged(ItemEvent e) { // 覆選框的狀態發生變化
				// getStateChange方法用於獲取覆選框的當前狀態。1為勾選,0為取消勾選
				labelCenter.setText(String.format("您%s了%s",
						(e.getStateChange() == 1 ? "點" : "取消"), ck3.getText()));
				labelBottom.setText("當前已點菜餚包括:" + getCheckedItem(boxArray));
			}
		});

 

以上代碼出現的getCheckedItem方法用來獲取已經選定的菜單,該方法的定義代碼示例如下:

	// 獲取已經選定的菜單
	private static String getCheckedItem(JCheckBox[] boxArray) {
		String itemDesc = "";
		for (JCheckBox box : boxArray) { // 遍歷覆選框數組
			if (box.isSelected() == true) { // 覆選框被選中了
				if (itemDesc.length() > 0) {
					itemDesc = itemDesc + "、";
				}
				itemDesc = itemDesc + box.getText(); // 菜單添加選定的菜餚
			}
		}
		return itemDesc;
	}

 

運行上述的覆選框測試代碼,彈出視窗的初始界面如下圖所示。


從左往右依次勾選三個覆選框,每次勾選後的界面效果分別如下列三張圖片所示。


至於單選按鈕,Swing給它分配了專門的控制項類型名叫JRadioButton,該控制項的自身方法類似於JCheckBox,一樣引入了setText、getText、isSelected、setSelected等新方法替換AWT的舊方法。並且Swing給JRadioButton找了個按鈕小組搭檔,名叫ButtonGroup,只要多次調用小組對象的add方法,就能將若幹個單選按鈕加到同一小組。下麵是與ButtonGroup有關的調用代碼:

		ButtonGroup group = new ButtonGroup(); // 創建一個按鈕小組
		group.add(rb1); // 把單選按鈕1加入到按鈕小組
		group.add(rb2); // 把單選按鈕2加入到按鈕小組
		group.add(rb3); // 把單選按鈕3加入到按鈕小組

 

接著把JRadioButton與ButtonGroup整合在一起,打算實現簡單的點餐功能,完整的調用代碼如下所示:

		JPanel panelTop = new JPanel(); // 創建頂部面板
		// 創建單選按鈕,並且預設未選中
		JRadioButton rb1 = new JRadioButton("魚香肉絲飯", false);
		// 創建單選按鈕,並且預設已選中
		JRadioButton rb2 = new JRadioButton("香菇滑雞飯", true);
		// 創建單選按鈕,並且預設未選中
		JRadioButton rb3 = new JRadioButton("黑椒牛排飯", false);
		panelTop.add(rb1); // 在頂部面板上添加單選按鈕
		panelTop.add(rb2); // 在頂部面板上添加單選按鈕
		panelTop.add(rb3); // 在頂部面板上添加單選按鈕
		frame.add(panelTop, BorderLayout.NORTH); // 把頂部面板添加到視窗的北邊(上方)
		ButtonGroup group = new ButtonGroup(); // 創建一個按鈕小組
		group.add(rb1); // 把單選按鈕1加入到按鈕小組
		group.add(rb2); // 把單選按鈕2加入到按鈕小組
		group.add(rb3); // 把單選按鈕3加入到按鈕小組
		rb1.addItemListener(new ItemListener() { // 給單選按鈕添加一個點擊監聽器
			public void itemStateChanged(ItemEvent e) { // 單選按鈕被選中
				label.setText("您點了" + rb1.getText()); // 在標簽上顯示當前選中的單選按鈕文本
			}
		});
		rb2.addItemListener(new ItemListener() { // 給單選按鈕添加一個點擊監聽器
			public void itemStateChanged(ItemEvent e) { // 單選按鈕被選中
				label.setText("您點了" + rb2.getText()); // 在標簽上顯示當前選中的單選按鈕文本
			}
		});
		rb3.addItemListener(new ItemListener() { // 給單選按鈕添加一個點擊監聽器
			public void itemStateChanged(ItemEvent e) { // 單選按鈕被選中
				label.setText("您點了" + rb3.getText()); // 在標簽上顯示當前選中的單選按鈕文本
			}
		});

 

運行上面的單選按鈕測試代碼,彈出視窗的初始界面如下圖所示。

然後從左往右依次單擊三個按鈕,每次單擊後的界面效果分別如下列三張圖片所示。

 



更多Java技術文章參見《Java開發筆記(序)章節目錄


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在前面的過程中,我們創建了4個project: "服務發現" 我們使用Eureka 作為服務發現組件,學習了 ,`Eureka Client`的使用。 Eureka Server 1. 加依賴 2. 加註解 3. 改配置 使用Sprint Boot 項目三部曲,我們可以快速添加一個新組件,並正常使用 ...
  • 1.引用的概念 2.可變類型和不可變類型 3.哈希 ...
  • From: https://blog.csdn.net/luanlouis/article/details/40043991 Step 1.根據JVM記憶體配置要求,為JVM申請特定大小的記憶體空間 JVM啟動時按照其配置要求,申請一塊記憶體,並根據JVM規範和實現將記憶體劃分為幾個區域。 所有的類的定義信 ...
  • LinkedList是用鏈表結構存儲數據的,比較適合數據的動態插入和刪除,隨機訪問和遍歷速度比較慢,還提供了List介面i中沒有定義的方法,專門用於操作表頭和表尾的元素,所以可以當作堆棧、隊列和雙向隊列來使用。LInkedList持有頭節點和尾節點的引用,有兩個構造器,一個是無參構造器,另一個是傳入 ...
  • 題目: " 10056. 「一本通 2.3 練習 5」The XOR longest Path" 解析: 做完 " 10051" 後就不是很難了 繼續利用異或的性質有$dis(u,v) = dis(1,u)\oplus dis(1,v)$ 把邊權放到點上,然後字典樹求最大異或值 代碼 cpp inc ...
  • 對於python多進程的包multiprocessing作了一個詳細的介紹。 ...
  • 通俗的講,可修改可以理解為可以在數據所在記憶體地址直接修改,而不可修改則意味著一旦修改便是創建新的數據對象,而不是在原來的對象記憶體地址修改1,Mutuable object [sourcecode language='python' ] List, dict, setL = [1,2,3]L.appe... ...
  • T1 遠征 題目 【題目描述】 寒楓將軍將要帶領他的部隊去聖雪山消滅那裡的冰龍。部隊分成了若幹個小隊,屬於同一個小隊的人兵種相同。 寒楓將軍有著傑出的指揮能力,在戰鬥的時候,寒楓將軍能夠讓所有相同兵種的人互相配合,使t個相同兵種的人發揮出t2的戰鬥力; 寒楓將軍還能讓不同兵種的人互相配合,使整個部隊 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...