<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
    數據加載中……

    Java SE 6之GUI:讓界面更加絢麗(下)

    本文為原創,如需轉載,請注明作者和出處,謝謝!

    Java SE 6之GUI:讓界面更加絢麗( 上)

    在上一篇中我介紹了Java SE 6GUI上的部分改進。在這篇 文章中我接著介紹另外幾種新的GUI功能。這些功能是:

    1.  帶有排序和過濾功能的JTable

    2.  增強的JTabbedPane組件

    3.  增強的打印功能

    4.  增強的拖放功能

    一、帶有排序和過濾功能的JTable

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

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


    TableModel model = new DefaultTableModel(rows, columns);
    JTable table 
    = new JTable(model);
    RowSorter sorter 
    = new TableRowSorter(model);
    table.setRowSorter(sorter);

    上面代碼首先建立一個TableModel,然后將這個 TableModel的實例同時傳遞給了JTable RowSorter。下面是一個使用 JTable排序的簡單的例子。


    import javax.swing.*;
    import javax.swing.table.*;
    import java.awt.*;

    public class TestSortedTable
    {
        
    public static void main(String args[])
        {
             JFrame frame 
    =  new JFrame("JTable的排序測試");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           
    // 表格中顯示的數據
            Object rows[][] =
            {
             { 
    " 王明 ""中國"44 },
             { 
    " 姚明 ""中國"25 },
             { 
    " 趙子龍 ""西蜀"1234 },
             { 
    " 曹操 ""北魏"2112 },
             { 
    " Bill Gates ""美國"45 },
             { 
    " Mike""< /span>英國"33 } };
            String columns[] 
    =
             { 
    " 姓名 ""國籍""年齡" };
            TableModel model 
    = new DefaultTableModel(rows, columns);
            JTable table 
    = new JTable(model);
            RowSorter
    <TableModel> sorter = new TableRowSorter<TableModel>(model);
            table.setRowSorter(sorter);
            JScrollPane pane 
    = new JScrollPane(table);
            frame.add(pane, BorderLayout.CENTER);
            frame.setSize(
    300150);
            frame.setVisible(
    true);
        }
    }

    1和圖2 分別是按“姓名”進行升序和降序排列的顯示結果。



    1 按“姓名”升序顯示




    2 按“姓名”降序顯示

        3顯示的是按“年齡”進行降序排列。但我們發現一個奇怪的問題 ,就是“年齡”字段并不是按數值類型進行排序的,而是按字符類型進行排序的。

     


    3 按年齡降序顯示

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


    TableModel model = new DefaultTableModel(rows, columns)
            {
                
    public Class getColumnClass(int column)
                {
                    Class returnValue;
                    
    if ((column >= 0&& (column < getColumnCount()))
                    {
                        returnValue 
    = getValueAt(0, column).getClass();
                    }
                    
    else
                    {
                        returnValue 
    = Object.class;
                    }
                    
    return returnValue;
                }
            };

     4顯示了按“年齡”進行排序的界面,看看,是不是按數值進行排序了。



    4 按數值類型進行排序

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

    button.addActionListener(new ActionListener()
            {
                
    public void actionPerformed(ActionEvent e)
                {
                    String text 
    = filterText.getText();
                    
    if (text.length() == 0)
                    {
                        sorter.setRowFilter(
    null);
                    }
                    
    else
                    {
                        sorter.setRowFilter (RowFilter.regexFilter(text));
                    }
                }
            });

     上面的代碼并沒有調用convertRowIndextoModel()方法,如果調用它,你就可以在 表中進行相應的操作。

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

    1.     andFilter

    2.         dateFilter(RowFilter.ComparisonType type, Date date, int... indices)

    3.         notFilter(RowFilter<M,I> filter)

    4.         numberFilter(RowFilter.ComparisonType type, Number number, int... indices)

    5.         orFilter

    6.         regexFilter(String regex, int... indices)

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

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

    import javax.swing.*;
    import javax.swing.table.*;
    import java.awt.*;
    import java.awt.event.*;

    public class TestFilter
    {
        
    public static void main(String args[])
        {
             JFrame frame 
    =  new JFrame("JTable的過濾測試");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Object rows[][] 
    =
            {
             { 
    " 王明 ""中國"44 },
             { 
    " 姚明 ""中國"25 },
             { 
    " 趙子龍 ""西蜀"1234 },
             { 
    " 曹操 ""北魏"2112 },
             { 
    " Bill Gates ""美國"45 },
             { 
    " Mike""< /span>英國"33 } };
            String columns[] 
    =
             { 
    " 姓名 ""國籍""年齡" };
            TableModel model 
    = new DefaultTableModel(rows, columns)
            {
                
    public Class getColumnClass(int column)
                {
                    Class returnValue;
                    
    if ((column >= 0&& (column < getColumnCount()))
                    {
                        returnValue 
    = getValueAt(0, column).getClass();
                    }
                    
    else
                    {
                        returnValue 
    = Object.class;
                    }
                    
    return returnValue;
                }
            };
            
    final JTable table = new JTable(model);
            
    final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(
                            model);
            table.setRowSorter(sorter);
            JScrollPane pane 
    = new JScrollPane(table);
            frame.add(pane, BorderLayout.CENTER);
            JPanel panel 
    = new JPanel(new BorderLayout());
             JLabel label 
    =  new JLabel("過濾");
            panel.add(label, BorderLayout.WEST);
            
    final JTextField filterText = new JTextField("");
            panel.add(filterText, BorderLayout.CENTER);
            frame.add(panel, BorderLayout.NORTH);
             JButton button 
    =  new JButton("過濾");
            button.addActionListener(
    new ActionListener()
            {
                
    public void actionPerformed(ActionEvent e)
                {
                    String text 
    = filterText.getText();
                    
    if (text.length() == 0)
                    {
                        sorter.setRowFilter(
    null);
                    }
                    
    else
                    {
                        sorter.setRowFilter (RowFilter.regexFilter(text));
                    }
                }
            });
            frame.add(button, BorderLayout.SOUTH);
            frame.setSize(
    300250);
            frame.setVisible(
    true);
        }
    }

    5是上面程序的運行界面。



    二、增強的JTabbedPane組件

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


    JTabbedPane pane = new JTabbedPane();
    pane.setTabComponentAt(
    1, component);

    JTabbedPane控件中有3個常用的方法,setTabComponentAt(int index, Component comp), getTabComponentAt (int index)indexOfTabComponent(Component)。最后一個方法將替換Tab上的控件。下面的代碼是一個關于JTabbedPane控件的演示。

    import javax.swing.*;
    import javax.swing.table.*;
    import java.awt.*;
    import java.awt.event.*;

    public class TestTabbedPane
    {
        
    static void addIt(JTabbedPane tabbedPane, String text)
        {
            JLabel label 
    = new JLabel(text);
            JButton button 
    = new JButton(text);
            JPanel panel 
    = new JPanel();
            panel.add(label);
            panel.add(button);
            tabbedPane.addTab(text, panel);
            
    if(text.equals ("tab4"))
                tabbedPane.setTabComponentAt(tabbedPane.getTabCount() 
    - 1,
                                  
    new JTextField("插入了文本控件" ));
            
    else            
            tabbedPane.setTabComponentAt(tabbedPane.getTabCount() 
    -  1,
                            button);
        }
        
    public static void main(String args[])
        {
             JFrame f 
    = new JFrame(" JTabbedPane演示");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JTabbedPane tabbedPane 
    = new JTabbedPane();
            addIt(tabbedPane, 
    "tab1");
            addIt(tabbedPane, 
    "tab2");
            addIt(tabbedPane, 
    "tab3");
            addIt(tabbedPane, 
    "tab4");
            addIt(tabbedPane, 
    "tab5");
            f.add(tabbedPane, BorderLayout.CENTER);
            f.setSize(
    400200);
            f.setVisible(
    true);
        }
    }


    6是顯示界面,其中在Tab4上插入了一個文本控件,在Tab1Tab5上各插入了一個 按鈕控件。




    6 JTabbedPane演示

    三、增強的打印功能

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

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.print.*;

    public class TextPrint
    {
        
    public static void main(final String args[])
        {
             JFrame frame 
    =  new JFrame("打印測試");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
    final JTextArea textArea = new JTextArea();
            JScrollPane pane 
    = new JScrollPane(textArea);
            frame.add(pane, BorderLayout.CENTER);
             textArea.setText(
    "打印 內容\r\n可以分頁! " );
             JButton button 
    =  new JButton("打印");
            frame.add(button, BorderLayout.SOUTH);
            ActionListener listener 
    = new ActionListener()
            {
                
    public void actionPerformed(ActionEvent e)
                {
                    
    try
                    {
                        textArea.print();                       
                    }
                    
    catch (PrinterException pe)
                    {
                         System.err.println(
    "打印失敗");
                    }
                }
            };
            button.addActionListener(listener);
            frame.setSize(
    250150);
            frame.setVisible(
    true);
    }
    }

    7和圖8分別是打印對話框和設置對話框, 點擊“打印“按鈕后彈出如圖8的對話框。


    7 打印界面

    8 設置對話框

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

    public boolean print(MessageFormat headerFormat,

    MessageFormat footerFormat,

    boolean showPrintDialog,

    PrintService service,

    PrintRequestAttributeSet attributes,

    boolean interactive)


    四、增強的拖放功能

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

    1.       可以定制拖放模式。

    2.         可以在拖放的過程中加入其它的輔助信息。

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

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


    import java.awt.*;
    import java.awt.datatransfer.*;
    import java.awt.event.*;
    import java.io.*;
    import javax.swing.*;
    import javax.swing.tree.*;

    public class TestDrapDrop
    {
        
    public static void main(String args[])
        {
             JFrame f 
    = new JFrame(" 拖放測試" );
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel top 
    = new JPanel(new BorderLayout());
             JLabel dragLabel 
    = new  JLabel("拖我:");
            JTextField text 
    = new JTextField();
            text.setDragEnabled(
    true);
            top.add(dragLabel, BorderLayout.WEST);
            top.add(text, BorderLayout.CENTER);
            f.add(top, BorderLayout.NORTH);
            
    final JTree tree = new JTree();
            
    final DefaultTreeModel model = (DefaultTreeModel)  tree.getModel();
            tree.setTransferHandler(
    new TransferHandler()
            {
                
    public boolean canImport (TransferHandler.TransferSupport support)
                {
                    
    if (!support.isDataFlavorSupported (DataFlavor.stringFlavor)
                            
    || !support.isDrop())
                    {
                        
    return false;
                    }
                    JTree.DropLocation dropLocation 
    = (JTree.DropLocation) suppor
                            .getDropLocat ion();
                    
    return dropLocation.getPath() != null;
                }

                
    public boolean importData (TransferHandler.TransferSupport support)
                {
                    
    if (!canImport(support))
                    {
                        
    return false;
                    }
                    JTree.DropLocation dropLocation 
    = (JTree.DropLocation) support
                            .getDropLocat ion();
                    TreePath path 
    = dropLocation.getPath();
                    Transferable transferable 
    = support.getTransferable();
                    String transferData;
                    
    try
                    {
                        transferData 
    = (String) transferable
                              & nbsp; .getTransferData(DataFlavor.stringFlavor);
                    }
                    
    catch (IOException e)
                    {
                        
    return false;
                    }
                    
    catch (UnsupportedFlavorException e)
                    {
                        
    return false;
                    }
                    
    int childIndex = dropLocation.getChildIndex();
                    
    if (childIndex == -1)
                    {
                        childIndex 
    = model.getChildCount(path
                              & nbsp; .getLastPathComponent());
                    }
                    DefaultMutableTreeNode newNode 
    = new DefaultMutableTreeNode(
                            transferData) ;
                    DefaultMutableTreeNode parentNode 
    = (DefaultMutableTreeNode) path
                            .getLastPathC omponent();
                    model.insertNodeInto (newNode, parentNode, childIndex);
                    TreePath newPath 
    = path.pathByAddingChild(newNode);
                    tree.makeVisible(newPath);
                    tree.scrollRectToVisible(tree.getPathBounds(newPath));
                    
    return true;
                }
            });
            JScrollPane pane 
    = new JScrollPane(tree);
            f.add(pane, BorderLayout.CENTER);
            JPanel bottom 
    = new JPanel();
            JLabel comboLabel 
    = new JLabel("DropMode");
            String options[] 
    =
            { 
    "USE_SELECTION""ON""INSERT""ON_OR_INSERT" };
            
    final DropMode mode[] =
            { DropMode.USE_SELECTION, DropMode.ON, DropMode.INSERT,
                    DropMode.ON_OR_INSERT };
            
    final JComboBox combo = new JComboBox(options);
            combo.addActionListener(
    new ActionListener()
            {
                
    public void actionPerformed(ActionEvent e)
                {
                    
    int selectedIndex = combo.getSelectedIndex();
                    tree.setDropMode(mode[selectedIndex]);
                }
            });
            bottom.add(comboLabel);
            bottom.add(combo);
            f.add(bottom, BorderLayout.SOUTH);
            f.setSize(
    300400);
            f.setVisible(
    true);
        }
    }

    9為拖動程序的運行界面。在上面的文本框里輸入相應的 文本,然后將其選擇再拖動到下方的樹中。


    9 拖動界面







    Android開發完全講義(第2版)(本書版權已輸出到臺灣)

    http://product.dangdang.com/product.aspx?product_id=22741502



    Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


    新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

    posted on 2008-04-30 20:19 銀河使者 閱讀(7918) 評論(6)  編輯  收藏 所屬分類: java 原創

    評論

    # re: Java SE 6之GUI:讓界面更加絢麗(下)  回復  更多評論   

    不錯,收藏了!
    2008-04-30 22:01 | gjr

    # re: Java SE 6之GUI:讓界面更加絢麗(下)  回復  更多評論   

    說不上什么絢麗, 從圖片上看外觀變化不大呀
    我所理解的“絢麗”,是僅看外觀能讓人眼前一亮的東東。
    2008-05-04 09:41 | liigo

    # re: Java SE 6之GUI:讓界面更加絢麗(下)  回復  更多評論   

    @liigo
    怎么老盯著這個不放叻、、、、
    2008-05-05 14:56 | 枯寬

    # re: Java SE 6之GUI:讓界面更加絢麗(下)  回復  更多評論   

    并沒有感覺到它絢麗
    2008-05-20 13:28 | 相信

    # re: Java SE 6之GUI:讓界面更加絢麗(下)  回復  更多評論   

    絢麗是要自己做的,哈哈,只是演示了功能而已,沒做那么復雜。
    2008-05-20 15:26 | 銀河使者

    # re: Java SE 6之GUI:讓界面更加絢麗(下)[未登錄]  回復  更多評論   

    別轉了,這個有點錯誤要更改
    public boolean importData (TransferHandler.TransferSupport support)
    {
    if (!canImport(support))
    {
    return false;
    }
    JTree.DropLocation dropLocation = (JTree.DropLocation)

    suppor.getDropLocat ion();

    應該是support.getDropLocat ion();
    2010-03-23 11:22 | dave
    主站蜘蛛池模板: 久久午夜免费鲁丝片| 黄页免费在线观看| 一级一黄在线观看视频免费| 久久嫩草影院免费看夜色| 日本不卡免费新一区二区三区 | 亚洲综合小说另类图片动图| 久久精品国产亚洲av品善| 久久国产精品免费一区二区三区| 嫩草影院在线播放www免费观看| 国产91色综合久久免费| 免费大学生国产在线观看p| 国产亚洲精品国产| 亚洲一级毛片免观看| 免费国产在线精品一区| 四虎影视成人永久免费观看视频| 久久综合AV免费观看| 国产精品亚洲二区在线观看| 中文字幕在线观看亚洲| 国产亚洲精品精品精品| 99久久人妻精品免费一区| 免费无码又爽又刺激毛片| 亚洲国产另类久久久精品小说| 亚洲AV无码一区二区三区在线| 午夜不卡AV免费| 青娱乐免费在线视频| 日韩精品亚洲aⅴ在线影院| 亚洲一区二区三区无码国产| 日韩电影免费在线观看网址 | 最近国语视频在线观看免费播放| 免费观看美女用震蛋喷水的视频| 免费人成年轻人电影| 亚洲自偷自偷精品| 日本一区二区三区在线视频观看免费 | 九月婷婷亚洲综合在线| 亚洲精品美女视频| 一级黄色片免费观看| 91成人免费观看网站| 中文字幕人成人乱码亚洲电影| 国产精品亚洲专区在线观看| 三级网站免费观看| 国产免费拔擦拔擦8x|