日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JTable demo

發布時間:2025/3/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JTable demo 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

簡單講就是在沒有使用layout manager的時候用setSize,在使用了layout manager 的時候用setPreferredSize
?
并且setPreferredSize通常和setMinimumSize、setMaximumSize聯系起來使用
setSize()是你手動來設置組件的大小
Dimension 類封裝單個對象中組件的寬度和高度(精確到整數)。該類與組件的某個屬性關聯。由 Component 類和 LayoutManager 接口定義的一些方法將返回 Dimension 對象
setPreferredSize設置此組件的首選大小
一般會用setPreferredSize?

http://www.cnblogs.com/langtianya/archive/2012/10/13/2722904.html

?

// in constructor rowSM_treatments = table_histories.getSelectionModel(); rowSM_treatments.addListSelectionListener(new ListSelectionListener() {public void valueChanged(ListSelectionEvent e) {if (e.getValueIsAdjusting()) return;ListSelectionModel lsm = (ListSelectionModel)e.getSource();if (lsm.isSelectionEmpty()) {System.out.println("No rows are selected.");} else {selectedRow_treatments = lsm.getMinSelectionIndex();System.out.println("selected Row> " + selectedRow_treatments);//do more}}});

?

table.changeSelection(row, 0, false, false);

import javax.swing.JTable; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener;public class SelectionListener implements ListSelectionListener {JTable table;SelectionListener(JTable table) {this.table = table;}public void valueChanged(ListSelectionEvent e) {if (e.getSource() == table.getColumnModel().getSelectionModel() && table.getColumnSelectionAllowed()) {int firstRow = e.getFirstIndex();int lastRow = e.getLastIndex();// 事件處理... }}}

?

?intgetFirstIndex()
??????????Returns the index of the first row whose selection may have changed.
?intgetLastIndex()
??????????Returns the index of the last row whose selection may have changed.
?booleangetValueIsAdjusting()
??????????Returns whether or not this is one in a series of multiple events, where changes are still being made.
?StringtoString()
??????????Returns a String that displays and identifies this object's properties.

??

package swing.table;import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.util.Date;import javax.swing.AbstractAction; import javax.swing.DefaultListSelectionModel; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener;public class SelectionModeDemo {String[] headings = { "Name", "Customer ID", "Order #", "Status" };Object[][] data = {{ "A", new Integer(3), "0", new Date() },{ "B", new Integer(6), "4", new Date() },{ "C", new Integer(9), "9", new Date() },{ "D", new Integer(7), "1", new Date() },{ "E", new Integer(4), "1", new Date() },{ "F", new Integer(8), "2", new Date() },{ "G", new Integer(6), "1", new Date() }};JTable jtabOrders = new JTable(data, headings);SelectionModeDemo() {final JFrame jfrm = new JFrame("JTable Demo");jfrm.setLayout(new FlowLayout());jfrm.setSize(800, 600);jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JScrollPane jscrlp = new JScrollPane(jtabOrders);jfrm.add(jscrlp);jtabOrders.setPreferredScrollableViewportSize(new Dimension(420, 200));// 設置選擇模式。以下列表描述了接受的選擇模式:只能選擇一行! jtabOrders.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// 攔截Ctrl+A組合鍵,防止焦點丟失// new event create.KeyStroke ctrlA = KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK);// overwrite super class's event.jtabOrders.getInputMap().put(ctrlA, "DO_NOTHING");jtabOrders.getActionMap().put("DO_NOTHING", new AbstractAction() {private static final long serialVersionUID = 1L;@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("Do nothing");}});/*** 在JTable里被選擇的行發生變化時處理某事件的方法。 例如: 1:選擇第一行的狀態下,選擇第二行時* 2:只選擇一行的狀態下,追加選擇另外的行時*/jtabOrders.getSelectionModel().addListSelectionListener(new ListSelectionListener() {@Overridepublic void valueChanged(ListSelectionEvent e) {DefaultListSelectionModel model = (DefaultListSelectionModel) e.getSource();if (!e.getValueIsAdjusting()) {/** public boolean getValueIsAdjusting()* 一次鼠標的點擊會有兩次事件響應(按下和釋放)。* 前者的事件屬性中getValueIsAdjusting()=true,后者是false。* 因此,可以通過判斷getValueIsAdjusting()來區別鼠標按下和釋放。*/JOptionPane.showMessageDialog(jfrm, "Msg:" +model.getSelectionMode() + " "+ jtabOrders.getValueAt(jtabOrders.getSelectedRow(), 0).toString());}}});jfrm.setLocationRelativeTo(null);jfrm.setVisible(true);jtabOrders.setColumnSelectionAllowed(false);jtabOrders.setRowSelectionAllowed(true);}public static void main(String args[]) {new SelectionModeDemo();} }

?

?

?http://melodyvictor.blog.163.com/blog/static/1180061572011417315978/


?

//設置是否可以選擇此模型中的列。
??? jtabOrders.setColumnSelectionAllowed(false);
??? //設置是否可以選擇此模型中的行。
??? jtabOrders.setRowSelectionAllowed(true);

??? //設置此表是否允許同時存在行選擇和列選擇。

???? jtabOrders.setCellSelectionEnabled(true);

?

static?intMULTIPLE_INTERVAL_SELECTION
??????????selectionMode 屬性的值:一次選擇一個或多個連續的索引范圍。
static?intSINGLE_INTERVAL_SELECTION
??????????selectionMode 屬性的值:一次選擇一個連續的索引范圍。
static?intSINGLE_SELECTION
??????????selectionMode 屬性的值:一次選擇一個列表索引。

http://blog.csdn.net/youyigong/article/details/6830966

?

?

?

編寫該JTable的TableModel的String getColumnName(int columnIndex)方法
//傳進來的是列的索引值
//返回該列的列名/
/給JTable設置好TableModel后,這個方法由系統自動調用
//顯示在JTable中
public String getColumnName(int columnIndex){??
return "你想要設置的對應列的列名";
}
eg.:
public String getColumnName(int columnIndex){??
if(columnIndex == 1)
return "索引值為 1 的列的名字";????
if(columnIndex == 2)
return "索引值為 2 的列的名字";??
...
}

?

?

看了一篇實現JTable的列寬與內容的自適應?稍加修飾后如下:

public void FitTableColumns(JTable myTable){JTableHeader header = myTable.getTableHeader();int rowCount = myTable.getRowCount();Enumeration columns = myTable.getColumnModel().getColumns();while(columns.hasMoreElements()){TableColumn column = (TableColumn)columns.nextElement();int col = header.getColumnModel().getColumnIndex(column.getIdentifier());int width = (int)myTable.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(myTable, column.getIdentifier(), false, false, -1, col).getPreferredSize().getWidth();for(int row = 0; row<rowCount; row++){int preferedWidth = (int)myTable.getCellRenderer(row, col).getTableCellRendererComponent(myTable,myTable.getValueAt(row, col), false, false, row, col).getPreferredSize().getWidth();width = Math.max(width, preferedWidth);}header.setResizingColumn(column); // 此行很重要column.setWidth(width+myTable.getIntercellSpacing().width);} }

http://blog.csdn.net/qof3990/article/details/8578350

http://www.blogjava.net/zeyuphoenix/archive/2010/04/08/317755.html

?

?

?

package swing.table;import java.awt.*; import java.awt.event.*;import javax.swing.*; import javax.swing.table.TableColumnModel;public class TestTable extends JFrame {private static final long serialVersionUID = 1L;JTable tb;JPanel p = new JPanel();public TestTable() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLocation(112, 0);setSize(700, 420);final Object[] columnNames = { "檔案號", "姓名", "年齡", "性別", "婚姻狀況", "職業", "聯系電話" };Object[][] rowData = { { "010110", "張三", "28", "男", "已婚", "教師", "13686562936" },{ "010110", "李四", "28", "男", "已婚", "教師", "13686562936" } };tb = new JTable(rowData, columnNames) {private static final long serialVersionUID = 1L;// 添加部分1public boolean isCellEditable(int row, int column) {return false;}};tb.setPreferredScrollableViewportSize(new Dimension(639, 232));// tb.setEnabled(false);tb.setRowHeight(20);tb.setRowSelectionAllowed(true);tb.setSelectionBackground(Color.lightGray);tb.setSelectionForeground(Color.white);tb.setGridColor(Color.black);tb.setShowGrid(true);tb.setShowHorizontalLines(true);tb.setShowVerticalLines(true);tb.setBackground(Color.white);// 添加部分2tb.addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e) {if (e.getButton() == MouseEvent.BUTTON1) {// 雙擊鼠標if (e.getClickCount() == 2) { int colummCount = tb.getModel().getColumnCount();// 列數for (int i = 0; i < colummCount; i++){System.out.print(tb.getModel().getColumnName(i)+":");System.out.print(tb.getModel().getValueAt(tb.getSelectedRow(), i).toString() + " ");}System.out.println();}}}});JScrollPane pane = new JScrollPane(tb);pane.setBackground(Color.white);p.add(pane);add(p);setVisible(true);}public static void main(String[] args) {new TestTable();} }

?
加載時選中多行:

ListSelectionModel listSelectionModel = new DefaultListSelectionModel(); listSelectionModel .setSelectionInterval(0, 2); table.setSelectionModel(ListSelectionModel); listSelectionModel .removeSelectionInterval(1, 1); ListSelectionModel listSelectionModel = new DefaultListSelectionModel(); listSelectionModel .setSelectionInterval(0, 2); table.setSelectionModel(ListSelectionModel); listSelectionModel .removeSelectionInterval(1, 1);

?

JTable中列的排序:

package swing.table.sort;import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.math.BigDecimal; import java.util.regex.Pattern;import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.RowSorter; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter;public class TestSortedTable {private static int flag = 0;public static void main(String args[]) {JFrame frame = new JFrame("JTable的排序測試");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final String columnNames[] = { "ID", "姓名", "國籍", "年齡", "體重" };final Object sortRight_1st_withInt[][] = {{ 1, "嘉靖", "中國", 44, 90.5 },{ 3, "姚明", "中國", 25, 120.5 },{ 2, "趙子龍", "西蜀", 1234, 130.6 },{ 10, "曹操", "北魏", 2112, 90.0 },{ 20, "Bill Gates", "美國", 45, 0.5 },{ 5, "Tomas", "英國", 33, 100.0 }};final Object sortWrong_1st_withString[][] = {{ "1", "嘉靖", "中國", 44, "90.5" },{ "3", "姚明", "中國", 25, "120.5" },{ "2", "趙子龍", "西蜀", 1234, "130.6" },{ "10", "曹操", "北魏", 2112, "90.0" },{ "20", "Bill Gates", "美國", 45, "0.5" },{ "5", "Tomas", "英國", 33, "100.0" }};final Object[][] getRightSort_1st_withString = recoverData2Number(sortWrong_1st_withString);final DefaultTableModel model = new CustomizedTableModel(null, null);final JTable table = new JTable(model);table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);// table.setAutoCreateRowSorter(true);table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// 只能選一行table.getTableHeader().setReorderingAllowed(false);table.setRowSorter(new TableRowSorter<TableModel>(model));JScrollPane pane = new JScrollPane(table);frame.add(pane, BorderLayout.CENTER);JButton changeSourceBtn = new JButton("Change Source");changeSourceBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if (flag % 3 == 0) {model.setDataVector(sortRight_1st_withInt, columnNames);} else if (flag % 3 == 1) {model.setDataVector(sortWrong_1st_withString, columnNames);} else if (flag % 3 == 2) {model.setDataVector(getRightSort_1st_withString, columnNames);}flag++;}});JButton clearBtn = new JButton("Clear");clearBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {try {RowSorter<?> rowSort = table.getRowSorter();if (rowSort != null) {rowSort.setSortKeys(null);// 如果使用了排序器,先清除對表的排序 }((DefaultTableModel) table.getModel()).getDataVector().clear();((DefaultTableModel) table.getModel()).fireTableDataChanged();table.updateUI();} catch (Exception ex) {System.out.println(ex);}}});JPanel southPanel = new JPanel();southPanel.setLayout(new FlowLayout());southPanel.add(changeSourceBtn);southPanel.add(clearBtn);frame.add(southPanel, BorderLayout.SOUTH);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(600, 300);frame.setVisible(true);frame.setLocationRelativeTo(null);}private static Object[][] recoverData2Number(Object[][] sortWrong_1st_withString) {Object[][] target = new Object[sortWrong_1st_withString.length][];for (int i = 0; i < sortWrong_1st_withString.length; i++) {Object[] sourceRecord = sortWrong_1st_withString[i];Object[] targetRecord = new Object[sourceRecord.length];for (int j = 0; j < sourceRecord.length; j++) {Object item = sourceRecord[j];if (isNumericInt(sourceRecord)) {item = Integer.parseInt(item.toString());} else if (isNumericDouble(item)) {item = new BigDecimal(item.toString()).doubleValue();}targetRecord[j] = item;}target[i] = targetRecord;}return target;}private static boolean isNumericInt(Object valueAt) {Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");return pattern.matcher(valueAt.toString().trim()).matches();}private static boolean isNumericDouble(Object valueAt) {Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*\\.?[\\d]*$");return pattern.matcher(valueAt.toString().trim()).matches();}}class CustomizedTableModel extends DefaultTableModel {private static final long serialVersionUID = 1L;public Class<?> getColumnClass(int column) {if (getRowCount() == 0) {return Object.class;}return getValueAt(0, column).getClass();}public CustomizedTableModel(Object[][] data, Object[] columnNames) {super(data, columnNames);}}

排序有兩個途徑:
(1)為每列的值設置正確的類型,并且重寫DefaultTableModel中的getColumnClass方法
因為Integer,Double實現了Comparator接口,即可正確排序
(2)table.setRowSorter(new TableRowSorter<TableModel>(model));
然后為每列指定特定的Comparator:

public class OrderNumberComparator implements Comparator{public int compare(Object o1, Object o2) {int i = (Integer) o1 - (Integer) o2;return i;}}

定義表的時候,選擇按自定義算法排序的字段,如果不設置,默認按字符串的ASCII碼排序

JTable dataGrid=new JTable ();DefaultTableModel model = (DefaultTableModel) this.dataGrid.getModel(); TableRowSorter<TableModel> sorter=new TableRowSorter<TableModel>(model); //sorter.setSortable(0, false); sorter.setComparator(0, new cimframe.util.OrderNumberComparator()); sorter.setComparator(3, new cimframe.util.OrderNumberComparator()); sorter.setComparator(4, new cimframe.util.OrderNumberComparator()); sorter.setComparator(5, new cimframe.util.OrderNumberComparator()); dataGrid.setRowSorter(sorter);



一個關于SWING的工程,當然會用到大量的表格最早清空表格是這樣寫的

//??????????????? DefaultTableModel model = (DefaultTableModel) table.getModel();
//??????????????? for (int i = model.getRowCount() - 1; i >= 0; i--) {
//??????????????????? model.removeRow(i);
//??????????????? }??

用這個方法是有問題的,因為是JTable??? >> TableModel? >> TableData(Vector或String[])這樣的映射關系,如果用上面的方法,如果數據增加或減少都不會通知TableModel ,就導致每次清數據就報數據越界異常ArrayIndexOutOfBoundsException。

?

如果直接清理數據是會通知上層的監聽,改變模型

((DefaultTableModel) table.getModel()).getDataVector().clear();?? //清除表格數據
((DefaultTableModel) table.getModel()).fireTableDataChanged();//通知模型更新
table.updateUI();//刷新表格

?

這樣做了,程序好像是不出問題了,但是如果對表格做了排序操作,再看看,程序是不出錯了,但是每加載一行,就看到表格會做一次排序,這個過程的開銷很大,如果數據量大的話,甚至導致內存溢出。經過一天半的研究,跟蹤,終于找到了問題所在,創建表的時候,引用了排序器,排序器的監聽是一個獨立于JTable >> TableModel >> TableData之外,又在后臺影響著這三者之間的關系的一個人,在程序調試時,很難找到他在那里影響的,最終在JDK API里發現了一點端倪

javax.swing
類 RowSorter<M>

java.lang.Objectjavax.swing.RowSorter<M> 類型參數: M - 底層模型的類型

?setSortKeys

public abstract void setSortKeys(List<? extends RowSorter.SortKey> keys) 設置當前排序鍵。 參數: keys - 新的 SortKeys;null 是指定一個空列表的簡寫,表示視圖應該是未排序的。 toggleSortOrder public abstract void toggleSortOrder(int column)
顛倒指定列的排序順序。調用此方法時,由子類提供具體行為。通常,如果指定列已經是主要排序列,則此方法將升序變為降序(或將降序變為升序);否則,使指定列成為主要排序列,并使用升序排序順序。如果指定列不可排序,則此方法沒有任何效果。

如果此方法導致更改排序順序和排序操作,則它將發送適當的 RowSorterListener 通知。

?

參數:
column - 要切換排序順序的列,就底層模型而言
拋出:
IndexOutOfBoundsException - 如果列超出底層模型的范圍

上面這兩個方法很像,但又有區別,我先用toggleSortOrder(int column) 這個column必須有一個有效的列號,就是說,不能用-1,這個方法是不能取消對表的排序選中的。那么另一個方法setSortKeys(List<? extendsRowSorter.SortKey> keys),這個就比較難了,我也不知道應該傳什么參數,再看參數說明:null 是指定一個空列表的簡寫,表示視圖應該是未排序的。“應該”兩字說的實在是詭異,我就把它當成死馬醫,看看到底行不行,嘿嘿,通過方法:rowSort.setSortKeys(null);把表格還原到不排序的狀態,就達到我想要的結果了,大功終于告成!

http://blog.csdn.net/aptweasel/article/details/7028058

?

http://www.cnblogs.com/tianyaxue/p/3494291.html

http://jingyan.baidu.com/article/fedf07377f003035ac8977c3.html

?

Java JTable 點擊表頭,能不能進行多列排序

建議已現有Jtable開發新的Table類,加個數組用于記錄排序列的先后次序,重寫Jtable的表頭單擊事件

?

轉載于:https://www.cnblogs.com/softidea/p/4535890.html

總結

以上是生活随笔為你收集整理的JTable demo的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。