1

私のアプリケーションでは、 Treeとしてドロップダウンされたときにその要素を表示するCombo Boxが必要です。問題は、私はこれを行う方法を知るのに十分なほど Swing に精通していないことです。少なくとも、ゼロから新しいウィジェットを作成したり、そのような効果を上げたりすることはありません。

ゼロから作成せずに、このようなことを行うにはどうすればよいでしょうか?

4

4 に答える 4

4

これを JViewPort の JTree コンポーネントとして実装し、その後に展開ボタンを配置すると思います。折りたたむと、コンボ ボックスのようになります。展開ボタンをクリックすると、ビューポートが展開され、スクロールして JTree 内のノードを選択できるようになります。ノードを選択すると、ビュー ポートが折りたたまれて、選択したノードと展開ボタンのみが表示されます。

于 2008-12-10T22:40:48.317 に答える
2

ねえ、ちょっと聞いてよ!これはあなたの幸運な日です。

私は過去にこのフレームワークを使用しました。とても完成度が高いです。彼らがすでにこれを持っているとは知りませんでした。

ジデソフト

代替テキスト http://img89.imageshack.us/img89/8324/combotreejj1.png

それほど高価ではありませんが、API を理解するには時間がかかります (それほど複雑ではありませんが、彼らは多くの新しいものを作成しました)。

于 2008-12-10T22:38:56.433 に答える
0

getListCellRendererComponent メソッドをオーバーライドし、コンポーネントをレベル順に作成します。ツリー レベルごとに、ペイントされた文字列を右に 3 スペース移動します。

例:

1

. a

. b

2

. c

あなたが見ることができる元の実装

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;
}
于 2008-12-10T22:02:40.453 に答える
0

コンポーネント ( getEditorComponent によって返される) が JTree である ComboBoxEditor を作成できます。

あなたはすでにそれを試したかもしれませんが。

どのように見えるかわかりません。あなたがそれを動作させる場合は、スクリーンショットを投稿してください。:)

編集

私はそれを簡単に試してみます。ひどいですが、スタートです。

代替テキスト 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();
    }
}
于 2008-12-10T22:05:07.203 に答える