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. 設置客製化之訊息樣版與程式
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. 執行結果
▲執行初始結果
▲輸入查詢之條件「*」,即時在下述清單中顯示
▲輸入之查詢條件不在清單中
全站熱搜