2011-07-18 2 views
2

Как часть приложения, которое я пишу, мне нужно смешать старый (тяжеловесный) холст с компонентами качания - в частности, вложенность их внутри JSplitPane. Однако, когда я делаю это, делитель отказывается изменять размер в любом месте, как если бы ни холст не принял уменьшение размера. Код демонстрирует проблему таким образом:JSplitPane and Canvas

JFrame frame = new JFrame(); 
JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new Canvas(), new Canvas()); 
pane.setResizeWeight(0.5); 
frame.add(pane); 
frame.pack(); 
frame.setVisible(true); 

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

  • Используйте JPanel вместо (не всегда вариант, как в моем случае, когда я использую vlcj для визуализации непосредственно на холсте)
  • Вставьте х хитроумный хак, который может работать в некоторых случаях

Есть ли лучший способ сделать это? Или это просто случай использования хаков? Я обсуждал другие варианты, такие как альтернативная реализация SplitPane, которая работает, но нет никакой супертяжелой реализации, и я был бы удивлен, если бы облегченный вариант избежал проблемы.

+0

Какую версию Java вы используете? Некоторые ведут себя лучше при смешивании тяжелых и легких весовых компонентов, чем другие. –

+0

@Hovercraft Full Eels - Протестировано как с последними версиями Java 6, так и с Java 7 RC - оба дают тот же результат. – berry120

ответ

6

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

Я никогда раньше не использовал холст, но кажется, что минимальный размер всегда по умолчанию соответствует предпочитаемому размеру.

Измените метод размера getMinimumSize (...) Canvas, чтобы вернуть разумный минимум.

Для быстрого текста вы можете использовать:

Canvas canvas = new Canvas(); 
canvas.setMinimumSize(new Dimension(50, 50)); 
JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, canvas, new Canvas()); 

, и вы будете иметь возможность перемещать разделитель влево, но не обратно вправо.

+0

Большое спасибо за этот ответ - он отлично работает, и я все еще удивляюсь, что это так просто! – berry120

 Смежные вопросы

  • Нет связанных вопросов^_^