熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

讓界面更加絢麗 Java SE 6.0四種新功能

2022-06-13   來源: JSP教程 
    在這篇文章中我接著介紹另外幾種新的GUI功能這些功能是

  ·帶有排序和過濾功能的JTable

  ·增強的JTabbedPane組件

  ·增強的打印功能

  ·增強的拖放功能

  帶有排序和過濾功能的JTable

  在Java SE 中除了javaawt被更新外javaxswing同時也有了很大的改進在C/S程序中我們會經常使用到如我們可以在查詢數據庫後將查詢結果顯示在表格中在Java中顯示表格使用的是JTable類在以前的版本中JTable只能簡單地顯示數據並沒有什麼附加的處理功能而在Java SE 中的JTable增加了排序和過濾功能用戶可以單擊列頭進行排序也可以根據某一列來過濾表中的數據

  為了使JTable可以對數據進行必須將RowSorter類和JTable進行關聯RowSorter是一個抽象類它負責將JTable中的數據映射成可排序的數據在真正使用時我們將直接使用RowSorter的子類TableRowSorter下面的代碼顯示了如何將TableRowSorter類和JTable相關聯

TableModel model = new DefaultTableModel(rows columns);
JTable table = new JTable(model);
RowSorter sorter = new TableRowSorter(model);
tablesetRowSorter(sorter);
  上面代碼首先建立一個TableModel然後將這個TableModel的實例同時傳遞給了JTable和RowSorter下面是一個使用JTable排序的簡單的例子

import javaxswing*;
import javaxswingtable*;
import javaawt*;

public class TestSortedTable
{
 public static void main(String args[])
 {
  JFrame frame = new JFrame(JTable的排序測試);
  framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
  // 表格中顯示的數據
  Object rows[][] =
   {
   { 王明 中國 }
   { 姚明 中國 }
   { 趙子龍 西蜀 }
   { 曹操 北魏 }
   { Bill Gates 美國 }
   { Mike 英國 } };
  String columns[] =
   { 姓名 國籍 年齡 };
  TableModel model = new DefaultTableModel(rows columns);
  JTable table = new JTable(model);
  RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
  tablesetRowSorter(sorter);
  JScrollPane pane = new JScrollPane(table);
  frameadd(pane BorderLayoutCENTER);
  framesetSize( );
  framesetVisible(true);
 }
}
  圖和圖分別是按姓名進行升序和降序排列的顯示結果



姓名升序顯示

姓名降序顯示
  圖顯示的是按年齡進行降序排列但我們發現一個奇怪的問題就是年齡字段並不是按數值類型進行排序的而是按字符類型進行排序的



按年齡降序顯示

  出現這種情況是因為在默認情況下DefaultTableModal的列是Object類型而要想使JTable按數值進行排序必須要覆蓋DefaultTableModal的getColumnClass方法


TableModel model = new DefaultTableModel(rows columns)
{
 public Class getColumnClass(int column)
 {
  Class returnValue;
  if ((column >= ) && (column < getColumnCount()))
  {
   returnValue = getValueAt( column)getClass();
  }
  else
  {
   returnValue = Objectclass;
  }
  return returnValue;
 }
};
  圖顯示了按年齡進行排序的界面看看是不是按數值進行排序了



按數值類型進行排序
  下面讓我們來看看來何使用JTable進行過濾我們可以通過convertRowIndexToModel方法進行過濾下面的代碼加在一個按鈕中添加事件代碼調用JTable的過濾功能

buttonaddActionListener(new ActionListener()
{
 public void actionPerformed(ActionEvent e)
 {
  String text = filterTextgetText();
  if (textlength() == )
  {
   sortersetRowFilter(null);
  }
  else
  {
   sortersetRowFilter(RowFilterregexFilter(text));
  }
 }
});
  上面的代碼並沒有調用convertRowIndextoModel()方法如果調用它你就可以在表中進行相應的操作

  在JTable中通過抽象類RowFilter類對行進行過濾和排序不同你可以不建立它們的子類而使用這個抽象類的個靜態方法

  ·andFilter
  ·dateFilter(RowFilterComparisonType type Date date int indices)
  ·notFilter(RowFilter<MI> filter)
  ·numberFilter(RowFilterComparisonType type Number number int indices)
  ·orFilter
  ·regexFilter(String regex int indices)

  其中andFilter()orFilter()以及notFilter()方法的功能是將當前的過濾條件和其它的過濾條件進行組合如在同時比較日期和數值時需要將日期過濾和數值過濾進行組合這些組合是非常簡單的

  RowFilter的類型比較允許你進行種關系的比較等於不等於大於或小於我們可以通過指定某一列進行過濾也可以對所有的列進行過濾這其中最為有趣的也許是正則表達式過濾(regular expression filter或簡稱為regex filter)使用這個過濾器可以對表中數據進行更高級的過濾下面是實現一個簡單過濾器的代碼

import javaxswing*;
import javaxswingtable*;
import javaawt*;
import javaawtevent*;

public class TestFilter
{
 public static void main(String args[])
 {
  JFrame frame = new JFrame(JTable的過濾測試);
  framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
  Object rows[][] =
  {
   { 王明 中國 }
   { 姚明 中國 }
   { 趙子龍 西蜀 }
   { 曹操 北魏 }
   { Bill Gates 美國 }
   { Mike 英國 } };
  String columns[] =
   { 姓名 國籍 年齡 };
  TableModel model = new DefaultTableModel(rows columns)
  {
   public Class getColumnClass(int column)
   {
    Class returnValue;
    if ((column >= ) && (column < getColumnCount()))
    {
     returnValue = getValueAt( column)getClass();
    }
    else
    {
     returnValue = Objectclass;
    }
    return returnValue;
   }
  };
  final JTable table = new JTable(model);
  final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
  tablesetRowSorter(sorter);
  JScrollPane pane = new JScrollPane(table);
  frameadd(pane BorderLayoutCENTER);
  JPanel panel = new JPanel(new BorderLayout());
  JLabel label = new JLabel(過濾);
  paneladd(label BorderLayoutWEST);
  final JTextField filterText = new JTextField();
  paneladd(filterText BorderLayoutCENTER);
  frameadd(panel BorderLayoutNORTH);
  JButton button = new JButton(過濾);
  buttonaddActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    String text = filterTextgetText();
    if (textlength() == )
    {
     sortersetRowFilter(null);
    }
    else
    {
     sortersetRowFilter(RowFilterregexFilter(text));
    }
   }
  });
  frameadd(button BorderLayoutSOUTH);
  framesetSize( );
  framesetVisible(true);
 }
}
  圖是上面程序的運行界面



  增強的JTabbedPane組件

  JTabbedPane組件為我們提供了一種非常好的方法在窗體上顯示很多的控件我們可以將不同類別的控件放到不同的Tab頁上然後通過需要點擊相應的Tab頁在傳統的Tab頁上只能防止文本的圖標而在Java SE 中使我們可以直接將控件放到Tab上我們可以通過setTabComponentAt方法將控件放到Tab上這個方法有兩個參數一個是Tab的索引另一個是要放置的對象


JTabbedPane pane = new JTabbedPane();
panesetTabComponentAt( component);
  在JTabbedPane控件中有個常用的方法setTabComponentAt(int index Component comp) getTabComponentAt(int index)和indexOfTabComponent(Component)最後一個方法將替換Tab上的控件下面的代碼是一個關於JTabbedPane控件的演示

import javaxswing*;
import javaxswingtable*;
import javaawt*;
import javaawtevent*;

public class TestTabbedPane
{
 static void addIt(JTabbedPane tabbedPane String text)
 {
  JLabel label = new JLabel(text);
  JButton button = new JButton(text);
  JPanel panel = new JPanel();
  paneladd(label);
  paneladd(button);
  tabbedPaneaddTab(text panel);
  if(textequals(tab))
   tabbedPanesetTabComponentAt(tabbedPanegetTabCount()
new JTextField(插入了文本控件));
  else
   tabbedPanesetTabComponentAt(tabbedPanegetTabCount() button);
 }
 public static void main(String args[])
 {
  JFrame f = new JFrame(JTabbedPane演示);
  fsetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
  JTabbedPane tabbedPane = new JTabbedPane();
  addIt(tabbedPane tab);
  addIt(tabbedPane tab);
  addIt(tabbedPane tab);
  addIt(tabbedPane tab);
  addIt(tabbedPane tab);
  fadd(tabbedPane BorderLayoutCENTER);
  fsetSize( );
  fsetVisible(true);
 }
}
  圖是顯示界面其中在Tab上插入了一個文本控件在Tab至Tab上各插入了一個按鈕控件



JTabbedPane演示   增強的打印功能

  自從Java SE 開始Sun就對控件的打印功能進行了加強如JTextFieldJTextArea等在Java SE 中Sun為打印增加了分頁功能我們只需要調用JtextField或JTextArea的print方法就可以調用打印對話框下面是一段測試代碼

import javaxswing*;
import javaawt*;
import javaawtevent*;
import javaawtprint*;

public class TextPrint
{
 public static void main(final String args[])
 {
  JFrame frame = new JFrame(打印測試);
  framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
  final JTextArea textArea = new JTextArea();
  JScrollPane pane = new JScrollPane(textArea);
  frameadd(pane BorderLayoutCENTER);
  textAreasetText(打印內容\r\n可以分頁! );
  JButton button = new JButton(打印);
  frameadd(button BorderLayoutSOUTH);
  ActionListener listener = new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    try
    {
     textAreaprint();
    }
    catch (PrinterException pe)
    {
     Systemerrprintln(打印失敗);
    }
   }
  };
  buttonaddActionListener(listener);
  framesetSize( );
  framesetVisible(true);
 }
}
  圖和圖分別是打印對話框和設置對話框點擊打印按鈕後彈出如圖的對話框



打印界面

設置對話框

  雖然提供了打印設置對話框但我們並無法設置如頁眉(角)等信息幸運的是print的一個重載為我們提供了這個功能下面是這個方法的參數


public boolean print(MessageFormat headerFormat
MessageFormat footerFormat
boolean showPrintDialog
PrintService service
PrintRequestAttributeSet attributes
boolean interactive)
  增強的拖放功能

  在Java SE 中的拖放功能得到了增強這主要表現在兩個方面

  ·可以定制拖放模式

  可以在拖放的過程中加入其它的輔助信息 首先需要通過JListJTable等控件的setDropMode()方法來設置一個拖動模式所有的控件都可以使用USER_SELECTION模式這個模式在以前的Java SE版本中就有這也是默認的拖放模式

  JListJTable和Jlist都支持ON模式這個模式允許你將對象拖到其它項的上方而INSERT模式允許將一個對象插入在其它項之間而ON_OR_INSERT模式是前種模式的組合下面的代碼將演示一個拖動的例子

import javaawt*;
import javaawtdatatransfer*;
import javaawtevent*;
import javaio*;
import javaxswing*;
import javaxswingtree*;

public class TestDrapDrop
{
 public static void main(String args[])
 {
  JFrame f = new JFrame(拖放測試);
  fsetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
  JPanel top = new JPanel(new BorderLayout());
  JLabel dragLabel = new JLabel(拖我:);
  JTextField text = new JTextField();
  textsetDragEnabled(true);
  topadd(dragLabel BorderLayoutWEST);
  topadd(text BorderLayoutCENTER);
  fadd(top BorderLayoutNORTH);
  final JTree tree = new JTree();
  final DefaultTreeModel model = (DefaultTreeModel) treegetModel();
  treesetTransferHandler(new TransferHandler()
  {
   public boolean canImport(TransferHandlerTransferSupport support)
   {
    if (!supportisDataFlavorSupported(DataFlavorstringFlavor) || !supportisDrop())
    {
     return false;
    }
    JTreeDropLocation dropLocation = (JTreeDropLocation) supporgetDropLocation();
    return dropLocationgetPath() != null;
   }
   public boolean importData(TransferHandlerTransferSupport support)
   {
    if (!canImport(support))
    {
     return false;
    }
    JTreeDropLocation dropLocation = (JTreeDropLocation) supportgetDropLocation();
    TreePath path = dropLocationgetPath();
    Transferable transferable = supportgetTransferable();
    String transferData;
    try
    {
     transferData = (String) transferable getTransferData(DataFlavorstringFlavor);
    }
    catch (IOException e)
    {
     return false;
    }
    catch (UnsupportedFlavorException e)
    {
     return false;
    }
    int childIndex = dropLocationgetChildIndex();
    if (childIndex == )
    {
     childIndex = modelgetChildCount(pathgetLastPathComponent());
    }
    DefaultMutableTreeNode newNode = new DefaultMutableTreeNode( transferData);
    DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) pathgetLastPathComponent();
    modelinsertNodeInto(newNode parentNode childIndex);
    TreePath newPath = pathpathByAddingChild(newNode);
    treemakeVisible(newPath);
    treescrollRectToVisible(treegetPathBounds(newPath));
    return true;
   }
  });
  JScrollPane pane = new JScrollPane(tree);
  fadd(pane BorderLayoutCENTER);
  JPanel bottom = new JPanel();
  JLabel comboLabel = new JLabel(DropMode);
  String options[] ={ USE_SELECTION ON INSERT ON_OR_INSERT };
  final DropMode mode[] =
   {DropModeUSE_SELECTION DropModeON DropModeINSERT DropModeON_OR_INSERT };
  final JComboBox combo = new JComboBox(options);
  comboaddActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    int selectedIndex = combogetSelectedIndex();
    treesetDropMode(mode[selectedIndex]);
   }
  });
  bottomadd(comboLabel);
  bottomadd(combo);
  fadd(bottom BorderLayoutSOUTH);
  fsetSize( );
  fsetVisible(true);
 }
  圖為拖動程序的運行界面在上面的文本框裡輸入相應的文本然後將其選擇再拖動到下方的樹中



拖動界面


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19320.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.