java圖形用戶界面之列表框

来源:http://www.cnblogs.com/shiyiaccn/archive/2016/10/19/5978789.html
-Advertisement-
Play Games

JList想添加元素,可以執行將所有元素在JList初始化時加入的靜態操作,也可以利用“列表模型”DefaultListModel處理所有列表修改細節的動態操作。 ...


      列表框通過Swing組件JList產生,其總是在屏幕上占據固定行數的空間。如果要得到列表框中被選中的元素,只需調用getSelectedValuesList(),它可以產生一個字元串數組,內容為被選中的元素名稱。JList組件允許多重選擇;如果按住Ctrl鍵,可以選中所有點擊的元素;如果選中一個元素,按住Shift鍵並單擊另一個元素,那麼這兩個元素之間的所有元素都被選中;要從選中的元素中去掉一個,按住Ctrl鍵單擊該元素即可。

      初始化列表框後,接著便是向列表框添加和修改內容。分為靜態操作和動態操作。

1、靜態操作

      靜態操作便是將所有元素同時添加到JList中,添加後不能修改,不能刪除,即在程式執行過程中不能操作列表框。

E.g.

package test;

import javax.swing.*;
import java.awt.*;
import static net.mindview.util.SwingConsole.*;

public class ListTest1 extends JFrame{
    private String[] str = {"Monday","Tuesday","Wednesday","Thursday","Friday","Staturday","Sunday"};
    private JList list;public ListTest1()
    {
list = new JList(str);
setLayout(
new FlowLayout()); add(list); } public static void main(String[] args) { run(new ListTest1(),200,100); } }

如上例,只要在初始化JList時將所有元素添加進去即可。

執行結果:列表框不可以被操作。

2、動態操作

      通過查看JList的方法,可以發現JList不負責列表框的動態操作,所有的動態操作的細節可以在“列表模型”即DefaultListModel中完成,只需將該列表模型加入JList即可。

            DefaultListModel listmodel = new DefaultListModel();

            listmodel.addElement(element1);//添加元素

            listmodel.clear();//清除全部元素

            listmodel.remove(int index);//清除指定位置的元素

E.g.

package test;

import java.awt.*;import java.awt.event.*;import static net.mindview.util.SwingConsole.*;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class ListTest extends JFrame{
    private String[] str = {"Monday","Tuesday","Wednesday","Thursday","Friday","Staturday","Sunday"};
    private JButton button1 = new JButton("Add Item"),
                    button2 = new JButton("Clear Item");
    private JTextArea text = new JTextArea(str.length,20);
    private DefaultListModel listmodel = new DefaultListModel();
    private JList list = new JList(listmodel);
//將列表模型加入JList,列表模型負責完成動態操作,JList負責創建列表以及許多其它工作(如多重選擇)。
private int count = 0; private boolean flag = false; public ListTest() { text.setEditable(false);//只是用來顯示,不能編輯 for(int i = 0;i<4;i++) { listmodel.addElement(str[count++]); } button1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if(count<str.length) { listmodel.addElement(str[count++]); }else { button1.setEnabled(flag); flag = true; } } }); button2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if(count<str.length) { count = 0;//列表重新開始添加元素 listmodel.clear();//列表元素清除 text.setText(null); }else { count = 0; listmodel.clear(); text.setText(null); button1.setEnabled(flag);//啟動按鈕 } } }); list.addListSelectionListener(new ListSelectionListener(){ @SuppressWarnings("deprecation") public void valueChanged(ListSelectionEvent e) { if(e.getValueIsAdjusting()) return; //如果檢測到事件在更改,則返回true,後面語句不執行;當更改結束後,則返回false,執行後面語句。 for(Object item : list.getSelectedValuesList()) { text.append(item + "\n");//List型對象轉換為Object } //list調用getSelectedValuesList()方法,產生一個字元串數組,內容為被選中的元素名稱 } }); setLayout(new FlowLayout()); Border border = BorderFactory.createMatteBorder(1, 1, 2, 2, Color.RED);//添加邊框 list.setBorder(border);//設置邊框 text.setBorder(border); add(button1); add(button2); add(new JScrollPane(text)); add(list); } public static void main(String[] args) { run(new ListTest(),250,375); } }

執行結果:

      在上面的程式中,對JList的處理過程中用到了JList所支持的事件ListSelectionEvent的getValueIsAdjusting()方法以及JList的getSelectedValuesList()方法,需要註意這兩個方法的用法。

(1)Boolean javax.swing.event.ListSelectionEvent.getValueIsAdjusting()

      返回此事件是否是仍然在更改的多個不同事件之一,如果此事件是仍然在更改的多個不同事件之一,則返回 true。

      例如,對於選擇被更新以響應一個用戶的拖動的事件,那麼在拖動開始時,此屬性被設置為 true;在拖動結束時被設置為 false。在拖動期間,監聽器接收 valueIsAdjusting 屬性設置為 true 的事件。在拖動的最後,當更改終止時,監聽器接收一個值設置為 false 的事件。

     如果將JList對象的註冊程式去掉更新檢測的語句:

if(e.getValueIsAdjusting())
    return;

輸出為:

      可見,沒有了更新檢測,選中列表框元素後,有重覆輸出。

 

(2)List javax.swing.JList.getSelectedValuesList()

      JList對象調用getSelectedValuesList()方法,產生一個字元串數組,內容為被選中的元素名稱。

3、JList滾動條

      JList本沒有對滾動提供直接的支持,我們只要將JList包裝進JScrollPane,它將自動幫助處理所有細節。

      總結:JList想添加元素,可以執行將所有元素在JList初始化時加入的靜態操作,也可以利用“列表模型”DefaultListModel處理所有列表修改細節的動態操作。

註意:在JList元素選擇的過程中可能會用到更新檢測,從而確保程式的穩定性。


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

-Advertisement-
Play Games
更多相關文章
  • 一、基本選擇器: ID選擇器:$("#id名稱") 例如:$("#div1").css("width","100px"); CLASS選擇器:$(".id名稱") 併列$("#id名稱,#id名稱") 後代$("#id名稱 名稱")二.過濾選擇器 第一個:$(".id名稱:first") 最後一個: ...
  • 《深入理解Java虛擬機》第二三章摘要 Java記憶體區域與記憶體溢出 Java虛擬機中的記憶體分配圖: 各個區域的特性總結如下表: 補充說明: 當多線程情形下,可能多個線程要在堆上分配記憶體,那麼可能出現記憶體分配的同步問題,解決方案有兩個,一個就是同步記憶體分配動作;另一個就是採用TLAB,即在Java堆中 ...
  • 英文文檔: Return a Boolean value, i.e. one of True or False. x is converted using the standard truth testing procedure. If x is false or omitted, this ret ...
  • 一.在java中提供的一些修飾符,這些修飾符可以修飾類、變數和方法,在java中常見的修飾符有:abstract(抽象的)、static(靜態的)、public(公共的)、protected(受保護的)、private(私有的)、synchronized(同步的)、native(本地的)、trans ...
  • 首先,說明一下多線程的應用場景:當python處理多個任務時,這些任務本質是非同步的,需要有多個併發事務,各個事務的運行順序可以是不確定的、隨機的、不可預測的。計算密集型的任務可以順序執行分隔成的多個子任務,也可以用多線程的方式處理。但I/O密集型的任務就不好以單線程方式處理了,如果不用多線程,只能用 ...
  • 在現實生活中,記錄日誌非常重要。銀行轉賬時會有轉賬記錄;飛機飛行過程中,會有黑盒子(飛行數據記錄器)記錄飛行過程中的一切。如果有出現什麼問題,人們可以通過日誌數據來搞清楚到底發生了什麼。對於系統開發、調試以及運行,記錄日誌都是同樣的重要。如果沒有日誌記錄,程式崩潰時你幾乎就沒辦法弄明白到底發生了什麼 ...
  • 內置對象:不需要預先聲明就可以在腳本代碼和表達式中隨意使用,有以下特點 1.由JSP規範提供,不用編寫者實例化 2.提供Web容器實現和管理 3.所有JSP頁面均可用 4.只有在腳本元素的表達式或者代碼中才可使用(<%=使用內置對象%>或<%使用內置對象%>) 輸入輸出對象:request,resp ...
  • JavaWeb_day01 HTTP協議 HTTP(HyperText Transfer Protocol)超文本傳輸協議,是TCP/IP的應用層協議,用於定義WEB瀏覽器與WEB伺服器之間交換數據的過程以及數據本身的格式. Http協議版本號 : HTTP/1.0 HTTP/1.1 交互步驟 : ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...