2013-02-22 131 views
1

基本上我有一個JTable,而這個JTabel將在一個單元格中有一個產品,然後在它下面的單元格中的成本。JTabel單個單元格文本對齊

產品名稱應該對齊到左側。 產品成本應與右側對齊。

我實際上並不關心每一行中其他單元格的對齊方式。

所以我需要設置單個單元格或單個行的對齊方式。我找到了設置表格對齊方式的方法,以及設置列對齊方式的方法,但從來沒有行/單個單元格。

SSCCE

public class Main extends JFrame{ 
    public static void main(String args[]){ 
     new Main(); 
    } 
    public Main(){ 
     super("Demo"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setExtendedState(MAXIMIZED_BOTH); 
     setVisible(true); 
     setLayout(new BorderLayout()); 
     TableModel dataModel = new AbstractTableModel() { 
      Object rows[] = new Object[50]; 
      public int getColumnCount(){return 1;} 
      public int getRowCount(){return rows.length;} 
      public Object getValueAt(int row, int col){ 
       return rows[row]; 
      } 
      public boolean isCellEditable(int row, int col){ 
       return false; 
      } 
      public void setValueAt(Object value, int row, int col) { 
       rows[row] = value; 
       fireTableCellUpdated(row,0); 
      } 
     }; 

     JTable receipt = new JTable(dataModel); 
     receipt.setBorder(BorderFactory.createEtchedBorder()); 
     receipt.setShowGrid(false); 
     add(receipt,BorderLayout.CENTER); 
     for(int i = 0; i < 10; i+=2){ 
      receipt.setValueAt("ProductNameHere",i,0); 
      receipt.setValueAt("Cost",i+1,0); 
     } 
     validate(); 
     repaint(); 
    } 
} 
+1

安裝定製的'TableCellRenderer',並設置對齊的'JLabel'裏面是適合你的。 – 2013-02-22 03:05:58

+0

根據過去的單元格渲染器的對象值,爲[sscce](http://sscce.org/)更改'DefaultTableCellRenderer' – MadProgrammer 2013-02-22 03:08:25

+0

+1的對齊方式。 – trashgod 2013-02-22 05:07:19

回答

4

default rendererNumber是右對齊的標籤。在這個example中,不需要特殊的渲染器來正確對齊INT_COL,它被標記爲Index並且具有類型Integer.class

image

如果這是沒有幫助的,請編輯您的問題,包括一個sscce顯示你當前的方法和你cost數據類型。

附錄:或者,覆蓋prepareRender(),如here所示。

image

JTable receipt = new JTable(dataModel) { 
    @Override 
    public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { 
     JLabel c = (JLabel) super.prepareRenderer(renderer, row, col); 
     if (row % 2 == 0) { 
      c.setHorizontalAlignment(JLabel.LEFT); 
     } else { 
      c.setHorizontalAlignment(JLabel.RIGHT); 

     } 
     return c; 
    } 
}; 

SSCCE:

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.EventQueue; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTable; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableModel; 

public class Main extends JFrame { 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Main(); 
      } 
     }); 
    } 

    public Main() { 
     super("Demo"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     TableModel dataModel = new AbstractTableModel() { 
      Object rows[] = new Object[10]; 

      @Override 
      public int getColumnCount() { 
       return 1; 
      } 

      @Override 
      public int getRowCount() { 
       return rows.length; 
      } 

      @Override 
      public Object getValueAt(int row, int col) { 
       return rows[row]; 
      } 

      @Override 
      public boolean isCellEditable(int row, int col) { 
       return false; 
      } 

      @Override 
      public void setValueAt(Object value, int row, int col) { 
       rows[row] = value; 
       fireTableCellUpdated(row, 0); 
      } 
     }; 

     JTable receipt = new JTable(dataModel) { 
      @Override 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { 
       JLabel c = (JLabel) super.prepareRenderer(renderer, row, col); 
       if (row % 2 == 0) { 
        c.setHorizontalAlignment(JLabel.LEFT); 
       } else { 
        c.setHorizontalAlignment(JLabel.RIGHT); 

       } 
       return c; 
      } 
     }; 
     receipt.setBorder(BorderFactory.createEtchedBorder()); 
     receipt.setShowGrid(false); 
     add(receipt, BorderLayout.CENTER); 
     for (int i = 0; i < 10; i += 2) { 
      receipt.setValueAt("ProductNameHere", i, 0); 
      receipt.setValueAt(Integer.valueOf(i + 1), i + 1, 0); 
     } 
     pack(); 
     setLocationByPlatform(true); 
     setVisible(true); 
    } 
} 
+0

我添加了一個sscce ...正如我所說,我已經知道如何實現列的單獨對齊,我需要單獨對齊的單元格或行。 – csga5000 2013-02-22 04:22:20

+0

+1,用於實現getColumnClass(),因此可以正確使用默認渲染器。 – camickr 2013-02-22 04:24:46

+0

*產品名稱應與左側對齊。產品成本應該與正確*一致。產品名稱是一列,產品成本是第二欄。根據您的要求,您需要列對齊,而不是單元對齊。你的SSCCE只顯示2列,所以我不理解你對單元格對齊的評論。 – camickr 2013-02-22 04:26:42