当前位置: 首页 > 知识库问答 >
问题:

如何在表格单元格编辑器中给出JTable单元格选择的背景色和前景色

督建柏
2023-03-14

我找到了在点击JTable标题时选择特定列的代码。对于我的模块,如果有人选择一个JTable单元格,则必须删除之前选择的所有列。我成功地更改了表。setColumnSelectionAllowed(真) 表格。setRowSelectionAllowed(假) 或者在单元格编辑器中。

现在

  1. 我无法恢复默认选择的前景色和背景色
  2. 一旦在单元格选择后选择了表头,则无法清除上一个表格单元格选择

头ocation.java

public class HeaderLocation {  
    private JTable getTable() {  
        int rows = 32, cols = 4;  
        String[] colIds = { "column 1", "column 2", "column 3", "column 4" };  
        Object[][] data = new Object[rows][cols];  
        for(int row = 0; row < rows; row++) {  
            for(int col = 0; col < cols; col++) {  
                data[row][col] = "item " + (row*cols+col+1);  
            }  
        }  
        DefaultTableModel model = new DefaultTableModel(data, colIds);  
        final JTable table = new JTable(model);  
        final JTableHeader header = table.getTableHeader();  
        Enumeration<TableColumn> columns = table.getColumnModel().getColumns();
        while(columns.hasMoreElements()){
            columns.nextElement().setCellEditor(new CustomCellEditor());
        }
        //table.setCellEditor(new CustomCellEditor());
        header.setReorderingAllowed(false);  
        header.addMouseListener(new MouseAdapter() {  
            public void mouseClicked(MouseEvent e) {  
                int col = header.columnAtPoint(e.getPoint());  
                System.out.printf("click cursor = %d%n",  
                                   header.getCursor().getType());  
                if(header.getCursor().getType() == Cursor.E_RESIZE_CURSOR)  
                    e.consume();  
                else {  
                    //System.out.printf("sorting column %d%n", col); 
                    table.setColumnSelectionAllowed(true);
                    table.setRowSelectionAllowed(false);
                    table.clearSelection();
                    table.setColumnSelectionInterval(col,col);
                    //tableModel[selectedTab].sortArrayList(col);  
                }  
            }  
        });  

        return table;  
    }  

    private JMenuBar getMenuBar() {  
        final JMenu view = new JMenu("view");  
        ActionListener l = new ActionListener() {  
            public void actionPerformed(ActionEvent e) {  
                JMenuItem item = (JMenuItem)e.getSource();  
                String className = item.getActionCommand();  
                changePLAF(className, view.getTopLevelAncestor());  
            }  
        };  
        UIManager.LookAndFeelInfo[] info = UIManager.getInstalledLookAndFeels();  
        for(int j = 0; j < info.length; j++) {  
            JMenuItem item = new JMenuItem(info[j].getName());  
            item.setActionCommand(info[j].getClassName());  
            item.addActionListener(l);  
            view.add(item);  
        }  
        JMenuBar menuBar = new JMenuBar();  
        menuBar.add(view);  
        return menuBar;  
    }  

    private void changePLAF(String className, Component c) {  
        try {  
            UIManager.setLookAndFeel(className);  
        } catch(ClassNotFoundException cnfe) {  
            System.err.println("class not found: " + cnfe.getMessage());  
        } catch(InstantiationException ie) {  
            System.err.println("instantiation: " + ie.getMessage());  
        } catch(IllegalAccessException iae) {  
            System.err.println("illegal access: " + iae.getMessage());  
        } catch(UnsupportedLookAndFeelException ulafe) {  
            System.err.println("unsupported laf: " + ulafe.getMessage());  
        }  
        SwingUtilities.updateComponentTreeUI(c);  
    }  

    public static void main(String[] args) {  
        HeaderLocation test = new HeaderLocation();  
        JFrame f = new JFrame();  
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        f.setJMenuBar(test.getMenuBar());  
        f.getContentPane().add(new JScrollPane(test.getTable()));  
        f.pack();  
        f.setLocation(200,200);  
        f.setVisible(true);  
    }  
}  

CustomCellEditor.java

public class CustomCellEditor extends AbstractCellEditor implements TableCellEditor{

    private JComponent component = new JLabel();

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        System.out.println(row + "," + column);
        //if(getClickCountToStart() == 2)
        //{
        try{    
            table.clearSelection();
            table.setColumnSelectionAllowed(false);
            table.setRowSelectionAllowed(false);
        }
        catch(Exception e)
        {
            System.out.println("Exception::->" + e.getMessage());
        }
        //}
         // Configure the component with the specified value
        component.setOpaque(isSelected);
        ((JLabel)component).setText((String)value);
        component.setForeground(table.getSelectionForeground());
        component.setBackground(table.getSelectionBackground());
        component.setEnabled(false);
        // Return the configured component
        return component;
        }

    @Override
    public Object getCellEditorValue() {
        // TODO Auto-generated method stub
        return ((JLabel)component).getText();
    }
}

我真的非常感谢与此相关的任何帮助。


共有2个答案

高功
2023-03-14

谢谢克利奥帕特拉。我刚刚为桌上鼠标侦听器添加了如下代码:-

table.addMouseListener(new MouseAdapter() {  
            public void mouseClicked(MouseEvent e) {  

                    //System.out.printf("sorting column %d%n", col); 
                    table.setColumnSelectionAllowed(false);
                    table.setRowSelectionAllowed(false);
                    table.setCellSelectionEnabled(true);
                    //tableModel[selectedTab].sortArrayList(col);  

            }  
        });  

这将解决问题。刚刚删除了所有的单元格编辑器代码。有一个初始的列选择,但效果很好。

公冶经纶
2023-03-14
new JTable( model )
        {
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
            {
                Component c = super.prepareRenderer(renderer, row, column);

                //  Color row based on a cell value

                if (isRowSelected(row)){ //When A row is selected
                                   c.setBackground(getBackground());//Set Background
                                   c.setForeground(color.RED);
                }

                return c;
            }
// Use if(!isRowSelected(row)){} if want to change non-selected row color or background
}
 类似资料:
  • 问题内容: 我正在尝试使用渲染器为jTable的单元格上色,但是它们工作不佳,因为它们滞后于表格并且无法看到。这是我的代码: 我没有将其放入rendererclass中,因为它滞后了,我将其放入cicle的双精度中,具体地说,放入了第二个cicle。我希望它为超过24的单元格上色,如果现在我写的话,那是行不通的 它使桌子完全着色 编辑 按照要求,我创建了一个描述我的问题的小示例,我不知道是否存在发

  • 我有一个Table,我使用我自己的自定义LabelProvider来显示背景和前景颜色。 由此我得出,我无法更改选择的背景色。因此,我想能够改变前景色的文字选择后。但是,我不知道如何检测是否选择了特定的行,以便提供不同的前景色。 任何帮助将不胜感激,我不太精通swt。 编辑:对于任何搜索这是我所做的

  • 问题内容: 我正在使用Vaadin,我想为我的表格/表格中的特定单元格设置背景色,或者如果无法为特定表格中的单元格设置背景色,我想至少为表格/表格中的特定单元格设置字体颜色。我有一个表格/表格的代码TableView如下: 表格/表格的内容类为: 如果可以将背景颜色设置为特定的单元格,或者至少设置字体颜色,并且您知道该怎么做,请写信。例如,在表格/表格中单元格的值为“ 1”的情况下,我想将其设置为

  • 问题内容: 我想更改tkinter.treeview中选定单元格的前景色或背景色。我怎样才能做到这一点? 此链接显示了更改树视图中所有单元格颜色的命令,但我无法在单个单元格中使用它。 我以前写过一个测试代码。请使用此代码得出您的解决方案/建议。谢谢。 该链接显示了如何使用标记来更改数据行(即所选项目)而不是单元格的颜色。 问题答案: @BryanOkley分享到,不能更改ttk.Treeview中

  • 我想改变JTable的单元格背景颜色,想从MySQL数据库中获取数据。 我在MySQL中使用一个数据表,它有一个状态字段。如果状态为1,则单元格背景颜色应为红色;如果状态为0,则应更改为红色。

  • 我有一个简单的word文档,其中有一个表,包含一行和两列(换句话说,两个单元格)。第一个单元格的背景色是红色,另一个是黑色。我想使用python-docx将两者都改为白色。 我已经尝试了几种方法,但似乎最有希望的是下面的方法。它修改基础XML。 上面的代码将第一个单元格修改为白色,而将第二个单元格保留为黑色。我试图修改第二个单元格,方法是在之前添加以下代码: 问题是,现在,第一个单元格仍然是红色的