在点击之前如何使JTable中的单元格为空?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在点击之前如何使JTable中的单元格为空?相关的知识,希望对你有一定的参考价值。

我创建了一个10乘10的乘法表。我试图让答案为空的单元格,直到它们被点击为止。一旦用户点击单元格,答案将保持在桌面上。

我已经查找了如何在单元格中使用按钮,但我认为我应该使用事件监听器而不是按钮。

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class SimpleTableDemo{
    public static void main(String args[]) {
        JFrame frame = new JFrame("Multiplication Table");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //create the table to output. only doing a 10 by 10 table
    String data[][] = {{"1", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"},
            {"2", "2", "4", "6", "8", "10", "12", "14", "16", "18", "20"},
            {"3", "3", "6", "9", "12", "15", "18", "21", "24", "27", "30"},
            {"4", "4", "8", "12", "16", "20", "24", "28", "32", "36", "40"},
            {"5", "5", "10", "15", "20", "25", "30", "35", "40", "45", "50"},
            {"6", "6", "12", "18", "24", "30", "36", "42", "48", "54", "60"},
            {"7", "7", "14", "21", "28", "35", "42", "49", "56", "63", "70"},
            {"8", "8", "16", "24", "32", "40", "48", "56", "64", "72", "80"},
            {"9", "9", "18", "27", "36", "45", "54", "63", "72", "81", "90"},
            {"10", "10", "20", "30", "40", "50", "60", "70", "80", "90", "100"}};
    String column[] = {"X", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};

    //makes it so that the cells are not editable by the user
    JTable jt = new JTable(data, column){
        public boolean isCellEditable(int row, int column){
            return false;
        }
    };

    jt.setBounds(300, 400, 200, 300);
    JScrollPane sp = new JScrollPane(jt);
    frame.add(sp);
    frame.setSize(1000, 580);
    frame.setVisible(true);
    jt.setRowHeight(50);
    //makes it so that the columns can't be reordered
    jt.getTableHeader().setReorderingAllowed(false);

    jt.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            if (e.getClickCount() == 2) {
                JTable target = (JTable)e.getSource();
                int row = target.getSelectedRow();
                int column = target.getSelectedColumn();
                // do some action if appropriate column
                jt.setBackground(Color.cyan);
            }
         }
      });
    }
}

我当前的代码有一个部分,它改变了表的背景颜色,因为我试图测试不同的东西。我试图让代码只改变一个单元格颜色,但它改变了整个表格。我希望我的代码格式正确。对不起,如果不是,我会尝试解决它,如果不是。

答案

您希望为表格提供一个渲染器,如果该单元格具有焦点,则仅显示单元格的值,如下所示:

jt.setDefaultRenderer(Integer.class, new DefaultTableCellRenderer() {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        value = hasFocus ? value : "";
        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    }
});

请注意,我还将单元格类型设置为Integer.class

JTable jt = new JTable(data, column) {
    public boolean isCellEditable(int row, int column) {
        return false;
    }

    @Override
    public Class<?> getColumnClass(int column) {
        return Integer.class;
    }
};

我看到你也想要一直显示第一行 - 所以你可以改变渲染器来允许这个:value = hasFocus || column == 0 ? value : "";

jt.setDefaultRenderer(Integer.class, new DefaultTableCellRenderer() {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        value = hasFocus || column == 0 ? value : "";
        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    }
});

以上是关于在点击之前如何使JTable中的单元格为空?的主要内容,如果未能解决你的问题,请参考以下文章

Jtable设置单元格为下拉框

如果列中的前一个单元格为空,DataReader 不会在 Excel 单元格中看到数据

对于 IF Else 循环在单元格为空时不会停止

如何将两列与数据合并,如果一列的单元格为空,则相邻的单元格已满?

如何使 JTable 单元格不可编辑但应该能够选择和复制当前单元格中的值

如何使删除按钮删除JTable中的行?