Значение одной ячейки JTable дублируется во все после ввода
У меня есть программа, в которой на данный момент реализован функционал добавления и удаления столбцов таблицы, но есть одна проблема, при вводе значений в эту таблицу они начинают дублироваться в других ячейках:
Дальше нажимаю enter, чтобы перестать редактировать ячейку и каким-то магическим образом все ячейки слева от этой заполняются такими же значениями:
Если я нажимаю на любую ячейку справа от этой, то такими же значениями заполняются все ячейки между первоначальной и нажатой, включая её:
Если я взаимодействую с кнопкой для перемещения по строке ячеек, то заполняются вообще все ячейки одинаковыми значениями.
Код:
package ru.kirill.task9;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import ru.kirill.addition.Addition;
public class GraphicApp {
private boolean isReverse = false;
class MainFrame extends JFrame {
private static final String TITLE = "Главное меню";
private static final String MINUS = "-";
private static final String PLUS = "+";
private static final String OPEN_BUTTON_TEXT = "Открыть";
private static final String SAVE_BUTTON_TEXT = "Сохранить";
private static final String REVERSE_BUTTON_TEXT = "Перевернуть";
private static final String ENTER_LABEL_TITLE = "Количество элементов";
private static final String CALCULATE_BUTTON_TEXT = "Рассчитать";
private static final String REFRESH_BUTTON_TEXT = "Обновить";
JButton minusButton;
JButton refreshButton;
JButton plusButton;
JButton openButton;
JButton saveButton;
JButton reverseButton;
JButton calculateButton;
JTable inputTable;
JTable outputTable;
JLabel titleOfEnterQuantityElements;
JTextField fieldOfEnterQuantityElements;
MainFrame() {
super(TITLE);
setDefaultCloseOperation(EXIT_ON_CLOSE);
createMainFrameLayout();
minusButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int numberOfCells = Integer.parseInt(fieldOfEnterQuantityElements.getText());
if (numberOfCells > 1) {
fieldOfEnterQuantityElements.setText(
Integer.toString(
numberOfCells - 1));
}
}
});
refreshButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int numberOfCells = 1;
try {
numberOfCells = Integer.parseInt(fieldOfEnterQuantityElements.getText());
} catch (NumberFormatException err) {
JOptionPane.showMessageDialog(null,
"Вы ввели неверное значение");
fieldOfEnterQuantityElements.setText("1");
}
int columnCount = inputTable.getColumnCount();
if (numberOfCells < 1) {
numberOfCells = 1;
fieldOfEnterQuantityElements.setText("1");
}
if (numberOfCells < columnCount) {
TableColumnModel inputTableModel = inputTable.getColumnModel();
for (int i = 0; i < columnCount - numberOfCells; i++) {
inputTable.removeColumn(inputTableModel.getColumn(columnCount - i - 1));
}
} else {
for (int i = 0; i < numberOfCells - columnCount; i++) {
TableColumn newColumn = new TableColumn();
newColumn.setCellRenderer(new CustomCellRenderer());
newColumn.setCellEditor(new CustomCellEditor(new JTextField()));
inputTable.addColumn(newColumn);
}
}
}
});
plusButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fieldOfEnterQuantityElements.setText(
Integer.toString(
Integer.parseInt(fieldOfEnterQuantityElements.getText()) + 1));
}
});
pack();
setSize(600, 285);
setLocationRelativeTo(null);
setResizable(false);
setVisible(true);
calculateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < inputTable.getColumnCount(); i++) {
System.out.print(inputTable.getValueAt(0, i));
}
}
});
}
private void createMainFrameLayout() {
Container pane = getContentPane();
pane.setLayout(new GridBagLayout());
GridBagConstraints layout = new GridBagConstraints();
JPanel topInteractionPanel = new JPanel(new GridBagLayout());
topInteractionPanel.setBackground(Color.GREEN);
layout.fill = GridBagConstraints.BOTH;
layout.weightx = 1;
layout.weighty = 0.15;
layout.gridx = 0;
layout.gridy = 0;
layout.gridwidth = 1;
layout.gridheight = 1;
pane.add(topInteractionPanel, layout);
minusButton = new JButton(MINUS);
layout.fill = GridBagConstraints.BOTH;
layout.weightx = 0.1;
layout.weighty = 1;
layout.gridx = 0;
layout.gridy = 0;
layout.gridwidth = 1;
layout.gridheight = 1;
topInteractionPanel.add(minusButton, layout);
JPanel enterQuantityElementsPanel = new JPanel(new GridBagLayout());
layout.weightx = 0.8;
layout.weighty = 1;
layout.gridx = 1;
layout.gridy = 0;
layout.gridwidth = 1;
layout.gridheight = 1;
topInteractionPanel.add(enterQuantityElementsPanel, layout);
titleOfEnterQuantityElements = new JLabel(ENTER_LABEL_TITLE);
layout.weightx = 1;
layout.weighty = 0.5;
layout.gridx = 0;
layout.gridy = 0;
layout.gridwidth = 1;
layout.gridheight = 1;
enterQuantityElementsPanel.add(titleOfEnterQuantityElements, layout);
JPanel enterTextFieldPanel = new JPanel(new GridBagLayout());
layout.weightx = 1;
layout.weighty = 0.5;
layout.gridx = 0;
layout.gridy = 1;
layout.gridwidth = 1;
layout.gridheight = 1;
enterQuantityElementsPanel.add(enterTextFieldPanel, layout);
fieldOfEnterQuantityElements = new JTextField();
fieldOfEnterQuantityElements.setText("1");
layout.weightx = 0.7;
layout.weighty = 1;
layout.gridx = 0;
layout.gridy = 0;
layout.gridwidth = 1;
layout.gridheight = 1;
enterTextFieldPanel.add(fieldOfEnterQuantityElements, layout);
refreshButton = new JButton(REFRESH_BUTTON_TEXT);
layout.weightx = 0.3;
layout.weighty = 1;
layout.gridx = 1;
layout.gridy = 0;
layout.gridwidth = 1;
layout.gridheight = 1;
enterTextFieldPanel.add(refreshButton, layout);
plusButton = new JButton(PLUS);
layout.weightx = 0.1;
layout.weighty = 1;
layout.gridx = 2;
layout.gridy = 0;
layout.gridwidth = 1;
layout.gridheight = 1;
topInteractionPanel.add(plusButton, layout);
JPanel inputTablePanel = new JPanel(new GridBagLayout());
inputTablePanel.setBackground(Color.BLUE);
layout.fill = GridBagConstraints.BOTH;
layout.weightx = 1;
layout.weighty = 0.30;
layout.gridx = 0;
layout.gridy = 1;
layout.gridwidth = 1;
layout.gridheight = 1;
pane.add(inputTablePanel, layout);
inputTable = new JTable(1, 1);
TableColumnModel inputTableModel = inputTable.getColumnModel();
TableColumn firstColumn = new TableColumn();
firstColumn.setCellRenderer(new CustomCellRenderer());
firstColumn.setCellEditor(new CustomCellEditor(new JTextField()));
inputTableModel.addColumn(firstColumn);
inputTableModel.removeColumn(inputTable.getColumnModel().getColumn(0));
inputTable.setTableHeader(null);
inputTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
inputTable.setRowHeight(50);
JScrollPane inputScrollPane = new JScrollPane(inputTable);
layout.fill = GridBagConstraints.BOTH;
layout.weightx = 1;
layout.weighty = 1;
layout.gridx = 0;
layout.gridy = 0;
layout.gridwidth = 1;
layout.gridheight = 1;
inputTablePanel.add(inputScrollPane, layout);
JPanel bottomInteractionPanel = new JPanel(new GridBagLayout());
bottomInteractionPanel.setBackground(Color.ORANGE);
layout.fill = GridBagConstraints.BOTH;
layout.weightx = 1;
layout.weighty = 0.15;
layout.gridx = 0;
layout.gridy = 2;
layout.gridwidth = 1;
layout.gridheight = 1;
pane.add(bottomInteractionPanel, layout);
openButton = new JButton(OPEN_BUTTON_TEXT);
layout.weightx = 0.25;
layout.weighty = 1;
layout.gridx = 0;
layout.gridy = 0;
layout.gridwidth = 1;
layout.gridheight = 1;
bottomInteractionPanel.add(openButton, layout);
saveButton = new JButton(SAVE_BUTTON_TEXT);
layout.weightx = 0.25;
layout.weighty = 1;
layout.gridx = 1;
layout.gridy = 0;
layout.gridwidth = 1;
layout.gridheight = 1;
bottomInteractionPanel.add(saveButton, layout);
reverseButton = new JButton(REVERSE_BUTTON_TEXT);
layout.weightx = 0.25;
layout.weighty = 1;
layout.gridx = 2;
layout.gridy = 0;
layout.gridwidth = 1;
layout.gridheight = 1;
bottomInteractionPanel.add(reverseButton, layout);
calculateButton = new JButton(CALCULATE_BUTTON_TEXT);
layout.weightx = 0.25;
layout.weighty = 1;
layout.gridx = 3;
layout.gridy = 0;
layout.gridwidth = 1;
layout.gridheight = 1;
bottomInteractionPanel.add(calculateButton, layout);
JPanel outputTablePanel = new JPanel(new GridBagLayout());
outputTablePanel.setBackground(Color.RED);
layout.fill = GridBagConstraints.BOTH;
layout.weightx = 1;
layout.weighty = 0.30;
layout.gridx = 0;
layout.gridy = 3;
layout.gridwidth = 1;
layout.gridheight = 1;
pane.add(outputTablePanel, layout);
outputTable = new JTable(1, 1);
outputTable.setTableHeader(null);
outputTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
outputTable.setRowHeight(50);
outputTable.setEnabled(false);
JScrollPane outputScrollPane = new JScrollPane(outputTable);
layout.fill = GridBagConstraints.BOTH;
layout.weightx = 1;
layout.weighty = 1;
layout.gridx = 0;
layout.gridy = 0;
layout.gridwidth = 1;
layout.gridheight = 1;
outputTablePanel.add(outputScrollPane, layout);
}
class CustomCellEditor extends DefaultCellEditor {
public CustomCellEditor(JTextField textField) {
super(textField);
this.clickCountToStart = 1;
}
}
class CustomCellRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
setFont(table.getFont());
setValue(value);
return this;
}
}
}
public GraphicApp() {
new MainFrame();
}
public GraphicApp(boolean isReverse) {
this.isReverse = isReverse;
new MainFrame();
}
public static void main(String[] args) {
new GraphicApp();
}
}
Как мне убрать это автозаполнение, чтобы всё работало нормально?
Ответы (1 шт):
Я смог решить свою проблему тем, что стал использовать в качестве модели таблицы DefaultTableModel
inputTableModel = new DefaultTableModel(new String[1], 1);
inputTable = new JTable(inputTableModel);
inputTable.setDefaultRenderer(
Object.class, new CustomCellRenderer());
inputTable.setDefaultEditor(
Object.class, new CustomCellEditor(new JTextField()));
inputTable.setTableHeader(null);
inputTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
inputTable.setRowHeight(50);
JScrollPane inputScrollPane = new JScrollPane(inputTable);
layout.fill = GridBagConstraints.BOTH;
layout.weightx = 1;
layout.weighty = 1;
layout.gridx = 0;
layout.gridy = 0;
layout.gridwidth = 1;
layout.gridheight = 1;
inputTablePanel.add(inputScrollPane, layout);