0

必要に応じて、水平スクロールバーのある 1 行のテキスト ラベルを表示したいと考えています。(1行だとわかっているので、垂直スクロールバーはありません。)

JTextArea を含む JScrollPane を介して実装しています。

レイアウト マネージャーについては、MigLayout を使用していますが、行形式の指定に何を使用すればよいかわかりません。使用しただけ[]では、水平スクロールバーがなくても問題なく動作しますが、スクロールバーが表示されると、スクロールバーがすべてのスペースを占有するため、見栄えが悪くなります。

私がやりたいことは次のいずれかです:

  • スクロールバーが存在するときは見栄えがよく、スクロールバーが存在しないときは余分なスペースがある一定の高さで JScrollPane を表示します
  • 可変高さで JScrollPane を表示して、スクロールバーがない場合はペインの高さが 1 行のテキストになるようにするか、スクロールバーがある場合はスクロールバーに対応する追加のスペースを確保します
  • JScrollPane を 1 行のテキストのみを使用する方法で表示します (たとえば、スクロールバーを変更して、問題のテキストの右側の水平スペースの一部を消費するようにします)。

助言がありますか?

4

1 に答える 1

1

興味深い問題です(そして、私はjpaを調べることにあまり熱心ではありませんでした)

基本的に、レイアウトがそれ自体でできることはあまりありません。scrollPane の優先サイズは、水平 scrollBar の可視性によって異なります。カバーされる領域である IMO をどう処理するかをマネージャーに動的に伝えるのは、クライアント コード次第です。以下は、遊ぶためのコードスニペットです。

  • 目に見える可能性のある水平スクロールバーの固定サイズを持つ非表示のダミーコンポーネントを使用します(ええ、ギャル、私は知っています、スクロールペインの水平スクロールバーのプロパティを変更する高さに合わせて固定サイズを動的に調整する必要があります:-)
  • scrollPane の水平スクロールバーに componentListener をインストールし、可視性の変更時にダミーの hidemode を調整し、含まれているパネルを再検証します。

Win/Nimbus では問題なく動作しますが、Metal (およびおそらく他の LAF) にはグリッチがあり、レイアウトを安定させるために差分のマジック ナンバーを調整する必要があります

    JTextArea area = new JTextArea("starting ", 1, 10);
    JScrollPane areaScrollPane = new JScrollPane(area);
    areaScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
    areaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    Dimension dim = areaScrollPane.getPreferredSize();
    areaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    // get the height diff with/out horizontal scrollbar
    int diff = dim.height - areaScrollPane.getPreferredSize().height;
    areaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

    LC lc = new LC().wrapAfter(2).debug(500);
    final MigLayout layout = new MigLayout(lc);
    final JPanel panel = new JPanel(layout);
    panel.add(new JLabel("OneLineRow"));

    panel.add(areaScrollPane);
    // create and add an invisible filler
    // note: metal needs magic adjust, dont know why
    // diff -= 3;
    final JComponent dummy = (JComponent) Box.createVerticalStrut(diff);
    dummy.setVisible(false);
    final String dummyConstraint = "span, hidemode ";
    panel.add(dummy, dummyConstraint + "0");
    // component listener which adjusts hidemode of filler on 
    // scrollpane's horizontal scrollbar showing/hiding
    ComponentAdapter adapter = new ComponentAdapter() {

        /** 
         * @inherited <p>
         */
        @Override
        public void componentShown(ComponentEvent e) {
            layout.setComponentConstraints(dummy, dummyConstraint + "2");
            panel.revalidate();
        }

        /** 
         * @inherited <p>
         */
        @Override
        public void componentHidden(ComponentEvent e) {
            layout.setComponentConstraints(dummy, dummyConstraint + "0");
            panel.revalidate();
        }

    };
    areaScrollPane.getHorizontalScrollBar().addComponentListener(adapter);
    panel.add(new JScrollPane(new JTable(20, 5)), "span");
    showInFrame(panel, "one line textArea");

フィードバックは大歓迎です。私が見落としていた人工的でないアプローチがあるかもしれません

于 2011-10-05T13:20:58.133 に答える