2012-08-08 50 views
1

我的目标是创建一个JTable,并仅渲染最左列单元格,目的是为表格创建行标题。Java JTable:如何为简单行标题目的渲染左列单元格

我在网上遇到过的所有行表格例子看起来很复杂或不符合我的目的,所以我想知道有没有简单的方法通过渲染左列单元格来创建JTable行标题?

下面我有一个简单的表2列和两行的代码。是否有人可以修改这个问题,或者用简单的术语解释,我如何才能为了行标题目的渲染最左边的列。

谢谢。

import javax.swing.*; 
import java.awt.*; 
import javax.imageio.*; 
import java.io.*; 
import java.awt.image.BufferedImage; 
import java.util.*; 
public class GUITable extends JFrame{public GUITable(){ 


init(); 
    } 

    public final void init(){ 
    String[] columnNames = {"", "Gross Weight"}; 

    Object[][] data = { 
    {"", new Integer(100)},}; 

    final JTable table = new JTable(data, columnNames); 
    table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
    table.setFillsViewportHeight(true); 

    JScrollPane scrollPane = new JScrollPane(table); 
    add(scrollPane); 
} 

    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 

public void run() { 
try { 
    UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
    GUITable ex = new GUITable(); 
    ex.setVisible(true); 
    } 
    }); 
    } 
} 
+0

所以这会是一些像Excel中的固定列? – MadProgrammer 2012-08-08 07:38:39

回答

1

是 - 通过使用自定义TableCellRenderer,您可以修改的方式显示第一列(仅第一列)。

从本质上讲,你可以用它来设置TableCellRenderer仅在第一列:

table.getColumnModel().getColumn(0).setCellRenderer(new CustomRenderer()); 

而且可以延长DefaultTableCellRenderer照顾任何特殊的渲染,你想做的事:

//Custom Renderer - does the default rendering except if told the row should be a different color 
public static class CustomRenderer extends DefaultTableCellRenderer{ 

    public CustomRenderer(){ 
     super(); 
     //Customize the rendering however you want 
     setBackground(UIManager.getColor("TableHeader.background")); 
    } 
} 

把它放在你的例子中:

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

import java.awt.*; 
public class TestTable extends JFrame{ 

    public TestTable(){ 
     init(); 
    } 

    public final void init(){ 
     String[] columnNames = {"", "Gross Weight"}; 

     Object[][] data = {{"", new Integer(100)},}; 

     final JTable table = new JTable(data, columnNames); 
     // Add Renderer to first column only 
     table.getColumnModel().getColumn(0).setCellRenderer(new CustomRenderer()); 
     table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
     table.setFillsViewportHeight(true); 

     JScrollPane scrollPane = new JScrollPane(table); 
     scrollPane.setPreferredSize(new Dimension(300, 200)); 
     add(scrollPane); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       try { 
        UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       TestTable ex = new TestTable(); 
       ex.pack(); 
       ex.setVisible(true); 

      } 
     }); 
    } 

    //Custom Renderer - does the default rendering except if told the row should be a different color 
    public static class CustomRenderer extends DefaultTableCellRenderer{ 

     public CustomRenderer(){ 
      super(); 
      //Customize the rendering however you want 
      setBackground(UIManager.getColor("TableHeader.background")); 
     } 
    } 

} 
+0

太棒了,谢谢! – Jnanathan 2012-08-10 09:42:18

1

您的代码示例可以

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

public class GUITable extends JFrame { 

    public GUITable() { 
     init(); 
    } 

    public final void init() { 
     String[] columnNames = {"", "Gross Weight"}; 
     Object[][] data = {{"", new Integer(100)},}; 
     final JTable table = new JTable(data, columnNames); 
     table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
     table.setFillsViewportHeight(true); 
     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
    } 

    public static void main(String[] args) { 
     try { 
      UIManager.setLookAndFeel(
       "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");//Java6 
      //UIManager.setLookAndFeel(
       //"javax.swing.plaf.nimbus.NimbusLookAndFeel");//Java7 
     } catch (Exception fail) { 
     } 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 

       GUITable ex = new GUITable(); 
       ex.setVisible(true); 
      } 
     }); 
    } 
} 

不是从你的描述确定,你的意思Row Number Table by @camickr或其他half_sized attempt

+0

mKorbel,谢谢你的回复。你的“半身”尝试更接近我所期望的。有没有更简单的方法来实现行头渲染,通过访问列索引并将其渲染为头部的索引? – Jnanathan 2012-08-08 07:40:54

+0

'有没有更简单的',据我所知,在大多数情况下JTable不希望工作添加/删除行,也没有正确的RowSorter或RowFilter,最好可以使用@camickr代码,当然也许在那里是另一个代码 – mKorbel 2012-08-08 07:52:15