Формат строки miglayout: JScrollPane, содержащий 1-строчную JTextArea - PullRequest
0 голосов
/ 11 января 2011

Я хочу отобразить однострочную текстовую метку с горизонтальной полосой прокрутки, если это необходимо.(Нет вертикальной полосы прокрутки, так как я знаю, что это одна строка.)

Я реализую через JScrollPane, содержащую JTextArea.

Для менеджера компоновки я использую MigLayout и не могу понять,что использовать для спецификации формата строки.Если я просто использую [], то он прекрасно работает, если горизонтальная полоса прокрутки отсутствует, но когда появляется полоса прокрутки, она выглядит плохо, поскольку полоса прокрутки занимает все пространство.

Я бы хотел либо:

  • показывает JScrollPane с постоянной высотой, которая хорошо выглядит при наличии полосы прокрутки, и имеет дополнительное пространство при отсутствии полосы прокрутки
  • показывает JScrollPane с переменной высотой, так что высотапанель - это 1 строка текста, когда полоса прокрутки отсутствует, или дополнительное пространство для размещения полосы прокрутки, когда она есть.
  • показать JScrollPane так, чтобы он занимал только 1 строку текста (например, полоса прокрутки измененатак что он съедает часть горизонтального пространства справа от рассматриваемого текста)

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

Чтобы полоса прокрутки не перекрывала область просмотра, вам нужно реализовать интерфейс Scrollable для компонента, который обертывает JScrollPane (в вашем случае JTextArea), и иметь Scrollable.getScrollableTracksViewportHeight() return true.См. этот ответ для примера реализации.

1 голос
/ 05 октября 2011

Интересная проблема (и мне не слишком нравится смотреть на jpa, как я должен)

По сути, это не так уж много, что макет может сделать сам по себе: размер pref scrollPane отличается в зависимости от видимостигоризонтальная полоса прокрутки.Код клиента должен динамически сообщать менеджеру, что делать с подлежащей покрытию областью, IMO.Ниже приведен фрагмент кода для игры.

  • он использует невидимый фиктивный компонент с фиксированным размером, возможно, видимой горизонтальной полосы прокрутки (да, Галс, я знаю, этот фиксированный размер должен динамически корректироваться для любых свойств, изменяющих высоту горизонтальной полосы прокрутки scrollPane: -)
  • устанавливает компонент componentListener на горизонтальную полосу прокрутки scrollPane, корректирует режим скрытия манекена при изменении видимости и повторно проверяет содержащую панель.

Работает нормально для Win / Nimbus, естьглюк в металле, хотя (и, возможно, другие LAFs), которым требуется корректировка магического числа различий, чтобы поддерживать устойчивый макет

    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");

Обратная связь очень приветствуется, возможно, есть менее искусственный подход, который я пропустил

...