私のアプリケーションでは、 Treeとしてドロップダウンされたときにその要素を表示するCombo Boxが必要です。問題は、私はこれを行う方法を知るのに十分なほど Swing に精通していないことです。少なくとも、ゼロから新しいウィジェットを作成したり、そのような効果を上げたりすることはありません。
ゼロから作成せずに、このようなことを行うにはどうすればよいでしょうか?
これを JViewPort の JTree コンポーネントとして実装し、その後に展開ボタンを配置すると思います。折りたたむと、コンボ ボックスのようになります。展開ボタンをクリックすると、ビューポートが展開され、スクロールして JTree 内のノードを選択できるようになります。ノードを選択すると、ビュー ポートが折りたたまれて、選択したノードと展開ボタンのみが表示されます。
ねえ、ちょっと聞いてよ!これはあなたの幸運な日です。
私は過去にこのフレームワークを使用しました。とても完成度が高いです。彼らがすでにこれを持っているとは知りませんでした。
代替テキスト http://img89.imageshack.us/img89/8324/combotreejj1.png
それほど高価ではありませんが、API を理解するには時間がかかります (それほど複雑ではありませんが、彼らは多くの新しいものを作成しました)。
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;
}
コンポーネント ( 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();
}
}