2015-07-01 2 views
-2

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

У меня есть JDialog (ранее JFrame, но я изменил поток пользовательского интерфейса в последнее время для удаления избыточной JFrames) установлен в BorderLayout, который содержит три основных JPanels, заголовок, содержание и колонтитул.

В заголовке JPanel есть фоновое изображение, которое прекрасно загружается. Тем не менее, я называю все виды setMinimumSize/setPreferredSize/и т. Д. (Я даже пробовал setSize и setBounds из отчаяния), а JPanel не подбирается правильно. Макет для этого компонента - BoxLayout, и дети удобно сидят внутри него, но это не должно влиять на то, что я пытаюсь сделать с самой панелью заголовков.

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

Advice Я не ищет: «использовать другой LayoutManager

I хочу понять, есть ли причина, по которой дочерние компоненты не соблюдаются.

Я могу предоставить код, но изоляция небольшого, выполняемого сегмента затруднена с учетом количества взаимосвязанных систем, которые я жонглирую. Вот соответствующий фрагмент, чтобы установить размер JPanel. Размеры изображения 480 * 96.

public JPanelThemed(BufferedImage image) { 
    super(); 
    this.backgroundImage = image; 
    setAllSimilarConstraints(new Dimension(image.getWidth(), image.getHeight())); 
    setOpaque(false); 
} 

// for use with BoxLayout as it requires explicit bounds to be set 
public void setAllSimilarConstraints(Dimension dim) { 
    setPreferredSize(dim); 
    setMinimumSize(dim); 
    setMaximumSize(dim); 
} 
+3

'Я могу предоставить код, но изолировать небольшой, выполняемый сегмент сложно, учитывая количество взаимосвязанных систем, которые я жонглирую' - ну проблема, вероятно, где-то в этом коде, и мы понятия не имеем, что это за код. 'Я вызываю всевозможные setMinimumSize/setPreferredSize/etc' - Do not. Вам не нужно вручную ссылаться на эти методы. Задача менеджера компоновки заключается в определении правильного размера и расположения компонентов на панели. – camickr

+2

Что мы хотим - это [минимальная запущенная примерная программа] (http://stackoverflow.com/help/mcve). Это утверждение: «Я могу предоставить код, но изолировать небольшой, выполняемый сегмент сложно, учитывая количество взаимосвязанных систем, которые я жонглирую». «- предполагает, что вы сделаете сами и пользуетесь нами, реорганизовывая свой код, чтобы уменьшить циклическая сложность (это то, что вы описываете «Т»). Сделайте это, и вы, скорее всего, найдете проблему, вызвавшую вашу проблему выше, или если нет, затем опубликуйте небольшую управляемую программу для тестирования. –

+0

Итак, автоматический ответ - это честное голосование и говорит мне предоставить программный код для всей программы? Мне очень жаль, но я не понимаю этот менталитет, который пронизывает SO, что я видел слишком часто как lurker, неважно, задавая вопросы сам. Мы все программисты здесь, я прошу * знания * о 'JDialog', и если люди знают, как он обрабатывает размер компонента. В противном случае, 'BorderLayout'. – Gorbles

ответ

2

Если я не определяю размеры, как я могу отобразить весь фон, который я рисую?

Вы можете использовать JLabel для отображения ImageIcon. Размер метки будет размером изображения. Затем вы устанавливаете диспетчер компоновки метки, чтобы добавить к ней компоненты.

Edit:

вы знаете, почему это обычно рекомендовали подкласс JPanel при рисовании фона в Java

При использовании JPanel размера панели на основе компонентов, добавленных к панели и менеджеру макета, который вы используете. Затем ваш собственный код рисования должен нарисовать изображение так, как вы хотите. То есть вы можете нарисовать изображение с (0, 0), или вы можете центрировать изображение на панели, вы можете масштабировать изображение, чтобы оно соответствовало области, но изображение никак не контролирует размер панели, если только вы переопределяете метод панели getPreferredSize(), чтобы использовать собственный код для создания размера большего размера компонентов или изображения. Таким образом, вы находитесь в полном контроле.

Когда вы используете предложенный здесь подход JLabel, размер метки всегда равен размеру изображения.Затем компоненты будут размещаться на основе диспетчера компоновки, но могут быть усечены, если изображение меньше пространства, требуемого компонентами.

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

Вы также можете ознакомиться с Background Panel, который предоставляет эти общие функции окраски в многоразовом классе.

+0

Спасибо за этот подход; знаете ли вы, почему обычно рекомендуется подкласс «JPanel» при рисовании фона на Java? Это главная причина, по которой я пошел с моим предыдущим подходом. – Gorbles

+0

@Gorb см. Редактировать ... – camickr

+0

Оценка, спасибо. – Gorbles

5

Я бы реализовать это немного другой способ - обеспечить предпочтительный/мин/макс/размер не может быть изменен в другом месте:

public JPanelThemed(BufferedImage image) { 
    this.backgroundImage = image; 
    setOpaque(false); 
} 

public Dimension getPreferredSize() { 
    return new Dimension(this.backgroundImage.getWidth(), this.backgroundImage.getHeight()); 
} 
+0

Да, для [пример] (http://stackoverflow.com/a/2658663/230513), также обсуждался [здесь] (http://stackoverflow.com/q/7229226/230513); как только компонент может ответить своим предпочтительным размером, просто 'pack()' охватывающий 'JDialog'. – trashgod

+0

Спасибо за этот комментарий, не знаю, какой ответ я буду использовать. Знаете ли вы, где и как расширенные классы JComponent могут быть изменены в другом месте в отношении их размера? – Gorbles

+0

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

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