Как мне объединить поле со списком с деревом в Swing? - PullRequest
1 голос
/ 11 декабря 2008

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

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

Ответы [ 4 ]

4 голосов
/ 11 декабря 2008

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

2 голосов
/ 11 декабря 2008

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

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

JIDE Soft

альтернативный текст http://img89.imageshack.us/img89/8324/combotreejj1.png

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

0 голосов
/ 11 декабря 2008

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

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

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

EDIT

Я быстро попробую. Это ужасно, но это только начало.

альтернативный текст http://img120.imageshack.us/img120/2563/yiakxk2.png

Вот код, за что стоит. :(

Вероятно, вы должны начать думать в альтернативах. А как насчет фальшивого комбо, представляющего собой 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 голосов
/ 11 декабря 2008

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

Пример:

1

. а

. б

2

. с

Исходную реализацию вы можете посмотреть из

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...