Как сделать ячейки в 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);
            }
         }
      });
    }
}

В моем текущем коде есть часть, где он меняет цвет фона таблицы, потому что я пытался проверить разные вещи. Я пытался заставить код изменить только цвет одной ячейки, но это изменило всю таблицу. Я надеюсь, что мой код отформатирован правильно. Извините, если что, постараюсь исправить, если что.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы хотите предоставить своей таблице средство визуализации, которое отображает значение ячейки только в том случае, если эта ячейка имеет фокус, например:

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);
    }
});

Другие вопросы по теме