2011-04-22 81 views
4

簡短版本:我需要做一些棘手的事情來讓JDialog的setMaximumSize()工作嗎?設置一個JDialog的最大尺寸?

完整版本:我有一個JDialog(佈局管理器:BorderLayout的),其中包含與提交按鈕底部的滾動面板和一個JPanel。

滾動窗格包含一個在系統中其他地方動態構建的JPanel。

我想要的是讓對話框圍繞JPanel動態調整自己的大小,直到達到一定的大小,然後開始生長滾動條。這或多或少是默認情況下發生的,除了最大尺寸似乎是我的顯示器的尺寸。

以爲這是什麼.setMaximumSize()方法繼承java.awt.Component中沒有,但設置它似乎並沒有產生任何影響。

設置首選大小確實有效果 - 但隨後的對話框始終是大小不管是什麼,這真的是不是我想要的。

(和影響是相同的,如果我設置滾動窗格中的最大/首選大小屬性。)

我錯過了什麼巨大明顯?是否有一些我不知道的古怪的JDialog/BorderLayout/MaximumSize交互?

+1

是如何形成的 「一定規模」 確定的?我的答案在下面假設它由面板的內容控制。 setMaximunSize(dont-dont-dont!)的原因是沒有效果的是BorderLayout不尊重最大尺寸提示 – kleopatra 2011-04-23 10:03:45

+0

「一定大小」基本上「足夠大以容納所有內容,除非它高於大約一半屏幕高度「。這回答了我的另一個問題:我從來沒有使用setMaximumSize()方法,並且有些驚訝,他們沒有工作。但是 - BorderLayout。很高興知道。 (現在我要回去忘記它們存在。) – 2011-04-26 17:01:08

回答

5

使面板imlement滾動是方式。又見(除了已經提供的教程鏈接Trashgod)羅布的博客文章

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

則:在典型的內容方面合理

1)實施getPreferredScrollableViewportSize()(對於一個JList f.i.多數民衆贊成行的首選號碼顯示,又名:visibleRowCount的)
2)實施制定者/吸氣對於那些「合理的條件」

該附加層(coordiates「合理的條件」),允許所有協作組件盡最大努力拿出健壯大小提示,而不作爲setXXSize不友好乾擾(這是一個無無從未有史以來,簡單地忘記這些方法存在;)

+0

AHA!實現可滾動確實做了這個把戲。出於某種原因,我認爲setMaximumSize()會和getPreferredScrollableViewportSize()做同樣的事情。 (爲什麼我會這麼想?)非常感謝! – 2011-04-26 16:59:13

1

你必須從JComponents計算getSize()JScrollPane只是簡單的例子

編輯:和調用的JDialog#包()

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(); 
      } 
     }); 
    }} 
+0

我不是你的貶低選民,但我遇到了這個例子的麻煩。每次按下按鈕時,它都會縮小對話框。 – trashgod 2011-04-22 21:13:07

+0

@ trashgod是的,這是正確的outPut,也許它是一點點加密,但我仍然認爲不可能爲'BorderLayout.CENTER'設置MinSize或MaxSize,否則如果我將'JScrollPane'放置到另一個possitions/place NOTRH ,SOUTH(等),然後從'AbsoluteLaoyut'輸出結果很糟糕: – mKorbel 2011-04-22 21:32:48

+0

只是細節:如果我將'JScrollPane'添加到'TopLaoutContainer',我不需要聲明一些LayoutManager,它總是被佔用'BorderLayout.CENTER' ,那麼對於另一個JComponent(不使用任何LayoutManager)只有FlowLayout – mKorbel 2011-04-22 21:59:28

9

正如Sizing a Scroll Pane討論的,一些組件可以提供有關設置的有用信息視口的首選大小。 JListsetVisibleRowCount()方法特別方便,但即使是getViewport().setPreferredSize(…)也可以。當然,sscce會有所幫助。

附錄:作爲具體的例子,下面的對話框被初始尺寸以具有Ñ -2行。隨着越來越多的被添加,該對話框增長,直到數量達到Ñ。那時滾動條開始「增長」。該示例使用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(); 
      } 
     }); 
    } 
} 
+0

顯示相應的「刪除」按鈕[此處](http://stackoverflow.com/a/11708672/230513)。 – trashgod 2012-07-29 11:02:56

2

到定尺寸從而導致的JDialog的pack()的方法依賴於調用getPreferredSize()來確定要使用的大小。

如果您繼承了JDialog,則可以通過繼承此方法來強制執行最大大小。

例子:

@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; 
}