Я столкнулся с проблемой, которая обсуждалась здесь раньше: получение JScrollPane
, содержащего JTable
, для отображения горизонтальной полосы прокрутки по своему желанию. HERE - это сообщение, которое я пробовал, но по какой-то причине он не работает с моей ситуацией (я думаю, это потому, что я установил одну из моих столбцов на фиксированную ширину.JTable горизонтальная полоса прокрутки, основанная на ширине одного столбца
Вот SSCCE:
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
@SuppressWarnings("serial")
public class TableScrollTest extends JFrame
{
public TableScrollTest() {
DefaultTableModel model = new DefaultTableModel(new Object[]{"key", "value"},0);
model.addRow(new Object[]{"short", "blah"});
model.addRow(new Object[]{"long", "blah blah blah blah blah blah blah"});
JTable table = new JTable(model) {
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width < getParent().getWidth();
}
};
table.getColumn("key").setPreferredWidth(60);
table.getColumn("key").setMinWidth(60);
table.getColumn("key").setMaxWidth(60);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JScrollPane scrollPane = new JScrollPane(table);
getContentPane().add(scrollPane);
}
public static void main(String[] args) {
TableScrollTest frame = new TableScrollTest();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setSize(200, 200);
frame.setResizable(false);
frame.setVisible(true);
}
}
Короче говоря, у меня есть таблица из двух столбцов для отображения пары ключ/значение. контейнер, содержащий таблицу имеет фиксированную ширину, и первый столбец таблицы также имеет фиксированную ширину (так как я знаю, как длинный все имена ключей будут). Второй столбец будет содержать значения переменной длины строки. Горизонтальная полоса прокрутки должна появляться только тогда, когда есть значения, которые слишком велики для того, чтобы соответствовать ширине, выделенной для столбца.
Поскольку второе значение выше, имеет такую большую длину, то полоса прокрутки должна быть видна. Тем не менее, это не так, и все, что я пробовал, преуспело только в том, чтобы всегда видеть его всегда, чего я не хочу ... Я только хочу, чтобы он был видимым, если присутствуют «длинные» значения. Кажется, что метод getScrollableTracksViewportWidth()
, переопределяемый в конструкторе таблицы, проверяет, какая ширина предпочтительной ширины таблицы ... так что мне нужно направить таблицу на предпочтительную большую ширину, основываясь только на содержимом этого второго столбца ... но Я в тупике.
Любые идеи?
Вы неотложный вопрос, потому что вы имеете переопределяется 'getScrollableTracksViewportWidth', что означает этот стол никогда не может быть шире, чем панель прокрутки ... – MadProgrammer
@MadProgrammer Уверены ли вы? В примере, который я связывал, этот метод переопределен, и в этом примере таблица становится шире, чем панель прокрутки. – The111
Но предпочтительная ширина таблицы основана на ширине «TableColumn», которая не учитывает ширину содержимого, а это означает, что, если вы не измените ширину второго столбца так же, как вы изменили первый, это всегда будет возвращать 'true'. Я удалил метод getScrollableTracksViewportWidth и вручную изменил размер столбца и смог отобразить горизонтальную полосу прокрутки. – MadProgrammer