更改JTable Cell的背景颜色点击

时间:2014-03-06 13:53:12

标签: java swing colors jtable

我有两个问题

1.我想在鼠标点击时改变JTable Cell的颜色。我添加了一个监听器,就像在两种颜色之间切换一样,如果它当前是绿色的话,它应该转向其他点击的打击

String[][] data = new String[rows][columns];
DefaultTableModel model = new DefaultTableModel(data, header);
JTable table = new JTable(model);
table.addMouseListener(new CellClickListener());

// Using following MouseListener

public class CellClickListener extends MouseAdapter{
  public void mouseClicked(MouseEvent e) {
    JTable target = (JTable)e.getSource();
    int row = target.getSelectedRow();
    int column = target.getSelectedColumn();
    // How to getCell object here and change its background color to clicked cell
  }
}

2.如何设置不同的列宽,例如firstColumn.setWidth(20)secondColumn.setWidth(40)。我已经停用了自动调整大小table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

2 个答案:

答案 0 :(得分:2)

您必须创建自己的CellRenderer并使用MouseAdapter 这是一个SSCCE来阐明我的意思: 希望它有帮助=)

public class JTableTest extends JFrame {

    private JPanel      contentPane;
    private JScrollPane scrollPane;
    private JTable      table;
    private int         col;
    private int         rowz;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    teste frame = new teste();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public JTableTest() {
        initComponents();
    }

    private void initComponents() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        scrollPane = new JScrollPane();
        contentPane.add(scrollPane, BorderLayout.CENTER);

        table = new JTable();
        table.setModel(new DefaultTableModel(new Object[][] { { "", null, null, "" }, { null, null, null, null }, { null, null, null, "" },
                        { null, null, null, null }, }, new String[] { "Column 0", "Column 1", "Column 2", "Column 3" }));
        table.getColumnModel().getColumn(0).setMinWidth(200); // Here's how to
                                                                // change a
                                                                // column width
        scrollPane.setViewportView(table);
        table.setDefaultRenderer(Object.class, new CustomModel());
        table.addMouseListener(new CustomListener());
    }

    public class CustomListener extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent arg0) {
            super.mouseClicked(arg0);
            // Select the current cell
            rowz = table.getSelectedRow();
            col = table.getSelectedColumn();

            // Repaints JTable
            table.repaint();
        }
    }

    public class CustomModel extends DefaultTableCellRenderer {

        /**
         * 
         */
        private static final long   serialVersionUID    = 1L;

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            Color c = Color.WHITE;
            if (isSelected && row == rowz & column == col)
                c = Color.GREEN;
            label.setBackground(c);
            return label;
        }
    }

}

答案 1 :(得分:1)

我已经在同一个问题上工作了好几天。 我已经开发了一般功能

setColorAtCell(Jtable table,Color colr,int row,int column)

可以更好地完成任务。

以下是适用于上述问题的代码 您也可以查看我的github

中的代码
import java.awt.Color;

import java.awt.Component;

import javax.swing.JOptionPane;

import javax.swing.JTable;

import javax.swing.table.DefaultTableCellRenderer;



public class ChangeCellColorJTable extends javax.swing.JFrame {

    public static Color[][] table_color = new Color[40][40];
    //this array is used to change the table color

    public static Object[][] table_value = new Object[40][40];
    //this array is used to change the table values

    public ChangeCellColorJTable() {
        initComponents();
        initTable();                    //Initializing the table
        refreshtable(mytable,1,1);      
    }

    public static void initTable(){
        int i,j;
        Object[][] data = new Object[][]{
                {10,10},
                {11,11},
                {12,12},
                {13,13}
        };
        for(i = 0;i < 4;i++ ){
            for(j = 0;j<2;j++){             
                mytable.setValueAt(data[i][j], i, j);   //Setting values in Jtable    
                table_value[i][j] = data[i][j];         //Setting same values table array 
            }
        }
        for(i = 0;i<4;i++){
            for(j = 0;j<2;j++){
                table_color[i][j] = Color.getColor("#f9f4bd");  //Setting initial color of the table
                                                                //Not Mandatory
            }
        }
    }
    private void initComponents() {         //These code is to initialize the Components to be Displayed
        jScrollPane1 = new javax.swing.JScrollPane();
        mytable = new javax.swing.JTable();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        mytable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null},
                {null, null},
                {null, null},
                {null, null}
            },
            new String [] {
                "Title 1", "Title 2"
            }
        ));
        mytable.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                mytableMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(mytable);
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(13, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(13, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
       pack();
    }
    //MouseClicked on Table Event
    private void mytableMouseClicked(java.awt.event.MouseEvent evt) {           //MouseClickEvent                             
        int row,column;
        Color colr = Color.CYAN;
        JTable target = (JTable)evt.getSource();
        row = target.getSelectedRow();
        column = target.getSelectedColumn();
        setColorAtCell(mytable,colr,row,column);        
    }           

    //referesh table function by call custom_renderer
    public static void refreshtable(JTable table,int row,int column){
        int i;
        try{
            mytable.getColumnModel().getColumn(column).setCellRenderer(new Custom_Renderer());
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, "error there");
        }
    }
    //this function could be used for changing the color at specific cell
    //Provided we use a Table Color Array (table_color)
    public static void setColorAtCell(JTable table,Color colr,int row,int column){
        table_color[row][column] = colr;
        refreshtable(table,row,column);
        refreshtable(table,row,column);
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ChangeCellColorJTable().setVisible(true);
            }
        });
    }

    private javax.swing.JScrollPane jScrollPane1;
    public static javax.swing.JTable mytable;               
}


class Custom_Renderer extends DefaultTableCellRenderer 
{
    Custom_Renderer(){

    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        Object value_present = table.getValueAt(row, column);
        Object value_in_table = ChangeCellColorJTable.table_value[row][column];
        if(value_present.equals(value_in_table)){           //This condition I used so that the Specific cell come into the condition
            Color color = ChangeCellColorJTable.table_color[row][column];
            cellComponent.setBackground(color);
        }else{
            cellComponent.setBackground(Color.blue);
        }
        return cellComponent;
    }
}