2013-02-22 3 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' внутри него по мере необходимости для клетки. –

+0

Основываясь на значении объекта, переданном в обработчик ячеек, измените выравнивание «DefaultTableCellRenderer» – MadProgrammer

+0

+1 для [sscce] (http://sscce.org/). – trashgod

ответ

4

default renderer для Number является выравнивание по правому краю этикетки. В этом 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

+0

+1, для реализации getColumnClass(), поэтому рендеринг по умолчанию можно использовать правильно. – camickr

+0

* Название продукта должно быть выровнено влево. Стоимость продукта должна быть выровнена вправо *. Название продукта - это столбец, а стоимость продукта - второй столбец. На основе вашего требования вам потребуется выравнивание столбцов, а не выравнивание ячеек. Ваш SSCCE показывает только 2 столбца, поэтому я не понимаю ваш комментарий о выравнивании ячеек. – camickr

Смежные вопросы