Установка максимального размера JDialog?

Краткая версия: мне нужно сделать что-то сложное, чтобы заставить setMaximumSize () JDialog работать?

Полная версия: у меня есть JDialog (менеджер макета: BorderLayout), который содержит панель прокрутки и JPanel внизу с кнопками фиксации.

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

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

Я думал, что это то, что метод .setMaximumSize () унаследовал от java.awt.Component, но настройка его, похоже, не имеет никакого эффекта.

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

(И эффекты одинаковы, если я устанавливаю максимальные / предпочтительные свойства размера на панели прокрутки.)

Я пропустил что-то чрезвычайно очевидное? Есть ли какие-то нелепые взаимодействия JDialog / BorderLayout / MaximumSize, о которых я не знаю?

Сделать проецирование панели прокручиваемым способом. См. Также (в дополнение к ссылке, которую Trashgod уже предоставил) Запись блога Роба

http://tips4java.wordpress.com/2009/12/20/scrollable-panel/

тогда:

1) реализовать getPreferredScrollableViewportSize () в терминах, приемлемых для типичного контента (для JList fi это предпочтительное количество строк для отображения, aka: visibleRowCount)
2) внедрить сеттеры / геттеры для этих «разумных условий»,

Этот дополнительный слой (координирует «разумные условия») позволяет всем сотрудничающим компонентам делать все возможное, чтобы придумать надежные подсказки размеров без недружелюбных помех, как setXXSize (который никогда не бывал, просто забывайте, что эти методы существуют;)

Как описано в разделе «Определение области прокрутки» , некоторые компоненты могут предоставить полезную информацию об установке предпочтительного размера в окне просмотра. Метод setVisibleRowCount() JList особенно удобен, но даже getViewport().setPreferredSize(…) может быть достаточно getViewport().setPreferredSize(…) . Естественно, помощь sscce .

Добавление. В качестве конкретного примера, диалоговое окно ниже имеет размер, равный N -2. По мере добавления большего числа диалог увеличивается до тех пор, пока число не достигнет N. В этот момент полосы прокрутки начинают «расти». В примере используется JList , но любой Scrollable компонент должен быть адаптирован.

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; /** @see http://stackoverflow.com/questions/5759131 */ public class ListDialog { private static final int N = 12; private JDialog dlg = new JDialog(); private DefaultListModel model = new DefaultListModel(); private JList list = new JList(model); private JScrollPane sp = new JScrollPane(list); private int count; public ListDialog() { JPanel panel = new JPanel(); panel.add(new JButton(new AbstractAction("Add") { @Override public void actionPerformed(ActionEvent e) { append(); if (count <= N) { list.setVisibleRowCount(count); dlg.pack(); } } })); for (int i = 0; i < N - 2; i++) { this.append(); } list.setVisibleRowCount(N - 2); dlg.add(sp, BorderLayout.CENTER); dlg.add(panel, BorderLayout.SOUTH); dlg.pack(); dlg.setLocationRelativeTo(null); dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); dlg.setVisible(true); } private void append() { model.addElement("String " + String.valueOf(++count)); list.ensureIndexIsVisible(count - 1); } public static void main(String[] a_args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { ListDialog pd = new ListDialog(); } }); } } 

Метод pack (), который вызывает размер JDialog, зависит от вызова метода getPreferredSize (), чтобы определить, какой размер использовать.

Если вы подclassифицируете JDialog, вы можете обеспечить максимальный размер путем подclassификации этого метода.

Пример:

 @Override public Dimension getPreferredSize() { int maxWidth=500; int maxHeight=300; Dimension dim=super.getPreferredSize(); if (dim.width>maxWidth) dim.width=maxWidth; if (dim.height>maxHeight) dim.height=maxHeight; return dim; } 

вам нужно рассчитать getSize() из JComponents внутри JScrollPane просто простой пример

Изменить: и вызвать JDialog # pack ()

 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.event.ActionEvent; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.JScrollPane; public class PackDialog { private JDialog dlg; private JScrollPane scrollPane; private JPanel panel; private JButton btn; public PackDialog() { btn = new JButton(); btn.setPreferredSize(new Dimension(300, 30)); btn.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { btnActionPerformed(evt); } private void btnActionPerformed(ActionEvent evt) { int h = panel.getHeight(); h += btn.getHeight(); int w = panel.getWidth(); dlg.setPreferredSize(new Dimension(w, h)); dlg.pack(); } }); panel = new JPanel(); panel.setPreferredSize(new Dimension(300, 600)); panel.setLayout(new BorderLayout(10, 10)); panel.add(btn, BorderLayout.SOUTH); scrollPane = new JScrollPane(panel); dlg = new JDialog(); dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); dlg.setPreferredSize(new Dimension(400, 300)); dlg.add(scrollPane); dlg.pack(); dlg.setVisible(true); } public static void main(String[] a_args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { PackDialog pd = new PackDialog(); } }); }} 
  • Установка размера печати jLabel и установка jRadiobutton на печать
  • Разница между validate (), revalidate () и invalidate () в графическом интерфейсе Swing
  • JMenu ActionListener
  • Как создать пользовательский компонент Swing
  • как печатать выбранные строки JTable
  • JOptionPane - проверка ввода пользователем и предотrotation закрытия до тех пор, пока не будут выполнены условия
  • Случайные ошибки при смене серии с использованием JFreeChart
  • Обновление ImageIcon в JTree без перекраски дерева?
  • paintComponent () vs paint () и JPanel vs Canvas в графическом интерфейсе типа кисти
  • Java: как сделать двойную буферизацию в Swing?
  • Как имитировать буферизованное периферийное устройство с SwingWorker?
  • Давайте будем гением компьютера.