close

1. 設置Table Model –MsgTableModel之程式

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

/**
 * <code>MsgTableModel</code> 
 * 
 * @author Elsa
 */
public class MsgTableModel extends AbstractTableModel {
    private List<Object> listData;

    public MsgTableModel() {
        listData = new ArrayList<Object>();
    }
    
    public void addRow(Object msgComponent) {
        listData.add(msgComponent);
        int listLen = listData.size();
        this.fireTableRowsInserted(listLen - 1, listLen - 1);
    }

    @Override
    public int getRowCount() {
        return listData.size();
    }

    @Override
    public int getColumnCount() {
        return 1;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return listData.get(rowIndex);
    }
    
    @Override 
    public boolean isCellEditable(int row, int col) {
       return false;
    }
}

 

2. 設置客製化之訊息樣版與程式

MsgListPanel_樣版.png

public class MsgListPanel extends javax.swing.JPanel {

   /**
    * Creates new form MsgListPanel
    */
    public MsgListPanel(String account, String msg, String time) {
        initComponents();        

        labAcount.setText(account);
        labMsg.setText(msg);
        labTime.setText(time);
        if(account.length() == 0) {
            labMsg.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
            labMsg.setForeground(new Color(41, 148, 255));
            labImg.setVisible(false);
        }
    }

 

3. 設置MsgListComponent以取得各個訊息相關資訊之程式

public class MsgListComponent {
    private String account;
    private String msg;
    private String time;
    
    public String getAccount() {
        return account;
    }
    
    public void setAccount(String account) {
        this.account = account;
    }
    
    public String getMsg() {
        return msg;
    }
    
    public void setMsg(String msg) {
        this.msg = msg;
    }
    
    public String getTime() {
        return time;
    }
    
    public void setTime(String time) {
        this.time = time;
    }
}

 

4. 設置各Cell之樣版–MsgListCellRenderer之程式

import java.awt.Color;

import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

/**
 * <code>MsgListCellRenderer</code>
 * 
 * @author Elsa
 */
public class MsgListCellRenderer implements TableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        
        MsgListPanel messageList;
        
        // 1.取得訊息框所需之資訊
        MsgListComponent msgComponent = (MsgListComponent)value;
        String strAccount = msgComponent.getAccount();
        String strMsg = msgComponent.getMsg();
        String strTime = msgComponent.getTime();
        
        // 2.設置訊息框之資訊
        messageList = new MsgListPanel(strAccount, strMsg, strTime);
        
        // 3.設置對話框之高度
        table.setRowHeight(row, 59);
        
        // 4.設定欄位被選或預設之文字和背景色、字型
        if (isSelected) {
            messageList.setForeground(Color.WHITE);
            messageList.setBackground(new Color(189, 222, 255));
        }
        
        return messageList;
    }
}

 

5. 主執行之程式範例

import chatroomdemo.components.MsgListCellRenderer;
import chatroomdemo.components.MsgListComponent;
import chatroomdemo.components.MsgTableModel;
import chatroomdemo.components.SearchTextObject;
import java.awt.Color;
import javax.swing.JTable;

/**
 *
 * @author Elsa
 */
public class MessageListDemo extends javax.swing.JFrame {
    final JTable tabMessageList = new JTable();
    MsgTableModel msgTableModel = new MsgTableModel();

    String[] account = {"acount01", "acount02", "line66"};
    String[] msg = {"訊息1訊息1訊息1", "訊息2*訊息2*訊息2*訊息2*訊息2*訊息2*訊息2*訊息2*訊息2*", "test123456*"};
    String[] time = {"08/30", "08/31", "10/15"};

    /**
     * Creates new form MessageList
     */
    public MessageListDemo() {
        // 1.初始化元件
        initComponents();

        // 2.初始化 訊息清單 之元件
        tabMessageList.setTableHeader(null);
        tabMessageList.setModel(msgTableModel);
        tabMessageList.getColumnModel().getColumn(0).setPreferredWidth(260);
        tabMessageList.getColumnModel().getColumn(0).setCellRenderer(new MsgListCellRenderer());
        tabMessageList.setBackground(Color.white);
        tabMessageList.setOpaque(true);
        tabMessageList.setShowHorizontalLines(false);
        slpSecretMsgList.setViewportView(tabMessageList);
        slpSecretMsgList.getViewport().setBackground(new Color(231,239,255));

        // 3.設置每筆訊息之內容
        for(int i = 0; i < account.length; i++) {
            MsgListComponent msgList = new MsgListComponent();
            msgList.setAccount(account[i]);
            msgList.setMsg(msg[i]);
            msgList.setTime(time[i]);
            msgTableModel.addRow(msgList);
        }

        // 4.預選第一筆悄悄話訊息
        tabMessageList.changeSelection(0, 0, false, false);
        
        // 5.設置 txfSearch 之即時顯示搜尋結果的 DocumentListener
        txfSearch.getDocument().addDocumentListener(new SearchTextObject.onValueChangedSearchWord(tabMessageList, msgTableModel));
    }

MessageListDemo建構函數之程式

 

    txfSearch.setFont(new java.awt.Font("微軟正黑體", 0, 12)); // NOI18N
        txfSearch.setForeground(new java.awt.Color(153, 153, 153));
        txfSearch.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        txfSearch.setText("訊息、帳號搜尋");
        txfSearch.setMinimumSize(new java.awt.Dimension(54, 28));
        txfSearch.setPreferredSize(new java.awt.Dimension(54, 28));
        txfSearch.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                txfSearchFocusGained(evt);
            }
            public void focusLost(java.awt.event.FocusEvent evt) {
                txfSearchFocusLost(evt);
            }
        });
        panelSearchObject.add(txfSearch, java.awt.BorderLayout.PAGE_END);

 

    private void txfSearchFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txfSearchFocusGained
        if(txfSearch.getText().equals("訊息、帳號搜尋")) {
            txfSearch.setText(null);
            txfSearch.setForeground(Color.BLACK);
            txfSearch.setHorizontalAlignment(javax.swing.JTextField.LEFT);
        }
    }//GEN-LAST:event_txfSearchFocusGained

    private void txfSearchFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txfSearchFocusLost
        if(txfSearch.getText().trim().isEmpty()) {
            txfSearch.setText("訊息、帳號搜尋");
            txfSearch.setForeground(new java.awt.Color(153, 153, 153));
            txfSearch.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        }
    }//GEN-LAST:event_txfSearchFocusLost

txfSearch之相關設定程式

 

6. 設置txfSearch之即時顯示搜尋結果的DocumentListener - SearchTextObject

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTable;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;

/**
 * 用於處理文字方塊中一旦改變所輸入之內容,就即時顯示搜尋結果至 tabMessageList 上
 * @author Elsa
 */
public class SearchTextObject {
    
    /**
     * 即時顯示搜尋結果
     */
    public static class onValueChangedSearchWord implements DocumentListener {
        JTable tabMessageList;
        MsgTableModel msgListModel, searchListModel;
        
        public onValueChangedSearchWord(JTable tabMessageList, MsgTableModel msgListModel) {
            this.tabMessageList = tabMessageList;
            this.msgListModel = msgListModel;
        }

        @Override
        public void insertUpdate(DocumentEvent e) {       //監聽文本內容的插入事件
            searchWord(e);
        }
        
        @Override
        public void removeUpdate(DocumentEvent e) {     //監聽文本內容的刪除事件
            searchWord(e);
        }
        
        @Override
        public void changedUpdate(DocumentEvent e) {    //監聽文本屬性的變化
            //searchWord(e);
        }
        
        public void searchWord(final DocumentEvent e) {
            tabMessageList.setEnabled(true);
            Document doc = (Document)e.getDocument();
            try {
                String searchText = doc.getText(0, doc.getLength());
                if(searchText.length() > 0 && !searchText.equals("訊息、帳號搜尋")) {
                    searchListModel = new MsgTableModel();
                    for(int i = 0; i < msgListModel.getRowCount(); i++) {
                        MsgListComponent msgList = (MsgListComponent)msgListModel.getValueAt(i, 0);
                        if (msgList.getMsg().indexOf(searchText) != -1 || msgList.getAccount().indexOf(searchText) != -1) {
                            searchListModel.addRow(msgList);
                        }
                    }
                    
                    if(searchListModel.getRowCount() == 0) {
                        MsgListComponent msg = new MsgListComponent();
                        msg.setMsg(searchText + " 不在您的訊息與帳號清單中");
                        msg.setAccount("");
                        msg.setTime("");
                        searchListModel.addRow(msg);
                        tabMessageList.setEnabled(false);
                    }
                    tabMessageList.setModel(searchListModel);
                    tabMessageList.getColumnModel().getColumn(0).setCellRenderer(new MsgListCellRenderer());
                }
                else {
                    tabMessageList.setModel(msgListModel);
                    tabMessageList.getColumnModel().getColumn(0).setCellRenderer(new MsgListCellRenderer());
                }
            } catch (BadLocationException ex) {
                Logger.getLogger(SearchTextObject.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

 

7. 執行結果

執行結果_01.png

執行初始結果

 

執行結果_02.png

輸入查詢之條件「*」,即時在下述清單中顯示

執行結果_03.png

輸入之查詢條件不在清單中

 

 

 

arrow
arrow
    全站熱搜

    Elsa 發表在 痞客邦 留言(0) 人氣()