1. 程式人生 > >Java學習筆記(第10天)

Java學習筆記(第10天)

表格是最常用的資料統計元件之一,是由多行和多列組成的二維表形式,在Swing中的JTable類實現表格。

javax.swing.JTable類建立的物件是一個表格,可以使用以下兩種方式建立表格。(1)使用列名陣列的資料陣列建立表格,使用JTable類的構造方法可以根據指定的列名陣列和資料陣列建立表格,JTable(Object[][] rowData,Object[] columnNames)。(2)使用標題陣列和資料陣列建立表格,在JTable類中還提供了利用表格列名變數和表格資料向量建立表格的構造方法:JTable(Vector rowData,Vector columnNames)。

表格建立完成後,預設情況下通過雙擊表格中的單元格就可以對其進行編輯,如果不需要提供該功能,可以通過重寫JTable類的isCellEditable(int row,int column)方法來實現。預設情況下該方法會返回boolean型值true,表示單元格可編輯,如果返回false則表示不可編輯。表格列的移動可以通過javax.swing.table.JTableHeader類setRecorderingAllowed(boolean recorderingAllowed)方法來實現,該方法設定表格是否支援重新排列功能,設定為false表示不支援重新排列功能,設定為true表示支援重新排列功能。通過JTable類getTableHeader()方法可以獲得JTableHeader類的例項。

預設情況下單元格的內容靠左側顯示,如果需要單元格中的內容居中顯示,可以通過重新JTable類的getDefaultRenderer(Class<?> columnClass)方法實現。DefaultTableCellRenderer類的setHorizontalAlignment(int alignment)方法的常用欄位如表所示:

用於設定表格單元格水平對齊方式的欄位
欄位說明
DefaultTableCellRenderer.LEFT表格單元格內容左對齊顯示
DefaultTableCellRenderer.CENTER表格單元格內容居中顯示
DefaultTableCellRenderer.RIGHT表格單元格內容右對齊顯示
JTable類中用來定義表格的常用方法
方法說明
setRowHeight(int rowHeight)設定表格的行高,預設為16畫素
setRowSelectionAllowed(boolean sa)設定是否允許選中表格行,預設為允許選中,設為false表示不允許選中
setSelectMode(int sum)設定表格行的選擇模式
setSelectionBackground(Color bc)設定表格選中行的背景色
setSelectionForeground(Color fc)設定表格選中行的前景色(通常情況下為文字的顏色)
setAutoResizeMode(int mode)設定表格自動調整模式

javax.swing.ListSelectionModel介面中用於設定選擇模式的欄位:

ListSelectionModel介面中用於設定選擇模式的欄位
欄位說明
SINGLE_SELECTION0:只允許選擇一行
SINGLE_INTERVAL_SELECTION1:允許連續選擇多行
MULTIPLE_INTERVAL_SELECTION2:可以隨意選擇多行

所謂表格的自自動調整模式,就是在調整表格某一列的寬度時,表格採用何種方式保持其總寬度不變。

JTable類中用來設定自動調整模式的欄位
欄位常量值說明
AUTO_RESIZE_OFF0關閉自動調整功能,使用水平滾動條時的必要設定
AUTO_RESIZE_NEXT_COLUMN1只調整其下一列的寬度
AUTO_RESIZE_SUBSEQUENT_COLUMNS2按比例調整其後所有列的寬度,為預設設定
AUTO_RESIZE_LAST_COLUMN3只調整最後一列的寬度
AUTO_RESIZE_ALL_COLUMNS4按比例調整表格所有列的寬度

當調整表格所在窗體的寬度時,如果關閉了表格的自動調整功能,表格的總寬度仍保持不變;如果開啟了表格的自動調整功能,表格按比例調整所有列的寬度至適合窗體的寬度。

用來建立表格的JTable類並不複雜儲存表格中的資料,而是由表格模型負責儲存,當利用JTable類直接建立表格時,只是將資料封裝到了預設的表格模型中。

介面javax.swing.table.TableModel定義了一個表格模型,該模型提供了操作表格的方法。抽象類javax.swing.table.AbstractTableModel實現了TableModel介面的大部分方法,只有三個方法沒有實現:public int getRowCount();public int getColumnCount();public Object getValueAt(int rowIndex,int columnIndex)。

通過整合AbstractTableModel類實現上面3個方法可以建立自己的表格模型類。javax.swing.table.DefaultTableModel類是由Swing提供的繼承了AbstractTableModel類,並實現了上面3個抽象方法的表格模型類。

DefaultTableModel類提供的常用構造方法
構造方法說明
DefaultTableModel()建立一個零行零列的表格模型
DefaultTableModel(int rowCount,int columnCount)建立一個rowCount行,columnCount列的表格模型
DefaultTableMode(Object[][] data,Object[] columnNames)按照陣列中指定的資料和列名建立一個表格模型
DefaultTableModel(Vector data,Vector columnNames)按照向量中指定的資料和列名建立一個表格模型

表格模型建立完成之後,通過JTable類的構造方法JTable(TableModel dm)建立表格,並把表格模型設定為該構造方法的引數,就實現了利用表格模型建立表格。

通過JTable類的setRowSorter(RowSorter<? extends TableModel>sorter)方法可以為表格設定排序器。javax.swing.table.TableRowSorter類是Swing提供的一個排序器類,可以為表格設定排序器。為表格排序器設定表格模型可以通過兩種方法來實現:一種方法是通過TableRowSorter類的構造方法TableRowSorter(TableModel model)建立排序器;另一種方法是通過TableRowSorter類的setModel(TableModel model)方法為排序器設定表格模型。

向表格模型中新增新的資料行有兩種情況:一種情況是新增到表格模型的尾部,另一種情況是插入到表格模型的指定索引位置。

(1)新增到表格模型的尾部,可以通過addRow()方法完成,它的過載方法如下:addRow(Object[] rowData):將由陣列封裝的資料新增到表格模型的尾部;addRow(Vector rowData):將由向量封裝的資料新增到表格模型的尾部。

(2)新增到表格模型的指定位置,可以通過insertRow()方法完成,它的過載方法為:insertRow(int row,Object[] rowData):將由陣列封裝的資料新增到表格模型的指定索引位置;insertRow(int row,Vector rowData):將由向量封裝的資料新增到表格模型的指定索引位置。

表格模型的行索引和列索引都是從零開始的。

如果需要修改表格模型中某一單元格的資料,可以通過DefaultTableModel類的setValueAt(Object aValue,int row,int column)方法來完成,其中aValue為單元格修改後的值,row為單元格所在行的索引,column為單元格所在列的索引;可以通過DefaultTableModel類的getValue(int row,int column)方法獲得表格模型中指定單元格的值,返回值型別為Object。

如果需要刪除表格模型中的某一行資料,可以通過DefaultTableModel類的removeRow(int row)來完成。在刪除表格模型中的資料時,每刪除一行,其後所有行的索引值將相應減1,所以當連續刪除多行時,需要注意對刪除行的索引進行處理。

在處理與表格列有關的資訊時,均需要在表格總列數的基礎上減去固定列的數量。

為表格模型新增表格模型事件監聽器,進行事件處理操作:void addTableModelListener(TableModelListener l);public void tableChanged(TableModelEvent e):TableModelEvent類提供的方法可以對錶格事件進行處理。

TableModelEvent類的方法
方法說明
getColumn()返回表格模型中事件的列
getFirstRow()返回表格模型中第一個被更改的行
getLastRow()返回表格模型中最後一個被更改的行
getType()返回事件型別,該型別為INSERT、UPDATE和DELETE之一

TableModelEvent類的常用欄位
字元說明
TableModelEvent.DELETE表示對錶格模型中的行或列進行了刪除操作
TableModelEvent.INSERT表示對錶格模型中添加了新行或新列
TableModelEvent.UPDATE表示對錶格模型中的現有資料進行了修改操作

除了資料模型發生變化會觸發表格模型事件監聽器以外,還可以通過AbstractTableModel類提供的方法來觸發表格模型事件監聽器。

觸發表格模型事件監聽器的常用方法
方法說明
firstTableCellUpdated(int row,int column)通知所有監聽器,已更新[row,column]處的單元格值
firstTableRowsDeleted(int firstRow,int lastRow)通知所有監聽器,已刪除範圍在[firstRow,lastRow]的行
firstTableRowsInserted(int firstRow,int lastRow)通知所有監聽器,已插入範圍在[firstRow,lastRow]的行
firstTableRowsUpdateed(int firstRow,int lastRow)通知所有監聽器,已更新範圍在[firstRow,lastRow]的行

當使用AbstractTableModel類的方法觸發表格模型事件監聽器時,並不是真的對錶格模型進行了新增、修改和刪除等操作,只是通過這些方法來通知表格模型的所有監聽器,並對事件進行響應處理,在事件響應程式碼中可對事件型別進行判斷,使個事件型別分別實現不同的功能。

使用Swing中的javax.swing.JTree類可以建立樹。

JTree類的常用構造方法
構造方法說明
JTree()建立一個預設的樹
JTree(TreeNode root)根據指定根結點建立樹
JTree(TreeModel newModel)根據指定樹模型建立樹

樹元件不能顯示滾動條,一般都與滾動面板一起使用。

javax.swing.tree.DefaultMutableTreeNode類實現了TreeNode介面,用來建立樹的節點。一個樹只能有一個父結點,可以有0個或多個子節點,預設情況下每個節點都允許有子節點,如果某個節點不需要有子節點,可以將其設定為不允許有子節點。

DefaultMutableTreeNode類的常用構造方法
構造方法說明
DefaultMutableTreeNode()建立一個預設的節點,預設情況下允許有子節點
DefaultMultableTreeNode(Object userObject)建立一個具有指定標籤的節點
DefaultMutableTreeNode(Object userObject,boolean allowsChildren)建立一個具有指定標籤的節點,並且指定是否允許有子節點

利用DefaultMultableTreeNode類的add(MutableTreeNode newChild)方法可以為該結點新增子節點,該節點稱為父結點,沒有父結點的節點稱為根節點。可以通過根節點利用JTree類的構造方法JTree(TreeNode root)直接建立樹。

還可以使用JTree類和樹模型建立樹,javax.swing.tree.TreeModel介面定義了一個樹模型,該模型提供了操作樹的方法。在建立樹時,可以先建立一個樹模型TreeModel,然後再把樹模型作為引數傳遞給樹的構造方法JTree(TreeModel newModel)建立樹。

javax.swing.tree.DefaultTreeModel類實現了TreeModel介面,該類僅提供瞭如下兩個構造方法,所以在利用該類建立樹模型時,必須指定樹的根節點。(1)DefaultTreeModel(TreeNode root):建立一個採用預設方式判斷節點是否為葉子結點的樹模型。(2)DefaultTreeModel(TreeNode root,boolean asksAllowsChildren):建立一個採用指定方式判斷節點是否為葉子結點的樹模型。

由DefaultTreeModel類實現的樹模型判斷節點是否為葉子結點有兩種方式:第一種方式:預設方式為如果節點不存在子節點則為葉子節點。第二種方式:根據節點是否允許有子節點進行判斷只要不允許有子節點,則該結點就是葉子結點,如果允許有子節點,則不管該節點是否是有子節點,都是葉子節點,將第二個構造方法的入口引數asksAllowsChildren設定為true表示允許有子節點,設定為false表示不允許有子節點。

通過JTree類的構造方法JTree(TreeModel newModel)建立樹,並把樹模型設定為該構造方法的引數,就實現了利用樹模型的建立樹。

1.新增樹節點:利用DefaultTreeModel類的insertNodeInto()方法。insertNodeInto(MutableTreeNode newChild,MutableTreeNode parent,int index).

2.修改樹節點:DefaultTreeModel類的nodeChanged(TreeNode node)方法用來通知樹模型某節點已經被修改,否則如果修改的是節點的使用者物件,修改資訊將不會同步到GUI介面,其中入口引數為被修改的節點物件。

3.刪除樹節點:DefaultTreeModel類的removeNodeFromParent(MutableTreeNode node)方法用來從樹模型中刪除指定節點node。樹的根節點不允許刪除。

使用JTree類建立樹時,預設情況下顯示樹的根節點,但是不顯示根節點手柄。如果希望在樹的根節點前面也顯示手柄,可以呼叫JTree類的setShowsRootHandles(boolean newValue)方法,並將入口引數設為true,這樣樹就會顯示根節點手柄。可以呼叫JTree類的setRootVisible(boolean rootVisible)方法,並將入口引數設為false.

通過javax.swing.tree.DefaultTreeCellRenderer類的物件可以修改節點圖示,通過JTree類的getCellRenderer()方法可以得到DefaulTreeCellRenderer類的物件,setLeafIcon(Icon newIcon)方法用來設定葉子節點的圖示。setClosedIcon(Icon newIcon)用來設定節點處於摺疊狀態時採用的圖示。setOpenIcon(Icon newIcon)用來設定節點處於展開狀態時採用的圖示。

建立樹時,預設情況下會在樹的節點之間繪製連線線。通過JTree類呼叫putClientProperty(Object key,Object value)方法可以設定連線線的繪製方式,此時需要將入口引數key設定為JTree.lineStyle。將入口引數value設定為None表示不繪製節點間的連線線,將入口引數value設定為Angled則表示繪製節點間的連線線。

通過JTree類呼叫putClientProperty(Object key,Object value)方法時,如果將入口引數key設定為JTree.lineStyle,將入口引數value設定為Horizontal表示繪製水平分欄線,繪製方式在僅在根節點和一級節點之間,或者是一級節點和一級節點之間。

預設情況下只有樹的根節點是展開的,其他子節點均處於摺疊狀態。可以通過DefaultMutableTreeNode類的isLeaf()方法判斷要展開的節點是否為葉子節點,如果不是葉子節點就可以通過DefaultMutableTreeNode類的getPath()方法獲得根節點到此節點的路徑,然後把路徑作為javax.swing.tree.TreePath類構造方法TreePATH(Object[] path)的入口引數建立TreePath物件,並把該物件傳遞給JTree類的expandPath(TreePath path)方法實現節點的展開操作。

樹的節點允許被選中和取消選中,通過捕獲樹節點的選擇時間可以處理相應的操作。樹的選擇模式有3種,通過javax.swing.tree.TreeSelectionModel介面的物件可以設定樹的選擇模式,通過JTree類getSelectionModel()方法可以獲得TreeSelectionModel介面的物件,然後通過TreeSelectionModel介面的setSelectionModel(int mode)方法設定選擇模式。

TreeSelectionModel介面中代表選擇模式的靜態常量
靜態常量說明
SINGLE_TREE_SELECTION1:只允許選中一個
CONTIGUOUS_TREE_SELECTION2:允許連續選中多個
DISCONTIGUOUS_TREE_SELECTION4:允許任意選中多個

當選中樹節點和取消樹節點的選中狀態時,將發出TreeSelectionEvent事件,通過實現TreeSelectionListener介面可以捕獲該事件。

TreePath類表示樹節點的路徑,即通過該類可以獲得子節點所屬的父結點,以及父結點所屬的上級節點,直到樹的根節點。

TreePaht類的常用方法
方法說明
getPath()以Object陣列的形式返回該路徑中所有節點的物件,在陣列中的順序按照從根節點到子節點的順序
getLastPathComponent()獲得路徑中最後一個節點的物件
getPatentPath()獲得路徑中除了最後一個節點的路徑
pathByAddingChild(Object child)獲得向路徑中新增指定節點後的路徑
getPathCount()獲得路徑中包含節點的數量
getPathComponent(int element)獲得路徑中指定索引位置的節點物件

當展開和摺疊樹節點時,將發出TreeExpansionEvent事件,通過實現TreeWillExpangListener介面,可以在樹節點展開和摺疊之前捕獲該事件。

Graphics類是所有圖形上下文的抽象基類,它允許在應用程式在元件、圖片物件上進行繪製。Graphics類封裝了Java支援的基本繪圖操作所需的狀態資訊。包括顏色、字型、畫筆、文字、影象等。Graphics類提供了繪圖常用的方法。可實現直線、矩形、多邊形、橢圓、圓弧等形狀和文字、圖片的繪製操作,還可以設定繪圖的顏色、字型等狀態屬性。

Graphics2D繼承Graphics類,實現了功能更加強大的繪圖操作的集合。Graphics繪圖上下文在Java語言中負責組建、影象與圖形的繪製,必須從目的地獲取Graphics物件。方法為getGraphics()。

Swing的元件基本上都是使用Graphics2D類的例項物件進行介面繪製的。所以需要把獲取的繪圖上下文物件強制型別轉換為Graphics2D型別。

使用Color類可以建立任何顏色的物件。繪圖類可以使用setColor()方法設定當前顏色。設定繪圖顏色之後,在進行繪圖或者繪製文字,都會採用該顏色作為前景色。如果想繪製其他顏色的圖形或文字,需要再次呼叫setColor()方法設定其他顏色。

在預設情況下,Graphics繪圖類使用的畫筆屬性是粗細為1畫素的正方形,而Java2D的Graphics2D類可以呼叫setStroke()方法設定筆畫的屬性。setStroke(Stroke stroke)方法必須接收一個Stroke介面的實現類作為引數,java.awt包中提供了BasicStroke類,它實現類Stroke介面,並且通過不同的構造方法建立不同筆畫屬性的物件。Java使用Font類封裝了字型的大小、樣式等屬性。該類在java.awt包中定義,其構造方法可以指定字型的名稱、大小和樣式3個屬性。設定繪圖類的字型可以使用繪圖類的setFont()方法。設定字型以後在圖形的上下文中繪製的所有文字都使用該字型,除非再次設定其他字型。

Graphics2D類提供了drawString()方法,使用該方法可以實現圖形上下文的文字繪製,從而實現繪製文字的功能。Font類的getStringBounds()方法可以獲取字串需要佔據的邊界大小。FontRenderContext類是正確測量文字所需的資訊容器。

Java可以分別使用Graphics和Graphics2D繪製圖形,Graphics類使用不同的方法實現不同圖形的繪製,如drawLine()方法用於繪製直線、drawRect()方法用於繪製矩形,drawOval()方法用於繪製橢圓等。

要繪製指定形狀的圖形,需要先建立並初始化該圖形類的物件,這些圖形類必須是Shape介面的實現類。然後使用Graphics2D類的draw()方法繪製該圖形物件或者使用fill()方法填充該圖形物件。

使用drawInage()方法將圖片資源顯示到繪圖上下文中,而且可以實現各種特效處理。drawImage()方法需要指定通知的影象觀察者。

repaint()方法將呼叫paint()方法,實現元件或畫板的重畫功能。影象的旋轉需要Graphics2D的rotate()方法,該方法將根據指定的弧度旋轉影象。使用Graphics2D類提供的shear()方法可以設定繪圖的傾斜方向,從而實現使影象傾斜的效果。

相關推薦

Java學習筆記10

表格是最常用的資料統計元件之一,是由多行和多列組成的二維表形式,在Swing中的JTable類實現表格。javax.swing.JTable類建立的物件是一個表格,可以使用以下兩種方式建立表格。(1)使用列名陣列的資料陣列建立表格,使用JTable類的構造方法可以根據指定的列

java學習筆記11

成員變數和區域性變數的區別:   作用域不同:區域性變數的作用域僅限於定義它的方法;成員變數的作用域在這個類內部都是可見的; 初始值不同:java會給成員變數一個初始值,java不會給區域性變數賦予初始值; 在同一個方法中,不允許有同名區域性變數;在不同的方法

Tensorflow學習筆記—遞迴神經網路

一、首先下載來源於 Tomas Mikolov 網站上的 PTB 資料集 http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz 二、需要的程式碼: 這裡只簡單的放了一些程式碼

Tensorflow學習筆記—卷積神經網路

     對CIFAR-10 資料集的分類是機器學習中一個公開的基準測試問題,其任務是對一組大小為32x32的RGB影象進行分類,這些影象涵蓋了10個類別: 飛機, 汽車, 鳥, 貓, 鹿, 狗, 青蛙, 馬, 船以及卡車。

Python學習筆記,文件操作、函數

input 釋放空間 打開方式 只需要 不能 解決 信息 無法查看 一個 一、文件處理   1、文件打開模式    打開文本的模式,默認添加t,需根據寫入或讀取編碼情況添加encoding參數。    r 只讀模式,默認模式,文件必須存在,不能存在則報異常。    w

java-web學習筆記五章

war 客戶 腳本元素 utf 輸出 PE 行動 包含 筆記 第五章:JSP語法 一:Servlet和JSP的區別和各自優勢?  Servlet和JSP均基於java語言,Servlet以java類的形式體現,JSP以腳本語言形式體現,兩者均需要在web

Java-Web學習筆記六章

contex res page 發送 con 結果 管理 第六章 都是 一:什麽是內置對象?  1)定義:JSP內置對象(JSP隱含對象)是指不用聲明就可以在JSP頁面的腳本和表達式中直接使用的對象。  2)特點: &ems

java-web學習筆記三章

t對象 元素 config ttr method 通過 OS 接口 實現 第三章:Servlet核心接口 1, ServletConfig對象的作用,在Servlet中如何使用? 每個Servlet擁有唯一的servletConfig對象,通過ServletConf

java-web學習筆記四章

解決方案 重寫 區別 學習 java 占用 表單 服務 安全 第四章:會話跟蹤 1,什麽是會話跟蹤技術 會話跟蹤技術是一種在客戶端和服務器端保持HTTP狀態的解決方案,是使上一次請求所傳遞的數據能夠維持狀態到下一次請求,並且辨認出是否是相同的客戶端所發送出來的。主要

Java-Web學習筆記八章

lan request 雙引號 text ava user OS 程序 Language 第八章:表達式語言 一:EL簡介 EL是一種簡單的語言,可以方便的訪問和處理應用程序數據,而無需使用JSP腳本元素或JSP表達式二:EL語法 (1)語法:${表達式

Java-Web學習筆記九章

port pac clas tle code lang tran RR req 一:自定義標簽庫(步驟)1>開發自定義標簽類(編寫一個實現SimpleTagSupport接口的java類) package book07; import java.io.IOExcep

JAVA語言 學習筆記六週

第六週:使用物件 6-1字元型別 視訊1,字元型別 視訊2,轉義字元(逃逸字元) 視訊3,包裹型別 包裹型別變數是和基礎型別一樣是資料的所有者。 陣列型別是資料的管理者。 6-2字串 視訊1 也可以用下面直接初始化。

Effective Java讀書筆記10章-併發

     第10章  併發      第66條:同步訪問共享的可變資料      第67條:避免過度同步      第68條:executor和task優先於執行緒      第69條:併發工具優先於wait和notify      第70條:執行緒安全性的文件化   

Linux Unix shell 編程指南學習筆記四部分

fcm 驗證 () only arguments line div 反饋 sed 第十六章 shell腳本介紹 此章節內容較為簡單,跳過。 第十七章 條件測試 test命令 expr命令 test 格式 test condition 或者 [

Java學習筆記第一次課

stdio.h println 標準 ant 方法參數 ann 控制 大小寫 protect 1.簡單的Java語言模板 package inclass1_1; import java.io.*;//導入包(相當於c語言的#include<stdio.h>)

Java學習筆記trim()與substring()

tro 字符串 n) substr java bsp log 執行 spa 了解到這兩個函數是因為在做OJ的題目時遇到了這樣的情況: 標註輸入為:4 abc 兩種數據用空格分隔開,但找不到只讀一個字符的方法(吃掉中間的空格) trim(): 去掉字符串首尾的空格 St

Java學習筆記二十一:類型轉換和instanceof關鍵字

方法 png true feed out 實例 strong 運算符 nbsp 基本數據類型轉換: 自動類型轉換:把大類型的數據賦值給大類型的變量(此時的大小指的是容量的範圍) 1 byte b = 12; //byte是一個字節 2 int i = b; //i

Java學習筆記二十二:打包程序

lean 技術 打包成 skip 運行 ava div com bsp 加入一個程序測試完畢,我們就可以將它打包,就可以放到服務器上運行了 找到左下角的終端 點擊 輸入命令: mvnw clean package -DskipTests=true clean:清除以

python 3.5學習筆記四章

ping 函數返回值 使用 family __next__ 什麽 san 直接 all 本章內容:   一、、裝飾器   二、生成器   三、叠代器   四、python中的內置方法   五、json & pickle 的數據序列化及反序列化   六、程序目錄結構規

python3.5學習筆記六章

原本 空白 制表符 false sdh office 元組 所有 n) 本章內容:   正則表達式詳解(re模塊) 1、不使用正則表達式來查找文本的內容   要求從一個字符串中查找電話號碼,並判斷是否匹配制定的模式,如:555-555-5555。傳統的查找方法如下: