1

JListユーザーが選択できるアイテムのリストがあります。たくさんの項目 (州の都市など) があるので、リストをいくつかのセクションに分けたいと思います。ただし、セクションの見出しは選択できないはずです。したがって、私の都市/州の例では、これは次のようになります。

  • 状態 1
    • 都市 1
    • 都市 2
    • シティ 3
  • 状態 2
    • シティ 4
    • シティ 5
    • シティ 6

JListcustom に s を埋め込んでこれを自分で書くのはそれほど難しくありませんが、そのListCellRendererようなクラスがすでに存在するのではないかと思います。

4

4 に答える 4

4

JIDEには、まさにこれを可能にするコンポーネントがあります。これは GroupList と呼ばれます。

代替テキスト

于 2009-05-17T14:57:51.653 に答える
3

たぶんJTreeを使って?あなたが説明するのは、2つのレベルを持つツリーです。

于 2009-05-17T13:22:20.320 に答える
1

この質問にはすでに回答がありますが、Robertがオープンソースソリューションを望んでいるとコメントしていることに気付きました。GlazedListsのSeparatorlistを使用することをお勧めします。これは、次の場所にあるAPIです。

http://publicobject.com/glazedlists/glazedlists-1.8.0/api/ca/odell/glazedlists/SeparatorList.html

最初の文字でグループ化されたアイテムのリストを生成するサンプルコードを次に示します。

代替テキストhttp://img300.imageshack.us/img300/8977/separatorlist.png

public class SeparatorListTest {

private static Comparator<String> createComparator() {
    return new Comparator<String>() {
        public int compare(String stringOne, String stringTwo) {
            return stringOne.substring(0,1).compareTo(stringTwo.substring(0,1));
        }
    };
}

private static ListCellRenderer createListCellRenderer() {
    return new DefaultListCellRenderer() {
        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

            if (value instanceof SeparatorList.Separator) {
                SeparatorList.Separator separator = (SeparatorList.Separator) value;
                label.setText(separator.getGroup().get(0).toString().substring(0,1));
                label.setFont(label.getFont().deriveFont(Font.BOLD));
                label.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
            } else {
                label.setFont(label.getFont().deriveFont(Font.PLAIN));
                label.setBorder(BorderFactory.createEmptyBorder(0,15,0,0));
            }

            return label;
        }
    };
}

public static void main(String[] args) {
    EventList<String> rawList = GlazedLists.eventListOf(
            "apple", "appricot", "acorn", "blueberry", "coconut", "chesnut", "grape");
    SeparatorList<String> separatorList = 
            new SeparatorList<String>(rawList, createComparator(), 1, 1000);

    JList list = new JList(new EventListModel<String>(separatorList));
    list.setCellRenderer(createListCellRenderer());
    JScrollPane scrollPane = new JScrollPane(list);
    scrollPane.setBorder(null);

    JFrame frame = new JFrame();
    frame.add(scrollPane, BorderLayout.CENTER);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(200,200);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

}

于 2009-08-04T12:27:15.710 に答える
0

Apple が SourceList と呼んでいるものを使用できます。iTunes と Mac OS X の Finder でそれらの動作を確認できます。これは、あなたが説明した問題に対するエレガントな解決策です。

これを行うためのクロスプラットフォームのオープン ソース Java Swing コンポーネントは次のとおりです

于 2009-05-18T09:47:16.300 に答える