前面寫了個文章,產生透明JTable,但是JTable頭部的標題部分不是透明的。不斷的學習後,終於找到將頭部也設定為透明的方法。先上效果:
代碼如下:
package ui.testworker;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Component;import java.awt.Dimension;import java.awt.GradientPaint;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Rectangle;import java.awt.Toolkit;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.ListSelectionModel;import javax.swing.UIManager;import javax.swing.table.DefaultTableCellRenderer;import javax.swing.table.JTableHeader;import javax.swing.table.TableCellRenderer;public class Simple2 extends JFrame{private static final long serialVersionUID = 1L;private static final int MIN_WIDTH = 1270;private static final int MIN_HEIGHT = 700;private Color color1 = new Color(225,237,233);private Color color2 = new Color(76,124,206);private JTable fileTable; public Simple2(){//設定為windows風格try{String windows = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; UIManager.setLookAndFeel(windows);}catch(Exception e){}addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) { System.exit(0);}});/* * 產生一個panel,並將panel的背景繪製成指定顏色 * 然後將使用setContentPane方法將視窗的panel設定為這個panel */JPanel jp = new JPanel(){private static final long serialVersionUID = 1L;protected void paintComponent(Graphics g){ //使用Graphics2D繪製漸層色彩Graphics2D g2d = (Graphics2D) g;g2d.setPaint(new GradientPaint(0, 0, color1, this.getWidth(), this.getHeight(), color2));g2d.fill(new Rectangle(0, 0,this.getWidth(), this.getHeight()));} };this.setContentPane(jp);this.setLayout(new BorderLayout()); initTable();/* * 這裡將JScrollPane設定為透明的。 * JScrollPane包括好幾個部分,一個是本身,另一個是中間的viewport,還有頭部的headerview, * 左邊的rowview,右邊和下面的捲軸。 * 對於一個預設添加jtable的JScrollPane,它至少包括JScrollPane自己的邊緣、頭部的標題和中間的JTABLE * 若只將JScrollPane設定為透明,則只是邊緣透明,中間的viewport(也就是容納表格的地方)和頭部依然不透明 * 因此需要將它們都設定為透明,但是需要注意的是,頭部要先手動添加jtable的頭部,然後再取出頭部,再設定為透明 * 否則,會報null 指標錯誤 */JScrollPane scrollPane = new JScrollPane();scrollPane.getViewport().setOpaque(false);//將JScrollPane設定為透明scrollPane.setOpaque(false);//將中間的viewport設定為透明scrollPane.setViewportView(fileTable);//裝載表格scrollPane.setColumnHeaderView(fileTable.getTableHeader());//設定頭部(HeaderView部分)scrollPane.getColumnHeader().setOpaque(false);//再取出頭部,並設定為透明getContentPane().add(scrollPane,BorderLayout.CENTER);Toolkit tk = this.getToolkit();Dimension dm = tk.getScreenSize();//視窗啟動時,在螢幕中間this.setBounds((dm.width - MIN_WIDTH) / 2,(dm.height - MIN_HEIGHT) / 2, MIN_WIDTH, MIN_HEIGHT);this.setVisible(true);}private void initTable(){//初始化tableString[] columnName = new String[]{"檔案名稱","大小","使用者","上傳時間"};Object[][] columnValues = new Object[][]{{"楚留香傳奇","232134 KB","fykhlp","2012-07-28 19:36:21"},{"楚留香傳奇","232134 KB","fykhlp","2012-07-28 19:36:21"},{"楚留香傳奇","232134 KB","fykhlp","2012-07-28 19:36:21"},{"楚留香傳奇","232134 KB","fykhlp","2012-07-28 19:36:21"},{"楚留香傳奇","232134 KB","fykhlp","2012-07-28 19:36:21"}};fileTable = new JTable(columnValues,columnName);fileTable.setRowHeight(25); fileTable.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN); fileTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); fileTable.setIntercellSpacing(new Dimension(0, 0)); /* * 將表格設定為透明,表格同樣包括表格本身和其中的內容項 * 僅僅將表格本身設定為透明也沒有用,應該將其中的內容項也設定為透明 * 內容項的設定是通過設定渲染器的透明來實現 */fileTable.setOpaque(false);DefaultTableCellRenderer render = new DefaultTableCellRenderer(); render.setOpaque(false); //將渲染器設定為透明//將這個渲染器設定到fileTable裡。//這個設定在沒有另外專門對column設定的情況下有效//若你對某個column特殊指定了渲染器,則對於這個column,它將不調用render渲染器//因此為了保證透明,如果你對column額外指定了渲染器,那麼在額外的渲染器裡也應該設定透明fileTable.setDefaultRenderer(Object.class,render);//設定顯示範圍Dimension viewSize = new Dimension(); viewSize.width = fileTable.getColumnModel().getTotalColumnWidth(); ; viewSize.height = 10 * fileTable.getRowHeight(); fileTable.setPreferredScrollableViewportSize(viewSize); //設定頭部透明 //頭部實際上也是一個JTABLE,只有一行而已。 JTableHeader header = fileTable.getTableHeader();//擷取頭部 header.setPreferredSize(new Dimension(30, 26)); header.setOpaque(false);//設定頭部為透明 header.getTable().setOpaque(false);//設定頭部裡面的表格透明 /* * 頭部的表格也像前面的表格設定一樣,還需要將裡面的單元項設定為透明 * 因此同樣需要對頭部單元項進行透明度設定,這裡還是用渲染器。 */ header.setDefaultRenderer(render); TableCellRenderer headerRenderer = header.getDefaultRenderer(); if (headerRenderer instanceof JLabel) { ((JLabel) headerRenderer).setHorizontalAlignment(JLabel.CENTER); ((JLabel) headerRenderer).setOpaque(false); }}public static void main(String[] args){new Simple2();}}
其實要想實現這些透明度,關鍵就是對JScrollPane有瞭解,這裡附送一張JScrollPane圖
這裡的header不太好看,主要是連分割線都看不見了,因此在下一章繼續改進