2014-01-22 63 views
1

我正在爲改進過濾的自定義源服務器瀏覽器製作GUI。JavaGUI:寬度適合容器的盒子佈局?

這就是我所擁有的so far

然而,當我resize ...

當我調整我想要的L4D2「過濾器板」來調整到容器的當前最大寬度的窗口。我也希望能夠在一列中添加更多這些面板(例如框佈局提供)。

Boxlayout將面板顯示在列中,但不會爲寬度做任何事情。 我想我可能需要重寫過濾器面板首選大小的方法,以便他們可以檢索父容器的大小,但我不知道如何做到這一點。

我該如何解決這個問題?

編輯:下面是一個示例程序,描述了這個問題。

import javax.swing.*; 
import java.awt.*; 

public class guiExampleProblem { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       final MyWindows wnd = new MyWindows("guiExampleProblem"); 
       wnd.setVisible(true); 
      } 
     }); 
    } 
} 

class MyWindows extends JFrame { 
    public MyWindows(String text) { 
     super(text); 

     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);   

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));   

     JPanel containerPanel1 = new JPanel(); 
     JPanel containerPanel2 = new JPanel(); 
     JPanel containerPanel3 = new JPanel(); 
     containerPanel1.setBackground(Color.BLACK); 
     containerPanel2.setBackground(Color.RED); 
     containerPanel3.setBackground(Color.GREEN); 

     mainPanel.add(containerPanel1); 
     mainPanel.add(containerPanel2); 
     mainPanel.add(containerPanel3); 

     this.add(mainPanel); 
     pack(); 
    } 
} 

當被調整大小的窗口中,我想將面板僅沿着x軸膨脹,並保持在上,y軸具有恆定的高度,但是本例中的面板上都xy軸展開。

回答

0

放置要在BorderLayout的中心拉伸的面板(帶有BoxLayout) - 將面板放在該BorderLayout的東邊的右側。你沒有詳細說明你想做什麼,也沒有任何代碼,但這可能是你想要的。

-

您的解決方案後:在我看來,這裏使用的FlowLayout是混亂的 - 它勾畫出它的組件一個接一個水平,和你從容器的寬度越來越首選大小的伎倆使其行爲有所不同。我也避免陷入佈局邏輯在我的應用程序時,我可以,所以我找了另一種方式來做到這一點,想出了:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 

import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 

public class guiExampleProblem2 
{ 
    public static void main(String[] args) 
    { 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
     final MyWindows2 wnd = new MyWindows2("guiExampleProblem2"); 
     wnd.setVisible(true); 
     } 
    }); 
    } 
} 

class MyWindows2 extends JFrame 
{ 
    public MyWindows2(String text) 
    { 
    super(text); 

    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

    JPanel mainPanel = new JPanel(); 
    mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS)); 

    JPanel containerPanel1 = addContainedPanel(Color.BLACK, 60, 60, mainPanel); 
    JPanel containerPanel2 = addContainedPanel(Color.RED, 60, 60, mainPanel); 
    JPanel containerPanel3 = addContainedPanel(Color.GREEN, 60, 60, mainPanel); 

    this.add(mainPanel, BorderLayout.NORTH); 

    pack(); 
    } 

    JPanel addContainedPanel(Color color, int width, int height, JPanel container) 
    { 
    JPanel panel = new JPanel(); 
    panel.setPreferredSize(new Dimension(width, height)); 
    panel.setBackground(color); 
    container.add(panel); 
    return panel; 
    } 
} 

這將使用BorderLayout的北部分(這是默認佈局一個JFrame,順便說一句)做你想要的主要東西 - 水平拉伸東西。具有頁面軸的BoxLayout旨在將事情從頭到尾放置,所以我認爲這對讀者來說不那麼令人困惑。無論如何,這是另一種方式,我認爲使用組件(包括佈局管理器)更像他們的意圖和記錄。

+0

感謝您的回覆,我已更新我的問題以更具體。 – tommy

+0

[不要使用setXXSize,有史以來](http://stackoverflow.com/a/7229519/203657) – kleopatra

0

我設法通過覆蓋'過濾器面板'getPrefferedSize方法來獲得所需的功能,以便它們檢索父容器寬度並使用它。以下是示例代碼:

import javax.swing.*; 
import java.awt.*; 

public class guiExampleProblem { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       final MyWindows wnd = new MyWindows("guiExampleProblem"); 
       wnd.setVisible(true); 
      } 
     }); 
    } 
} 

class MyWindows extends JFrame { 
    public MyWindows(String text) { 
     super(text); 

     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);   

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new FlowLayout());  


     JPanel containerPanel1 = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(this.getParent().getWidth(),60); 
      } 
     }; 
     JPanel containerPanel2 = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(this.getParent().getWidth(),60); 
      } 
     }; 
     JPanel containerPanel3 = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(this.getParent().getWidth(),60); 
      } 
     }; 
     containerPanel1.setBackground(Color.BLACK); 
     containerPanel2.setBackground(Color.RED); 
     containerPanel3.setBackground(Color.GREEN); 

     mainPanel.add(containerPanel1); 
     mainPanel.add(containerPanel2); 
     mainPanel.add(containerPanel3); 


     this.add(mainPanel); 
     pack(); 
    } 
} 
+0

糟糕的主意 - 大小提示預計將返回基於內容(和/或孩子)的大小,而不是父母。做後者可能會產生意想不到的結果甚至掛起應用程序。由於BoxLayout尊重組件的maxSize,所以要覆蓋getMaxSize以返回高度限制。 – kleopatra