Posted on 2006-11-26 13:30
帥子 閱讀(584)
評論(0) 編輯 收藏 所屬分類:
j2se技術專區
今天需要做一個界面,JTable的其中最后一列的顯示的文字比較多,而且需要分行顯示。JTable默認所存放的CellRenderer是JTextField,無法滿足要求,經過google在網上查找相關資料,大多數實現并沒有實現根據textarear里面文字信息的多少決定textarea的高度。寫了一個實現,請大家參考一下。
package?com.ideal.ieai.adaptors.taskadaptor.usertask.view.timeout;
import?java.awt.BorderLayout;
import?java.awt.Component;
import?java.awt.FlowLayout;
import?java.awt.GridBagConstraints;
import?java.awt.GridBagLayout;
import?javax.swing.DefaultCellEditor;
import?javax.swing.JButton;
import?javax.swing.JPanel;
import?javax.swing.JScrollPane;
import?javax.swing.JTable;
import?javax.swing.JTextArea;
import?javax.swing.JTextField;
import?javax.swing.JTextPane;
import?javax.swing.border.TitledBorder;
import?javax.swing.table.DefaultTableCellRenderer;
import?javax.swing.table.DefaultTableModel;
import?javax.swing.table.TableCellEditor;
import?javax.swing.table.TableColumn;
import?javax.swing.table.TableColumnModel;
import?javax.swing.table.TableModel;
public?class?TimeoutPanel?extends?JPanel
{
????private?JScrollPane???????_scrlRules?????=?null;
????private?JTable????????????_tblRules??????=?null;
????private?JPanel????????????_panelCtrl?????=?null;
????private?JButton???????????_btnAdd????????=?null;
????private?JButton???????????_btnEdit???????=?null;
????private?JButton???????????_btnDel????????=?null;
????private?DefaultTableModel?_tblModelRules?=?null;
????private?JTextPane?????????_sumaryTxtPane?=?null;
????/**
?????*?This?is?the?default?constructor
?????*/
????public?TimeoutPanel()
????{
????????super();
????????initialize();
????}
????/**
?????*?This?method?initializes?this
?????*?
?????*?@return?void
?????*/
????private?void?initialize?()
????{
????????setLayout(new?BorderLayout());
????????add(getScrlRules(),?BorderLayout.CENTER);
????????add(getPanelCtrl(),?BorderLayout.SOUTH);
????????this.setSize(500,?400);
????}
????private?Component?getPanelCtrl?()
????{
????????if?(null?==?_panelCtrl)
????????{
????????????_panelCtrl?=?new?JPanel();
????????????_panelCtrl.setLayout(new?FlowLayout(FlowLayout.RIGHT,?4,?4));
????????????_panelCtrl.add(getBtnAdd());
????????????_panelCtrl.add(getBtnEdit());
????????????_panelCtrl.add(getBtnDel());
????????}
????????return?_panelCtrl;
????}
????private?Component?getBtnDel?()
????{
????????if?(null?==?_btnDel)
????????{
????????????_btnDel?=?new?JButton("delete");
????????}
????????return?_btnDel;
????}
????private?Component?getBtnEdit?()
????{
????????if?(null?==?_btnEdit)
????????{
????????????_btnEdit?=?new?JButton("edit");
????????}
????????return?_btnEdit;
????}
????private?Component?getBtnAdd?()
????{
????????if?(null?==?_btnAdd)
????????{
????????????_btnAdd?=?new?JButton("add");
????????}
????????return?_btnAdd;
????}
????private?Component?getScrlRules?()
????{
????????if?(null?==?_scrlRules)
????????{
????????????_scrlRules?=?new?JScrollPane();
????????????_scrlRules.getViewport().add(getTblRules());
????????}
????????return?_scrlRules;
????}
????private?Component?getTblRules?()
????{
????????if?(null?==?_tblRules)
????????{
????????????_tblRules?=?new?JTable();
????????????_tblRules.setModel(getTblModelRules());
????????????_tblRules.getColumnModel().getColumn(5).setCellRenderer(new?DefaultTableCellRenderer()
????????????{
????????????????public?Component?getTableCellRendererComponent?(?JTable?table,?Object?value,
????????????????????????boolean?isSelected,?boolean?hasFocus,?int?row,?int?column?)
????????????????{
????????????????????getSumaryTxtPane().setText((String)?value);
????????????????????TableColumnModel?columnModel?=?table.getColumnModel();
????????????????????getSumaryTxtPane().setSize(columnModel.getColumn(column).getWidth(),?100000);
????????????????????int?heightWanted?=?(int)?getSumaryTxtPane().getPreferredSize().getHeight();
????????????????????if?(heightWanted?!=?table.getRowHeight(row))
????????????????????{
????????????????????????table.setRowHeight(row,?heightWanted);
????????????????????}
????????????????????return?getSumaryTxtPane();
????????????????}
????????????});
????????}
????????return?_tblRules;
????}
????private?JTextPane?getSumaryTxtPane?()
????{
????????if?(null?==?_sumaryTxtPane)
????????{
????????????_sumaryTxtPane?=?new?JTextPane();
????????}
????????return?_sumaryTxtPane;
????}
????private?TableModel?getTblModelRules?()
????{
????????if?(null?==?_tblModelRules)
????????{
????????????_tblModelRules?=?new?DefaultTableModel()
????????????{
????????????????public?boolean?isCellEditable?(?int?row,?int?colum?)
????????????????{
????????????????????return?false;
????????????????}
????????????};
????????????_tblModelRules.addColumn("Rule?Name");
????????????_tblModelRules.addColumn("Type");
????????????_tblModelRules.addColumn("Timeout");
????????????_tblModelRules.addColumn("Task?Status");
????????????_tblModelRules.addColumn("Alert?Type");
????????????_tblModelRules.addColumn("Sumary");
????????????_tblModelRules
????????????????????.addRow(new?Object[]?{?"rule1",?"type1",?"timeout1",?"task?status",
????????????????????????????"alert?type1",
????????????????????????????"a\na\na\na"?});
????????????_tblModelRules
????????????????????.addRow(new?Object[]?{?"rule1",?"type1",?"timeout1",?"task?status",
????????????????????????????"alert?type1",
????????????????????????????"a\na\na\na"?});
????????????_tblModelRules
????????????.addRow(new?Object[]?{?"rule1",?"type1",?"timeout1",?"task?status",
????????????????????"alert?type1",
????????????????????"a\na\na\na"?});
????????????_tblModelRules
????????????.addRow(new?Object[]?{?"rule1",?"type1",?"timeout1",?"task?status",
????????????????????"alert?type1",
????????????????????"a\na\na\na"?});
????????}
????????return?_tblModelRules;
????}
}
控制的關鍵在這一段代碼:
getSumaryTxtPane().setSize(columnModel.getColumn(column).getWidth(),?100000);
其中100000可以變成>=7的數字都是可以的