2015-07-20 5 views
1

Мне нужно создать интерфейс, где у меня есть InnerPanel, который изменяет размер с помощью OutterPanel. Хорошо, проблема в том, что мне нужно, чтобы InnerPanel изменялась только в 50 раз.Авторазмер JPanel кратным 50

Итак, если OutterPanel имеет 50 пикселей, InnerPanel имеет 50 пикселей. Если OutterPanel изменяет размер до 80 пикселей, InnerPanel остается размером 50 пикселей. Но когда OutterPanel получает размер до 110px, InnerPanel переходит на 100px.

Заранее благодарен!


Edit: Как было предложено, я отправляю вопрос о том, что я судимое до сих пор ... В конструкторе OutterPanel я добавил ComponentListener, чтобы изменить размер InnerPanel:

JPanel OutterPanel = this; 

this.addComponentListener(new ComponentAdapter() { 
    @Override 
    public void componentResized(ComponentEvent e) { 
     contentArea.setPreferredSize(new Dimension(OutterPanel.getPreferredSize().width, 500)); 
    } 
}); 

Сам приемник работает, проблема заключается в том, что OutterPanel.getPreferredSize(). Width всегда возвращается 0. По какой-то причине OutterPanel.getPreferredSize(). Height возвращает реальную высоту.

Как получить ширину OutterPanel? И каков наилучший путь для установки размера InnerPanel?

ответ

2

Переопределение метода getPreferredSize() внутренней панели.

Может быть что-то вроде:

@Override 
public Dimension getPreferredSize() 
{ 
    Dimension parentSize = getParent().getSize(); 
    int width = (parentSize.width/50) * 50; 
    int height = (parentSize.height/50) * 50; 
    return new Dimension(width, height); 
} 
+0

Работал очень хорошо, без необходимости чего-либо еще. Я знаю, что я очень много прошу, но не задумываюсь, чтобы рассказать, что происходит? Когда Swing использует внутреннюю панель getPreferredSize для определения собственного размера? – Psyny

+1

@Psyny, рад, что это помогло. Он не будет работать во всех ситуациях. То есть я не ожидаю, что он будет работать с макетом, который будет учитывать предпочтительный размер компонента при упаковке фрейма. Например, это не сработает, если вы добавите внешнюю панель в NORTH из BorderLayout, потому что, как вы ожидаете, предпочтительный размер будет равен 0. Он будет работать, когда вы добавите внешнюю панель в CENTER, потому что CENTER получит все дополнительные и он не распознает предпочтительный размер добавленного к нему компонента. – camickr

1

getSize(), а не getPreferredSize(). Когда внешняя панель изменяется, размер изменяется, но его предпочтительный размер не изменяется.

+1

Кроме того, вы должны думать о сбросе за пределы внутренней панели в методе внешней панели paintComponent(), а не искусственно изменяя предпочтительный размер внутренней панели. Обратите внимание, что предпочтительный размер - это подсказка, а не абсолютная; диспетчер компоновки может игнорировать предпочтительный размер детей. – FredK