2016-07-16 8 views
0

Может ли пользовательский рендеринг ячеек определить свойства объекта, например, формы?Может ли пользовательский рендеринг ячеек определить свойства объекта, например, формы?

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

Элементы, которые мне нужно отображать в списке, это временные интервалы для сдвигов, каждый из которых представляет время начала и окончания и различные логические свойства. Было бы лучше, если бы я мог использовать компоненты, чтобы показать состояние каждого объекта, чтобы кто-то мог его выбрать. Когда его выбранное редактирование будет сделано в списке, а не в списке. Просто для отображения.

Что-то вроде этого:

http://i.stack.imgur.com/3MoeQ.png

+1

Да средства визуализации ячейки/редакторы могут использовать любую визуализацию, которую вы хотите использовать, а не только текст. У вас есть конкретный вопрос? – MeBigFatGuy

ответ

2

Если все, что вы хотите, чтобы оказывать компонент свинга внутри JTable ячеек, то нет проблем: просто не возвращать соответствующие JPanel экземпляров из ячейки визуализатора , Однако вы можете столкнуться с проблемами, если хотите, чтобы содержимое было полностью совместимым. JPanel s.

Вопрос, по существу, состоит в следующем: JListJTable, для справки) использовать панель возвращается из визуализации ячейки только, чтобы сделать деталь. Как только рендер будет завершен, экземпляр будет отброшен. Это означает, что вы не можете внешне изменить состояние одного из компонентов, которые вы возвращаете из средства отображения ячеек, и ожидать, что он обновится в таблице.

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

Я нашел в целом лучше - и даже проще - использовать собственный менеджер макетов для таких задач. Пример:

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 и т.д., так что все зависит от того, что именно вам хотеть сделать. Однако вышесказанное даст вам полностью взаимодействующие компоненты в виде списка.