2008-12-10 6 views
1

Для моего приложения я хочу Combo Box, который отображает его элементы при падении как Tree. Проблема в том, что я недостаточно разбираюсь в Swing, чтобы знать, как это сделать. По крайней мере, не закончив писать новый виджет с нуля или что-то в этом роде.Как объединить комбинированный блок с деревом в Swing?

Как бы я сделал что-то вроде этого, не создавая его с нуля?

ответ

4

Я думаю, что я будет реализовывать это как компонент JTree в JViewPort, а затем кнопку расширения. Когда он рухнет, он будет выглядеть как поле со списком. Когда вы нажимаете кнопку расширения, окно просмотра расширяется, позволяя вам прокручивать и выбирать узел в JTree.Когда вы выберете узел, порт представления будет сбрасываться, чтобы отображать только выбранный узел и кнопку расширения.

0

Переопределить метод getListCellRendererComponent и создать компоненты в порядке уровня. Для каждого уровня дерева перемещайте раскрашенную строку 3 пробела вправо.

Пример:

. a

. b

. с

Оригинальная реализация вы можете смотреть с

public Component getListCellRendererComponent(
             JList list, 
             Object value, 
             int index, 
             boolean isSelected, 
             boolean cellHasFocus) { 
     //Get the selected index. (The index param isn't 
     //always valid, so just use the value.) 
     int selectedIndex = ((Integer)value).intValue(); 

    if (isSelected) { 
     setBackground(list.getSelectionBackground()); 
     setForeground(list.getSelectionForeground()); 
    } else { 
     setBackground(list.getBackground()); 
     setForeground(list.getForeground()); 
    } 

    //Set the icon and text. If icon was null, say so. 
    ImageIcon icon = images[selectedIndex]; 
    String pet = petStrings[selectedIndex]; 
    setIcon(icon); 
    if (icon != null) { 
     setText(pet); 
     setFont(list.getFont()); 
    } else { 
     setUhOhText(pet + " (no image available)", 
        list.getFont()); 
    } 

    return this; 
} 
+0

Но не потеряет ли поведение разворота расширения – OscarRyz 2008-12-10 22:06:59

+0

Возможно, вы немного изменили код, найденный в [Учебник Java на ComboBox] (http://docs.oracle.com/javase/tutorial/uiswing/components /combobox.html#renderer), чтобы соответствовать вашим объяснениям ... – Matthieu 2014-10-06 08:51:43

0

Вы можете создать ComboBoxEditor чей компонент (возвращаемый getEditorComponent) является JTree

Хотя вы, возможно, уже пробовал.

Я не знаю, как это будет выглядеть. Опубликуйте снимок экрана, если вы заработаете. :)

EDIT

Я даю ему быстро грязного попробовать. Это ужасно, но это начало.

alt text http://img120.imageshack.us/img120/2563/yiakxk2.png

Вот код, для того, что стоит. :(

Вероятно, вы должны начать думать в альтернативах. А как насчет поддельного Combo, который является JButton без границ при нажатии скрытой панели появится с деревом на дисплее.

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.event.*; 

public class ComboTree { 
    public static void main(String [] args) { 
     JComboBox c = new JComboBox(new String [] { "Hello", "there"}); 
     c.setModel(new CustomComboModel()); 
     c.setEditor(new TreeComboEditor()); 
     c.setRenderer(new TreeComboEditor()); 
     JFrame frame = new JFrame(); 
     frame.add(c , BorderLayout.NORTH) ; 
     frame.pack(); 
     frame.setVisible(true); 

    } 
} 

class CustomComboModel implements ComboBoxModel { 
    public Object getSelectedItem() { return ":P"; } 
    public void setSelectedItem(Object anItem) {} 
    public void addListDataListener(ListDataListener l) {} 
    public Object getElementAt(int index) { return "at " + index ; } 
    public int getSize() { return 2; } 
    public void removeListDataListener(ListDataListener l) {} 
} 
class TreeComboEditor implements ComboBoxEditor, ListCellRenderer { 

    // Editor interface 
    public void addActionListener(ActionListener l) {} 
    public Component getEditorComponent() { 
     return new JTree() ; 
     } 
    public Object getItem() { return "";} 
    public void removeActionListener(ActionListener l) {} 
    public void selectAll() {} 
    public void setItem(Object anObject) {} 

    // Render interface 
    public Component getListCellRendererComponent(JList list, 
              Object value, 
              int index, 
              boolean isSelected, 
              boolean cellHasFocus) { 
     return new JTree(); 
    } 
} 
+0

Да, это именно то, о чем я думал, но я не уверен, как он справится с складыванием/разворачиванием или выбором элемента. Я скоро сделаю это. – 2008-12-10 22:09:14

+0

Не делайте этого. Выглядит ужасно. : S – OscarRyz 2008-12-10 22:24:50

2

Эй, угадайте что! Это ваш счастливый день.

Я использовал эту схему в прошлом. это очень полный. Я не знаю, что они имеют это уже.

JIDE Soft

alt text http://img89.imageshack.us/img89/8324/combotreejj1.png

не слишком дорого, но это займет некоторое время, чтобы понять API (это не так сложно, но они создали много новых вещей)