JTable的使用,以及使用JTextArea和DefaultTableCellRenderer達到居中或者多行顯示的效果

JTable中令單元格能夠既居中且文本自動換行顯示的話,本人暫時沒有找到好方法。

但是在JTable中混合使用JTextArea和DefaultTableCellRenderer能夠,讓指定某一行居中或者多行顯示文本。


InfoDialog.java

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

public class InfoDialog extends JDialog {

	private static final int WIDTH = 700;
	private static final int HEIGHT = 750;

	private ShowInfoDialog(JFrame owner,String[][]datas) {

		setSize(WIDTH, HEIGHT);
		setVisible(true);
		JTable table = this.drawTable(datas);
		add(table);
	}

	private JTable drawTable(String[][] datas){
		String [] titles = {"名稱","地址","電話","郵件"};
		
		DefaultTableModel  model = new DefaultTableModel(datas,titles){
			public boolean isCellEditable(int row, int col){
				return false;
			}
		};
		
		JTable table = new JTable(model);
		JTableHeader tableHeader = table.getTableHeader();  
        	tableHeader.setReorderingAllowed(false);//表格列不可移動  
        	//表頭加寬加高
        	tableHeader.setPreferredSize(new Dimension(tableHeader.getWidth(),tableHeader.getHeight()+70));
        	//表頭字體的大小
       		tableHeader.setFont(new Font("微軟雅黑", Font.PLAIN, 26));
       		//自定義的單元格自動加高
       		table.getColumnModel().getColumn(0).setPreferredWidth(100);
       		table.getColumnModel().getColumn(1).setPreferredWidth(100);
        	table.getColumnModel().getColumn(2).setPreferredWidth(100);
        	table.getColumnModel().getColumn(3).setPreferredWidth(100);
        	table.setDefaultRenderer(Object.class, new TableCellTextAreaRenderer());//表格默認爲<span style="font-family:Arial, Helvetica, sans-serif;">自動換行</span>
<span style="white-space:pre">		</span>//對第三列設置爲文本居中
        	AlignmentCenterTabelCellRenderer render = new AlignmentCenterTabelCellRenderer();
        	table.getColumnModel().getColumn(2).setCellRenderer(render);
        	table.setEnabled(false);
        
		return table;
	}
}


AlignmentCenterTabelCellRenderer繼承DefaultTableCellRenderer,重寫getTableCellRendererComponent方法,設定單元格中的文本內容以及格式等等。


AlignmentCenterTabelCellRenderer.java

import java.awt.*
import javax.swing.*

public class AlignmentCenterTabelCellRenderer extends DefaultTableCellRenderer{ 
	   public AlignmentCenterTabelCellRenderer() { 
		   setHorizontalAlignment(SwingConstants.CENTER);//設置爲水平方向居中
	       setVerticalAlignment(SwingConstants.TOP);
	   } 
	   public Component getTableCellRendererComponent(JTable table, Object value, 
	           boolean isSelected, boolean hasFocus, int row, int column) { 
	       // 計算當下行的最佳高度 
	       int maxPreferredHeight = 0; 
	       for (int i = 0; i < table.getColumnCount(); i++) { 
	    	  setText("  " + table.getValueAt(row, i)); 
	          setSize(table.getColumnModel().getColumn(column).getWidth(), 0); 
	          maxPreferredHeight = Math.max(maxPreferredHeight, getPreferredSize().height); 
	       } 
	       
	       if (table.getRowHeight(row) != maxPreferredHeight)
	         table.setRowHeight(row, maxPreferredHeight); 
	       
	         setFont(new Font("微軟雅黑", Font.PLAIN, 15));
	         setText(value == null ? "" : value.toString()); 
	         if(row%2 == 0){
				setBackground(Color.decode("#E0FFFF")); // 設置奇數行底色
			}else if(row%2 == 1){
				setBackground(Color.decode("#FFFAFA")); // 設置奇數行底色
			 }
	       return this; 
	   } 
	} 


TableCellTextAreaRenderer 繼承JTextArea ,重寫getTableCellRendererComponent方法,與AlignmentCenterTabelCellRenderer相似。


TableCellTextAreaRenderer .java

import javax.swing.*; 
import javax.swing.table.*; 

import java.awt.*; 

public class TableCellTextAreaRenderer extends JTextArea implements TableCellRenderer { 
   public TableCellTextAreaRenderer() { 
       setLineWrap(true); //設置爲換行
       setWrapStyleWord(true); //設置使用單詞邊界來換行
   } 

   public Component getTableCellRendererComponent(JTable table, Object value, 
           boolean isSelected, boolean hasFocus, int row, int column) { 
       // 計算當下行的最佳高度 
       int maxPreferredHeight = 0; 
       for (int i = 0; i < table.getColumnCount(); i++) { 
    	   setText("  " + table.getValueAt(row, i)); 
           setSize(table.getColumnModel().getColumn(column).getWidth(), 0); 
           //setMargin(new Insets(0,10,0,10));
           maxPreferredHeight = Math.max(maxPreferredHeight, getPreferredSize().height); 
       } 
       
       if (table.getRowHeight(row) != maxPreferredHeight)
         table.setRowHeight(row, maxPreferredHeight); 
       
         setFont(new Font("微軟雅黑", Font.PLAIN, 15));
         setText(value == null ? "" : value.toString()); 
         if(row%2 == 0){
			setBackground(Color.decode("#E0FFFF")); // 設置奇數行底色
		}else if(row%2 == 1){
			setBackground(Color.decode("#FFFAFA")); // 設置奇數行底色
		 }
       return this; 
   } 
} 

最後調用即可:

public static void main(String[] args) {
		String [][]datas = {{"小明","中國","12739382","13"},{"小白","美國","2383539382","19"}};
		InfoDialog.ShowInfoDialog(null,datas);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章