0

如果需要,我想显示一个具有水平滚动条的单行文本标签。(没有垂直滚动条,因为我知道它是一行。)

我正在通过包含 JTextArea 的 JScrollPane 实现。

对于布局管理器,我使用的是 MigLayout,但似乎无法弄清楚行格式规范要使用什么。如果我只是使用[],那么它在没有水平滚动条的情况下工作正常,但是当滚动条出现时,它看起来很糟糕,因为滚动条占用了所有空间。

我想做的是:

  • 显示具有恒定高度的 JScrollPane,当滚动条存在时看起来不错,并且在滚动条不存在时具有额外空间
  • 显示具有可变高度的 JScrollPane,以便窗格的高度在滚动条不存在时为 1 行文本,或者在滚动条存在时为容纳滚动条的额外空间
  • 以仅占用 1 行文本的方式显示 JScrollPane(例如,更改滚动条,使其占用相关文本右侧的一些水平空间)

有什么建议么?

4

1 回答 1

1

有趣的问题(我并没有像我应该的那样过度热衷于研究 jpa)

基本上,布局本身并不能做太多事情:scrollPane 的首选项大小因水平滚动条的可见性而异。由客户代码动态地告诉经理如何处理要覆盖的区域,IMO。下面是一个可以玩的代码片段。

  • 它使用了一个不可见的虚拟组件,该组件具有可能可见的水平滚动条的固定大小(是的,gals,我知道,应该动态调整该固定大小以适应 scrollPane 水平滚动条的任何高度变化属性:-)
  • 它在scrollPane 的水平滚动条上安装了一个componentListener,在可见性变化时调整假人的隐藏模式并重新验证包含面板。

适用于 Win/Nimbus,但 Metal 中存在故障(可能还有其他 LAF),需要对 diff 进行幻数调整以保持布局稳定

    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 回答