繁体   English   中英

JTable/setDefaultRenderer 多选行

[英]JTable/setDefaultRenderer Multiple Selected Rows

我已经在整个互联网上进行了搜索,但找不到解决我问题的可行解决方案。

我有一个JTable ,我想动态更改多行的背景颜色而不影响其他行的背景颜色,这些颜色可能已经被更改。

颜色变化由ContextMenuJMenuItem上的actionListener触发,如下所示:

在此处输入图片说明

到目前为止,我尝试的代码如下:

    JMenu highlightMenu = new JMenu("Highlight");

    // Add null
    for (Color color : Arrays.asList(Color.RED, Color.ORANGE, Color.YELLOW, Color.GREEN, Color.BLUE, Color.MAGENTA,
        Color.PINK, Color.GRAY)) {
      JMenuItem x = new JMenuItem();
      x.setOpaque(true);
      x.setBackground(color);

      highlightMenu.add(x);

      x.addHierarchyListener(e -> x.setText(tab.getTable()
          .getValueAt(tab.getTable().getSelectedRow(), tab.getTable().getColumn("Server").getModelIndex()).toString()));

      x.addActionListener(e -> IntStream.of(tab.getTable().getSelectedRows())
          .forEach(row -> ((Component) tab.getTable().getModel().getValueAt(row, 0)).setBackground(color)));

      // x.addActionListener(e -> {
      // IntStream.of(tab.getTable().getSelectedRows())
      // .forEach(r -> tab.getTable().setDefaultRenderer(Object.class, new
      // DefaultTableCellRenderer() {
      // @Override
      // public Component getTableCellRendererComponent(JTable table, Object value,
      // boolean isSelected,
      // boolean hasFocus, int row, int column) {
      // Component comp = super.getTableCellRendererComponent(table, value,
      // isSelected, hasFocus, row, column);

      // if (r == row) {
      // comp.setBackground(color);
      // } else {
      // comp.setBackground(null);
      // }

      // return comp;
      // }
      // }));

      // tab.getTable().repaint();
      // });
    }

如果有人有有效的解决方案,请分享,将不胜感激! 😁

您可以保留将行索引映射到颜色的地图,并在您的默认渲染器中使用它。 在动作侦听器中,您只需将具有指定颜色的行索引放入此映射中。

如果您使用Object.class作为列类型,则只需为表设置一次默认渲染器。

final Map<Integer, Color> highlightedRows = new HashMap<>();
highlightedRows.put(1, Color.GREEN);
highlightedRows.put(2, Color.YELLOW);
    
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
        
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        final var cmp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        cmp.setBackground(highlightedRows.get(row));
        return cmp;
    }
});

结果

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM