CellRenderer - 让文本加粗

5

如何使JTable中的文本加粗,我尝试了以下方法,它可以改变颜色,但是在使文本加粗方面我做错了什么。

    class ColourRender extends DefaultTableCellRenderer {

    public Component getTableCellRendererComponent(JTable tblData,
            Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        Component cellComponent = super.getTableCellRendererComponent(
                tblData, value, isSelected, hasFocus, row, column);

        if (tblData.getValueAt(row, 3).equals("M")) {
            cellComponent.setForeground(forMen);

        } else {
            cellComponent.setForeground(forWomen);

        }
        return cellComponent;
    }

    class boldRenderer extends DefaultTableCellRenderer {

        public Component getTableCellRendererComponent(JTable tblData,
                Object value, boolean isSelected, boolean hasFocus,
                int row, int column) {
            Component cellComponent = super.getTableCellRendererComponent(
                    tblData, value, isSelected, hasFocus, row, column);

            if (tblData.getValueAt(row, 1).equals(bib)) {
                cellComponent.setFont(cellComponent.getFont().deriveFont(
                        Font.BOLD));
            } else {
                cellComponent.setFont(cellComponent.getFont().deriveFont(
                        Font.PLAIN));
            }

            return cellComponent;
        }
    }
}

这是在与表格相关的类中的内容。

tblData.getColumn("Bib no").setCellRenderer(new CustomRenderer());
tblData.getColumn("M/F").setCellRenderer(new CustomRenderer());
1个回答

8
您创建了一个粗体字但没有使用:您从未在任何地方调用setFont(...)
即,
if (tblData.getValueAt(row, 1).equals(bib)) {
   // you must call setFont(...) for a font to change
   cellComponent.setFont(cellComponent.getFont().deriveFont(Font.BOLD));
} else {  
   // don't forget to set the font back if condition not true
   cellComponent.setFont(cellComponent.getFont().deriveFont(Font.PLAIN));
}

// changing foreground color:
if (tblData.getValueAt(row, 3).equals("M")) {
   cellComponent.setForeGround(MEN_COLOR); // a constant
} else {  
   cellComponent.setForeGround(myTable.getForeground());
}

对于颜色,在您的 else 块中将前景色设置为 null,以使您的颜色恢复默认。


编辑
例如:

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class CustomRendererExample extends JPanel {
   public static final String[] COLUMNS = { "M/F", "Fubar" };
   public static final String[] FUBARS = { "Fubar", "Snafu" };
   public static final String[] M_F = { "M", "F" };
   protected static final Color M_COLOR = Color.red;
   private DefaultTableModel dm = new DefaultTableModel(COLUMNS, 5);
   private JTable table = new JTable(dm);

   public CustomRendererExample() {
      add(new JScrollPane(table));
      DefaultCellEditor mfEditor = new DefaultCellEditor(new JComboBox<>(M_F));
      table.getColumn(COLUMNS[0]).setCellEditor(mfEditor);
      table.getColumn(COLUMNS[0]).setCellRenderer(
            new DefaultTableCellRenderer() {
               @Override
               public Component getTableCellRendererComponent(JTable table,
                     Object value, boolean isSelected, boolean hasFocus,
                     int row, int column) {
                  Component superRenderer = super.getTableCellRendererComponent(table, 
                        value, isSelected, hasFocus, row, column);

                  if (value != null && value.equals(M_F[0])) {
                     superRenderer.setForeground(M_COLOR);
                  } else {
                     superRenderer.setForeground(null);
                  }

                  return superRenderer;
               }
            });

      DefaultCellEditor fubarEditor = new DefaultCellEditor(new JComboBox<>(
            FUBARS));
      table.getColumn(COLUMNS[1]).setCellEditor(fubarEditor);
      table.getColumn(COLUMNS[1]).setCellRenderer(
            new DefaultTableCellRenderer() {
               @Override
               public Component getTableCellRendererComponent(JTable table,
                     Object value, boolean isSelected, boolean hasFocus,
                     int row, int column) {
                  Component superRenderer = super.getTableCellRendererComponent(table, 
                        value, isSelected, hasFocus, row, column);

                  if (value != null && value.equals(FUBARS[0])) {
                     superRenderer.setFont(superRenderer.getFont().deriveFont(Font.BOLD));
                  } else {
                     superRenderer.setFont(superRenderer.getFont().deriveFont(Font.PLAIN));
                  }

                  return superRenderer;
               }
            });

   }

   private static void createAndShowGui() {
      CustomRendererExample mainPanel = new CustomRendererExample();

      JFrame frame = new JFrame("Custom Renderer Example");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

谢谢,我需要如何更改代码才能使颜色也随之改变呢?因为现在只有加粗和着色?tblData.getColumn("M/F").setCellRenderer(new CustomRenderer());if (tblData.getValueAt(row, 3).equals("M")) { cellComponent.setForeground(forMen); } - user3405919
@user3405919:我们无法在评论中阅读代码。如果您仍有问题,请在底部编辑您的问题并添加新代码。此外,您应该知道如何在这里设置前景色,对吧?您在else块中将颜色设置为“null”。 - Hovercraft Full Of Eels
我刚刚尝试了你给的代码,但可能是我的操作有误,表格仍然同时发生了颜色和加粗的变化。我已经修改了代码。 - user3405919
@user3405919 cellComponent.setForeground(null); 应该改为 cellComponent.setForeground(myJTable.getForeground()),值的测试也不太妥当,等等...,请看这个链接 - mKorbel
例如,我的最小化程序示例已经被创建并发布在上面了。 - Hovercraft Full Of Eels
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接