Если все, что вы хотите, чтобы оказывать компонент свинга внутри JTable ячеек, то нет проблем: просто не возвращать соответствующие JPanel
экземпляров из ячейки визуализатора , Однако вы можете столкнуться с проблемами, если хотите, чтобы содержимое было полностью совместимым. JPanel
s.
Вопрос, по существу, состоит в следующем: JList
(и JTable
, для справки) использовать панель возвращается из визуализации ячейки только, чтобы сделать деталь. Как только рендер будет завершен, экземпляр будет отброшен. Это означает, что вы не можете внешне изменить состояние одного из компонентов, которые вы возвращаете из средства отображения ячеек, и ожидать, что он обновится в таблице.
Однако в определенных обстоятельствах вы можете избежать неприятностей, поскольку, как только пользователь нажимает на ячейку, список переходит в режим редактирования, и в этот момент ячейка, редактируемая пользователем, фактически содержит реальные экземпляры компонентов качания, а не просто делает их.
Я нашел в целом лучше - и даже проще - использовать собственный менеджер макетов для таких задач. Пример:
static class ListLayout implements LayoutManager {
private final int myItemHeight;
public ListLayout(int itemHeight) {
myItemHeight = itemHeight;
}
@Override
public void addLayoutComponent(String name, Component comp) {
}
@Override
public void removeLayoutComponent(Component comp) {
}
public Dimension preferredLayoutSize(Container parent) {
int h = 0;
int w = 0;
for (Component c : parent.getComponents()) {
h += c.getPreferredSize().height;
w = Math.max(w, c.getPreferredSize().width);
}
return new Dimension(w, h);
}
public Dimension minimumLayoutSize(Container parent) {
int w = 0;
for (Component c : parent.getComponents()) {
w = Math.max(w, c.getMinimumSize().width);
}
return new Dimension(w, 0);
}
public void layoutContainer(Container parent) {
int y = 0;
// Note: should really deal with parent's border insets here as well
// Additionally, can add fields like padding, margin, etc. to make this
// class more generally useful
for (Component c : parent.getComponents()) {
c.setBounds(0, y, parent.getWidth(), myItemHeight);
y += myItemHeight;
}
}
}
И вызывающий код:
JFrame frame = new JFrame();
JPanel content = new JPanel();
content.setLayout(new ListLayout(25));
JScrollPane scroll = new JScrollPane(content);
for (int i = 0; i < 20; ++i) {
content.add(new JButton(Integer.toString(i)));
}
frame.setContentPane(scroll);
frame.pack();
frame.setVisible(true);
Конечно, делать это таким образом вы теряете дополнительные возможности JList
как выбор hilighting и т.д., так что все зависит от того, что именно вам хотеть сделать. Однако вышесказанное даст вам полностью взаимодействующие компоненты в виде списка.
Да средства визуализации ячейки/редакторы могут использовать любую визуализацию, которую вы хотите использовать, а не только текст. У вас есть конкретный вопрос? – MeBigFatGuy