JXMultiSplitPane сходит с ума, когда я переключаю вкладки - PullRequest
2 голосов
/ 21 августа 2011

Я использую JXMultiSplitPane (из SwingX 1.6.2) для реализации трехпанельного горизонтального интерфейса.В центральной панели находится JTabbedPane с двумя вкладками: одна с JTextAreaJScrollPane, конечно), используемая для ввода кода уценки, а другая JEditorPane (снова в панели прокрутки) дляотображение визуализированного предварительного просмотра HTML.Когда пользователь переключается на панель предварительного просмотра, текст в редакторе обрабатывается и отображается на панели предварительного просмотра.

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

Я нашел только два способа справиться с этим, прежде чем это произойдет:

  1. Изменение размера вручнуюодна из панелей перед вводом текста.
  2. Присвойте центральной панели вес 1 в модели MultiSplitLayout.

Я не могу использовать вторую, поскольку она расширитцентральная панель, по умолчанию занимающая почти все окно.

Есть ли способ исправить это?

Обновление

После еще небольшого тестирования, даже техники (2)не сохраняет размер постоянным;переключение между двумя вкладками немного меняет размер центральной панели.

Теперь я считаю, что проблема частично связана с панелью с вкладками.JTextArea и JEditorPane имеют разный размер, и размер JTabbedPane изменяется при переключении между ними (так как я каждый раз сбрасываю текст JEditorPane. Это не будет проблемой, за исключением того, чтоJXMultiSplitPane будет автоматически изменять размер центральной панели до тех пор, пока пользователь не изменит размер вручную, изменив размер вручную.

Так что я смогу исправить проблему, установив размер JTabbedPane фиксированным, но все еще способнымбыть изменен размерами ручки. Какие-либо советы по этому поводу?

1 Ответ

1 голос
/ 23 августа 2011

MultiSplitLayout является .. LayoutManager, поэтому вы должны понять, как он работает (я тоже, не слишком знаком с ним сам :-)

Базовая компоновка происходит в соответствии с prefSize компонента, весамипредназначены для распределения избыточного / недостающего пространства относительно прив.По умолчанию разделители являются «плавающими», то есть они располагаются между компонентами в соответствии с базовым механизмом.В тот момент, когда пользователь касается разделителя, разделители «не плавают», скомпонованы так, чтобы помещаться между разделителями.Это причина того, что вы не видите жадность размера после однократного перемещения разделителя.Таким образом, один выход - это

  • настроить JXMultiSplitPane, как обычно, добавить компоненты и реализовать кадр
  • исправить разделители после того, как менеджер выполнил начальную компоновку

    String layout = "(ROW " +
        "(LEAF name=selector weight=0.15)" +
        "(LEAF name=center weight=0.7)" +
        "(LEAF name=list weight=0.15)" +
    ")";
    
    JXMultiSpitPane pane = new JXMulitSplitPane((MultiSplitLayout.parseModel(layout))
    // add components and realize the frame  
    ...
    pane.getMultiSplitLayout().setFloatingDividers(false);
    

В качестве альтернативы, придать весам больше веса - вынудите layoutManager использовать их для самого макета (а не только для распределения избыточного / недостающего пространства).Побочным эффектом является то, что prefSize для композиций может быть установлен (по макету, который является "нет, никогда", но кто совершенен ;-)

   pane.getMulitSplitLayout().setLayoutByWeights(true);

Не уверен, какой путь я бы предпочелили если / как это можно сделать в мультисплите ..

...