java - 如何更改 JTable 中按钮的字体

标签 java swing jtable jbutton tablecellrenderer

我有以下代码,按钮位于单元格内

import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

/**
 * @version 1.0 11/09/98
 */
public class JButtonTableExample extends JFrame {

  public JButtonTableExample() {
    super("JButtonTable Example");

    DefaultTableModel dm = new DefaultTableModel();
    dm.setDataVector(new Object[][] { { "button 1", "foo" },
        { "button 2", "bar" } }, new Object[] { "Button", "String" });

    JTable table = new JTable(dm);
    table.setFont(new Font("Comic Sans MA",0,20));
    table.setRowHeight(35);
    table.getColumn("Button").setCellRenderer(new ButtonRenderer());
    table.getColumn("Button").setCellEditor(
        new ButtonEditor(new JCheckBox()));
    JScrollPane scroll = new JScrollPane(table);
    getContentPane().add(scroll);
    setSize(400, 100);
    setVisible(true);
  }

  public static void main(String[] args) {


    JButtonTableExample frame = new JButtonTableExample();
    frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
  }
}
/**
 * @version 1.0 11/09/98
 */

class ButtonRenderer extends JButton implements TableCellRenderer {

  public ButtonRenderer() {
    setOpaque(true);
  }

  public Component getTableCellRendererComponent(JTable table, Object value,
      boolean isSelected, boolean hasFocus, int row, int column) {
    if (isSelected) {
      setForeground(table.getSelectionForeground());
      setBackground(table.getSelectionBackground());
    } else {
      setForeground(table.getForeground());
      setBackground(UIManager.getColor("Button.background"));
    }
    setText((value == null) ? "" : value.toString());
    return this;
  }
}

/**
 * @version 1.0 11/09/98
 */

class ButtonEditor extends DefaultCellEditor {
  protected JButton button;

  private String label;

  private boolean isPushed;

  public ButtonEditor(JCheckBox checkBox) {
    super(checkBox);
    button = new JButton();
    button.setFont(new Font("Comic Sans MS",0,25));
    buttonButtonEditor 
    button.setOpaque(true);
    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        fireEditingStopped();
      }
    });
  }

  public Component getTableCellEditorComponent(JTable table, Object value,
      boolean isSelected, int row, int column) {
    if (isSelected) {
      button.setForeground(table.getSelectionForeground());
      button.setBackground(table.getSelectionBackground());
    } else {
      button.setForeground(table.getForeground());
      button.setBackground(table.getBackground());
    }
    label = (value == null) ? "" : value.toString();
    button.setText(label);
    isPushed = true;
    return button;
  }

  public Object getCellEditorValue() {
    if (isPushed) {
      // 
      // 
      JOptionPane.showMessageDialog(button, label + ": Ouch!");
      // System.out.println(label + ": Ouch!");
    }
    isPushed = false;
    return new String(label);
  }

  public boolean stopCellEditing() {
    isPushed = false;
    return super.stopCellEditing();
  }

  protected void fireEditingStopped() {
    super.fireEditingStopped();
  }
}

我尝试通过将以下代码行添加到 ButtonEditor 类来更改按钮的字体

button.setFont(new Font("Comic Sans MS",0,25));

但是它不起作用!!
我应该怎么做才能改变这些按钮的字体

最佳答案

编辑您的 ButtonRenderer 类,如下所示:

class ButtonRenderer extends JButton implements TableCellRenderer {

    public ButtonRenderer() {
        setOpaque(true);
    }

    public Component getTableCellRendererComponent(JTable table, Object value,
    boolean isSelected, boolean hasFocus, int row, int column) {
        if (isSelected) {
            setForeground(table.getSelectionForeground());
            setBackground(table.getSelectionBackground());
        } else {
            setForeground(table.getForeground());
            setBackground(UIManager.getColor("Button.background"));
        }
        setText((value == null) ? "" : value.toString());
        setFont(new Font("Times New Roman", 0, 10)); //Add this line
        return this;
    }
}

字体总是被重置为表格的模型,因此您需要添加该行以强制模型尊重更改。

你的输出应该是:

enter image description here

关于java - 如何更改 JTable 中按钮的字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33376687/

相关文章:

Java jTable 来自 ArrayList 对象的数据并通过其他方法更新

java - 无法使用从其他 JSP 页面引入的参数

java - 如何解决改造中连接超时的问题

java - 将 JPanel 的区域转换为 BufferedImage

java - 为什么 AbstractTableModel 上的 fireTableChanged() 从最后到第一个通知监听器?

java - JTable 中的乘法值

java - Gradle 是否需要 JDK 来编译 Java?

java - 当在字符串中发现某些数学逻辑时验证括号是否存在

java - 从 JTextPane 获取 JLabel 并更改其文本

java - 为什么我的 for 循环只返回 JTable 中的第一个值?