Я сотни раз читал Oracle API, читал бесчисленное количество статей как здесь, так и в других местах, и я все еще не могу изменить размер столбцов после того, как jtable станет видимым.
Как вы можете догадаться, я также пытаюсь установить видимость столбцов с помощью jcheckboxes. Использование addColumn и removeColumn, как отмечалось в других статьях, не возвращает столбцы в их исходное положение. Ранее я использовал дополнительный класс для хранения информации о столбце, например, самого столбца, его идентификатора и исходного индекса. Это стало беспорядком, а также проблема добавления / удаления данных после изменения видимости столбца. Я заметил, что данные не в нужном столбце. В результате ive выбрала установку minWidth, предпочтительной ширины и максимальной ширины столбца.
Теперь к моей проблеме: приведенный ниже код не регулирует ширину столбца, когда для setColumnVisible установлено значение true. По словам Юлиуса Саммнера Миллера, почему это так?
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.table.*;
class run
{
public static void main(String args[])
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
Viewer viewer = new Viewer();
JFrame jframe = new JFrame();
jframe.add(viewer);
jframe.createBufferStrategy(1); // required for dual monitor issues
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setLocation(50,100);
jframe.pack();
jframe.setVisible(true);
}
});
}
}
class Viewer extends JPanel
{
static final long serialVersionUID = 0;
DefaultTableModel defaultTableModel;
JTable jtable;
JCheckBox jcheckBox[];
public Viewer()
{
this.setLayout(new BorderLayout());
JPanel jpanel = new JPanel(new BorderLayout());
String columnNames[] = {"a","b","c","d","e"};
Object tableData[][] =
{
{"a1","b1","c1","d1","e1"},
{"a2","b2","c2","d2","e2"},
{"a3","b3","c3","d3","e3"}
};
defaultTableModel = new DefaultTableModel(tableData,columnNames);
jtable = new JTable(defaultTableModel);
JScrollPane jscrollPane = new JScrollPane(jtable);
jpanel.add(jscrollPane,BorderLayout.CENTER);
TableColumnModel tableColumnModel = jtable.getColumnModel();
int columnCount = tableColumnModel.getColumnCount();
jcheckBox = new JCheckBox[columnCount];
JPanel visibility = new JPanel(new GridLayout(1,columnCount));
for (int column = 0; column < columnCount; column++)
{
TableColumn tableColumn = tableColumnModel.getColumn(column);
String identifier = (String)tableColumn.getIdentifier();
jcheckBox[column] = new JCheckBox(identifier,true);
jcheckBox[column].setName(identifier);
jcheckBox[column].addActionListener(new ColumnListener());
visibility.add(jcheckBox[column]);
}
jpanel.add(visibility,BorderLayout.SOUTH);
this.add(jpanel,BorderLayout.CENTER);
}
public void setColumnVisible(String identifier, boolean setVisible)
{
TableColumn tableColumn = jtable.getColumn(identifier);
int minWidth = 0;
int preferredWidth = 0;
int maxWidth = 0;
if (setVisible)
{
minWidth = 100;
preferredWidth = 100;
maxWidth = 100;
}
tableColumn.setMinWidth(minWidth);
tableColumn.setPreferredWidth(preferredWidth);
tableColumn.setMaxWidth(maxWidth);
//jtable.doLayout(); does not work
//jtable.validate(); does not work
//jtable.getTableHeader().resizeAndRepaint(); does not work
}
class ColumnListener implements ActionListener
{
public void actionPerformed(ActionEvent actionEvent)
{
JCheckBox checkBox = (JCheckBox)actionEvent.getSource();
boolean setVisible = checkBox.isSelected();
String identifier = checkBox.getName();
setColumnVisible(identifier,setVisible);
}
}
}
Дополнение doLayout (), validate () resizeAndRepaint () не работает, равно как и отключение setAutoResizeMode.
Примечание. Как некоторые из вас, возможно, узнали, изменение размера действительно работает ПОСЛЕ, когда все столбцы скрыты. Однако он все еще не отвечает на мой вопрос о том, почему размеры столбцов не корректируются при вызове setMin, setPreferred и setMax.
Примечание. Я пишу программу просмотра шрифтов, которая может одновременно отображать несколько семейств шрифтов, стилей и размеров. У меня есть jtable, в которой отображаются установленные шрифты (в столбце 1 отображается семейство шрифтов, в столбце 2 отображается алфавит соответствующим шрифтом, а в столбце 3 отображаются цифры (0–9) в соответствующем шрифте.
Будет использоваться предоставленный пример кода ive чтобы отобразить вышеупомянутое, давая пользователю возможность скрыть алфавит или цифры.
У меня также есть 6 jlist, 3 из которых содержат доступные семейства шрифтов, стили и размеры, а остальные 3 содержат выбор пользователя. Я использую другую jtable для отображения пользовательского выбора (выбранное семейство шрифтов column1, стиль шрифта column2, размер шрифта column3, алфавит column4, цифры column5, пунктуация column6 и символы column7.
Пользователю будет разрешено выбирать, какие столбцы являются Однако, как уже упоминалось, когда таблица отображения обновляется, данные находятся не там, где должны быть, то есть пользователь выбирает скрытие столбцов, цифр и символов, а затем выбирает новые шрифты, стили и размер для отображения.