1

ここに画像の説明を入力

jscrollpaneグループ レイアウトの jpanel に5 つのリスト ( で囲まれています) を追加しました。リストの問題は、スクロールバーが自動的に表示されると、下部/上部の境界線が消えることです (リスト 2、3、4)。最初/最後のリストと同じように、すべてのリストが同じ wrt 境界線に見えるようにするにはどうすればよいですか?

を使用してviewportborderを設定しようとしましsetViewPortBroderたが、あまり変わりません。2、3、4 は薄い境界線で表示され、残りのリストは二重の境界線で表示されます。

編集

コードサンプルの追加:

表示される各リストは、次のコードを使用して作成されます。

        MyJList jList = new MyJList(value);
        jList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        jList.setModel(listModel);
        jList.setMinimumSize(new Dimension(135, 300));
        jList.setMaximumSize(new Dimension(135, 300));
        jList.clearSelection();
        jList.setSelectionBackground(Color.darkGray);
        jList.setSelectionForeground(Color.white);
        jList.setBorder(new LineBorder(Color.darkGray, 1));
        jList.setFixedCellHeight(30);
        jList.setFixedCellWidth(100);
        Font font = jList.getFont();
        jList.addListSelectionListener(new ListListener());
        return jList;

MyList は JList の拡張です。ドメイン関連のメタデータを保存する以外は、特別なことは何もしません。そして、次のようにリストが中央のパネルに追加されます。

private void layoutLists(JLabel[] labels, JList[] lists) {

        panel.removeAll();
        panel.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.NONE;

        JScrollPane[] jScrollPanes = new JScrollPane[lists.length];
        for (int index = 0; index < lists.length; index++) {
            jScrollPanes[index] = new JScrollPane(lists[index]);
            jScrollPanes[index].setBorder(BorderFactory.createEmptyBorder());
            jScrollPanes[index].setMinimumSize(new Dimension(135, 300));
            jScrollPanes[index].setMaximumSize(new Dimension(135, 300));
            jScrollPanes[index].setPreferredSize(new Dimension(135, 300));
        }

        for (int index = 0; index < labels.length; index++) {
            gbc.gridx = index;
            gbc.gridy = 0;
            gbc.insets = new Insets(8, 8, 8, 8);
            panel.add(labels[index], gbc);
            gbc.gridy = 1;
            if (index == labels.length - 1) {
                gbc.insets = new Insets(8, 8, 8, 13);
            }
            panel.add(jScrollPanes[index], gbc);
        }}
4

1 に答える 1

3

内部 (JList) 境界線の上部/下部が表示されない理由は、... 垂直スクロールバーが表示される (リストがスクロールされない) 場合、それらは表示されないということです。

主張する場合は、次のいずれかを行います。

  • 境界線を切り替えます-リスト自体は空で、scrollPaneのlineBorderまたは
  • scrollPane の viewportBorderProperty を lineBorder に設定します。

注意: デフォルトの LAF 設定をいじることはお勧めしません。アプリケーション全体で一貫したビジュアルを保証するために、コンポーネントに境界線があるかどうかは UI に任せるべきです。また、scrollPane の垂直スクロールバーの横 (外側または内側) に左の境界線を配置するのも見栄えがよくありません。

編集

すでに 2 番目のオプションを試したことに気付きました (そして、結果に満足していません :-) しかし、スクロールバーが表示されている場合、どこに垂直境界線が必要ですか? とにかく、気をつけてください: 結果は LAF に大きく依存します ...

于 2012-08-17T08:22:53.527 に答える