Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > TableCellRenderer


Автор: aquaserpent 28.9.2005, 14:18
Имеется следующий кусок кода (первые 2 столбца таблицы отрисовываются синим):
Код
// ....
       TableColumn column = table.getColumn(table.getColumnName(0));
       column.setCellRenderer(new ColumnRenderer());
       column = table.getColumn(table.getColumnName(1));
       column.setCellRenderer(new ColumnRenderer());
// ....
public class ColumnRenderer extends DefaultTableCellRenderer 
   {
       public Component getTableCellRendererComponent(JTable table, Object value,
                       boolean isSelected, boolean hasFocus, int row, int column) 
       {
           if(column == 0 || column == 1) 
           {
               setForeground(Color.blue);
           }
           else 
           {
               setForeground(Color.BLACK);
           }
           return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
       }
   } 

Что нужно добавить, чтобы при все при этом заголовок таблицы был отрисован жирным шрифтом (все равно каким)? Если добавляю
Код
table.getTableHeader().setDefaultRenderer(new ColumnRenderer ());
то отрисовывавется только заголовок таблицы и всё.

Автор: gretchen_ 28.9.2005, 15:12
Как насчёт

table.setDefaultRenderer(...)

Автор: igon 29.9.2005, 03:49
Код

// ....
       ColumnRenderer myColumnRenderer = new ColumnRenderer();
       TableColumn column = table.getColumn(table.getColumnName(0));
       column.setCellRenderer(myColumnRenderer);
       column.setHeaderRenderer(myColumnRenderer); // Обязательно!!
...
// ....
public class ColumnRenderer extends DefaultTableCellRenderer 
   {
    JLabel component;
    Font font = new Font(null,Font.BOLD|Font.ITALIC,16);

    public Component getTableCellRendererComponent(JTable  table, 
                                                   Object  value,
                                                   boolean isSelected, 
                                                   boolean hasFocus, 
                                                   int     row, 
                                                   int column) 

      {

        component = new JLabel(value.toString());
        if(row == -1) // Отрисовывается Header 
          {
            component.setFont(font);
          }
        if(column == 0 || column == 1) 
          {
            component.setForeground(Color.BLUE);
          }
        else 
          {
            component.setForeground(Color.RED); // Если Renderer "повешен"  и на другие столбцы
          }
        return component;
      }
   } 

Автор: aquaserpent 29.9.2005, 09:16
Я уже сам до этого дошел, оказалось все просто. Я вызывал getTableCellRendererComponent после SetFont, поэтому и не работало.
Но все равно спасибо.

Автор: baroleg 4.10.2006, 17:06
Вопрос по теме:
Как изменить компонент(в заголовке столбца) при наезде мышкой на него?
У меня получается так:изменения отображаються только после того как таблица перекроеться

Автор: powerOn 4.10.2006, 17:36
Цитата(baroleg @  4.10.2006,  18:06 Найти цитируемый пост)
У меня получается так:изменения отображаються только после того как таблица перекроеться


Давай код выкладывай, посмотрим...

Цитата(baroleg @  4.10.2006,  18:06 Найти цитируемый пост)
Как изменить компонент(в заголовке столбца) при наезде мышкой на него?

А вообще нужно повесить слушателя для мыши на JTableHeader, связанный с твоей таблицей и обрабатывать mouseEntered с mouseExited.

Автор: baroleg 4.10.2006, 17:44
вот класс рисовальщика:
Код

class MyHeaderRender extends DefaultTableCellRenderer {
    JLabel comp;

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        comp.setText(value.toString());
        return comp;
    }

    public MyHeaderRender() {
        super();
        comp = new JLabel("");
        comp.setHorizontalAlignment(JLabel.CENTER);
        comp.setFont(new Font("Tahoma", Font.PLAIN, 12));
        comp.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
        comp.setBackground(Color.WHITE);
        comp.setOpaque(true);
    }
}


вот место где пытаемся изменить:
Код

        JTableHeader th = result.getTableHeader();
        th.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseMoved(MouseEvent e) {
                int col = result.columnAtPoint(e.getPoint());
                col = result.convertColumnIndexToModel(col);
                TableColumn tc = result.getColumnModel().getColumn(col);
                MyHeaderRender ren=new MyHeaderRender();
                ren.comp.setBackground(Color.YELLOW);
                tc.setHeaderRenderer(ren);
            }

        });


т.е. меняеться когда мышкой кликнем по столбцу

Автор: powerOn 4.10.2006, 19:08
Вот что получилось:
Код

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.border.BevelBorder;
import javax.swing.table.DefaultTableCellRenderer;

public class NewJFrame extends javax.swing.JFrame {
   
    /** Creates new form NewJFrame */
    public NewJFrame() {
        setLocationRelativeTo(null);
        initComponents();
        pack();
        
        jTable1.getTableHeader().setDefaultRenderer(new MyHeaderRenderer());
        
        jTable1.getTableHeader().addMouseListener(new MouseAdapter() {
            public void mouseExited(MouseEvent e) {
                MyHeaderRenderer r = (MyHeaderRenderer) jTable1.getTableHeader().getDefaultRenderer();
                r.setPos(-1);
                jTable1.getTableHeader().repaint();
            }
        });
        
        jTable1.getTableHeader().addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseMoved(MouseEvent e) {
                super.mouseMoved(e);
                MyHeaderRenderer r = (MyHeaderRenderer) jTable1.getTableHeader().getDefaultRenderer();
                r.setPos(jTable1.columnAtPoint(e.getPoint()));
                jTable1.getTableHeader().repaint();
            }
            
        });
    }

    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(jTable1);

        getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-229)/2, (screenSize.height-170)/2, 229, 170);
    }
    
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration                   
    
}

 class MyHeaderRenderer extends DefaultTableCellRenderer {
    JLabel comp;
   
    private int pos = -1;
    
    public MyHeaderRenderer() {
        super();
        comp = new JLabel("");
        comp.setHorizontalAlignment(JLabel.CENTER);
        comp.setFont(new Font("Tahoma", Font.PLAIN, 12));
        comp.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
        comp.setOpaque(true);
    }
    
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        comp.setText(value.toString());
        
        if (column == getPos()) {
            comp.setBackground(Color.GREEN);
        } else if (column != -1) {
            comp.setBackground(Color.WHITE);
        }
        return comp;
    }

    public int getPos() {
        return pos;
    }

    public void setPos(int pos) {
        this.pos = pos;
    }
}

Автор: baroleg 5.10.2006, 09:03
все работает, отлично.
Спасибо. smile 

Автор: powerOn 5.10.2006, 10:05
пожалуйста. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)