2013-02-22 5 views
1

기본적으로 나는 JTable을 가지고 있으며이 JTabel은 하나의 셀에 제품이 있고 그 다음 셀 바로 아래에 셀이 있습니다.JTabel 개별 셀 텍스트 정렬

제품 이름은 왼쪽에 맞춰야합니다. 제품 원가는 오른쪽에 맞추어야합니다.

저는 실제로 각 행의 다른 셀의 정렬이 무엇인지 신경 쓰지 않습니다.

그래서 개별 셀 또는 개별 행의 정렬을 설정해야합니다. 테이블의 정렬을 설정하는 방법과 열의 정렬을 설정하는 방법을 찾았지만 결코 행/개별 셀을 찾지 못했습니다.

sscce : Number에 대한

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'에 정렬을 설정합니다. –

+0

셀 렌더러 이전의 객체 값을 기준으로 [Default] 셀 링크 렌더러 – MadProgrammer

+0

+1의 [sscce] (http://sscce.org/)에 대한 정렬을 변경합니다. – trashgod

답변

4

default renderer는 오른쪽 정렬 레이블입니다. 이 example에는 Index으로 레이블이 지정되고 Integer.class 유형 인 INT_COL을 오른쪽으로 정렬하는 데 특별한 렌더러가 필요하지 않습니다. 이 도움이되지 않으면

image

는 현재의 접근 방식을 보여줍니다 sscce하고 cost 데이터 유형을 포함하도록 질문을 수정하시기 바랍니다.

부록 : here과 같이 prepareRender()을 대체하십시오.

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

+0

+1, getColumnClass()를 구현하기 위해 기본 렌더러를 올바르게 사용할 수 있습니다. – camickr

+0

* 제품 이름은 왼쪽으로 정렬해야합니다. 제품 원가는 오른쪽에 맞추어야합니다 *. 제품 이름은 열이고 제품 비용은 두 번째 열입니다. 요구 사항에 따라 셀 정렬이 아닌 열 맞춤이 필요합니다. SSCCE는 2 열만 표시하므로 셀 맞춤에 대한 의견을 이해할 수 없습니다. – camickr