JTable:单击按钮时更改单元格背景

时间:2011-06-27 01:00:08

标签: java jtable render background-color

我知道在jtable中更改单元格背景是通过创建一个新的cellrenderer类来完成的。我做到了。我已经读过有关DefaultTableRenderer“颜色记忆”的问题,但我无法弄清楚如何为我的特定目的解决它。

我的目标很简单:单击按钮时,更改jtable中所有选定单元格的背景颜色。

我为事件设置了足够的方法调用,但是我无法让渲染器以我想要的方式工作。

我将所有选定的单元格存储在TableCells的一个arraylist中(一个包含行,列和单元格的文本字符串数据的类)。这是我在CustomCellRenderer中的getTableCellRendererComponent的代码。

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
  {
     for(TableCell c: selectedCells)
     {
         if(c.row ==row && c.col == column)
         {
             this.setBackground(Color.black);
         }
         else
         {
             this.setBackground(Color.BLUE);
         }
     }
     return this;
  }

此代码将所有表格单元格背景的背景设置为蓝色。显然,我需要一些不同的逻辑来解决这个颜色记忆问题。对此的任何想法都会很棒。

感谢。

1 个答案:

答案 0 :(得分:3)

如何给你的渲染器类一个布尔变量,比如btnClicked初始化为false但在按钮的ActionListener中设置为true,这是一个监听器,它也指示表重绘自己。然后在渲染器本身中,您可以使用selected属性来查看是否选择了单元格。也许是这样的事情:

   private boolean btnClicked = false;

   public void setBtnClicked(boolean btnClicked) {
      this.btnClicked = btnClicked;
   }

   public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
      if (btnClicked) {
         if (isSelected) {
            setBackground(Color.black);
         } else {
            setBackground(Color.blue);
         }
      } else {
         // if button not clicked
         setBackground(Color.lightGray);
      }
      return this;
   }

还有关于:

  

显然,我需要一些不同的逻辑来解决这个颜色记忆问题。对此的任何想法都会很棒。

你说的这个“色彩记忆问题是什么?”

编辑1
这是我的意思的可编辑的例子。我仍然不确定你的颜色记忆问题是什么意思,抱歉。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

@SuppressWarnings("serial")
public class DisplaySelectedTableCells extends JPanel {
   public static final Integer[][] DATA = {
      {1, 2, 3}, {4, 5, 6}, {7, 8, 9},
      {1, 2, 3}, {4, 5, 6}, {7, 8, 9},
      {1, 2, 3}, {4, 5, 6}, {7, 8, 9}
   };
   public static final String[] COLS = {"A", "B", "C"};
   private static final int PREF_WIDTH = 400;
   private static final int PREF_HEIGHT = 300;
   private DefaultTableModel model = new DefaultTableModel(DATA, COLS) {
      @Override
      public Class<?> getColumnClass(int columnIndex) {
         return Integer.class;
      }
   };
   private JTable table = new JTable(model);
   private JToggleButton toggleBtn = new JToggleButton("Show Selected Rows");
   private MyCellRenderer myCellRenderer = new MyCellRenderer();

   public DisplaySelectedTableCells() {
      table.setDefaultRenderer(Integer.class, myCellRenderer);
      JPanel btnPanel = new JPanel();
      btnPanel.add(toggleBtn);

      setLayout(new BorderLayout());
      add(new JScrollPane(table), BorderLayout.CENTER);
      add(btnPanel, BorderLayout.SOUTH);

      toggleBtn.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            myCellRenderer.setShowSelected(toggleBtn.isSelected());
            table.repaint();
         }
      });
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_WIDTH, PREF_HEIGHT);
   }

   private static class MyCellRenderer extends DefaultTableCellRenderer {
      private static final Color SELECTED_COLOR = Color.pink;
      private static final Color UNSELECTED_COLOR = Color.lightGray;
      private static final Color BASE_COLOR = null;
      private boolean showSelected = false;

      public void setShowSelected(boolean showSelected) {
         this.showSelected = showSelected;
      }

      @Override
      public Component getTableCellRendererComponent(JTable table,
               Object value, boolean isSelected, boolean hasFocus, int row,
               int column) {
         Component superComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
                  row, column);

         if (showSelected) {
            if (isSelected) {
               superComponent.setBackground(SELECTED_COLOR);
            } else {
               superComponent.setBackground(UNSELECTED_COLOR);
            }
         } else {
            superComponent.setBackground(BASE_COLOR);
         }

         return superComponent;
      }
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("DisplaySelectedTableCells");
      frame.getContentPane().add(new DisplaySelectedTableCells());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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