2017-01-17 69 views
0

我試圖在JFrame中創建一個相對較小規模的基於文本的遊戲。我打算保持這個JFrame在一個恆定的大小,所以我打電話setResizable(false)JFrame中盒裝JScrollPanes之間的額外空間

我的目標是使該有所表現得像一個控制檯或命令提示符下一個文本I/O功能,所以我有一個JScollPane內的兩個JTextArea S,各自,然後我他們倆加入Box,一個在另一個之上。我希望這些組件保持恆定的尺寸,所以我使用適當的尺寸調用了setPreferredSize()setMaximumSize()

但是,當我將這兩個盒子添加到JFrame時,它們之間存在橫向差距。差距似乎附在組件的右側邊框上。請參閱此行爲的附圖:

gaps)。

我在內容窗格中使用了FlowLayout,hGap設置爲0,但是我添加的組件之間仍然存在間隙,我找不到原因。

要確認它不是JFrame本身或其佈局管理器的問題,我還添加了兩個包含按鈕的框以說明它們之間沒有間隙。

如果可能的話我想刪除差距,或至少確定是什麼原因造成的。在這一點上,我不知道還有什麼可能導致這個問題,我會很感激任何建議。

編輯:這裏是希望這個演示類什麼我看起來像一個畫面:

no gaps

我已經摘錄的代碼中的相關位到這個類來說明我的問題:

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

public class Demo extends JFrame { 
    public Demo() { 
     super("Demo"); 
     setSize(400, 400); 
     setResizable(false); 

     int Y_AXIS = BoxLayout.Y_AXIS; 

     getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); 
     getContentPane().setBackground(Color.RED); 

     Box boxA = new Box(Y_AXIS); 
     boxA.add(createComponent("output")); 
     boxA.add(createComponent("input")); 
     this.add(boxA); 

     Box boxB = new Box(Y_AXIS); 
     boxB.add(createComponent("output")); 
     boxB.add(createComponent("input")); 
     this.add(boxB); 

     Box boxC = new Box(Y_AXIS); 
     boxC.add(new JButton("Button")); 
     boxC.add(new JButton("Button")); 
     this.add(boxC); 

     Box boxD = new Box(Y_AXIS); 
     boxD.add(new JButton("Button")); 
     boxD.add(new JButton("Button")); 
     this.add(boxD); 

     this.setVisible(true); 
    } 

    private JScrollPane createComponent(String initial) { 
     JTextArea ta = new JTextArea(3, 10); 
     ta.setText(initial); 
     JScrollPane sp = new JScrollPane(ta); 

     Dimension pref = new Dimension(100, 100); 
     sp.setPreferredSize(pref); 
     sp.setMaximumSize(pref); 

     sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); 
     sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

     return sp; 
    } 

    public static void main(String[] args) { 
     Demo d = new Demo(); 
    } 

} 
+1

1)空格似乎來自'Box'而不是'FlowLayout'。2)提供ASCII藝術或簡單的GUI圖形佈局。 –

+0

@AndrewThompson謝謝你的提示!正如你所建議的那樣,我用一張我想讓GUI看起來像的圖片來修改這篇文章。基本上,我只是想消除差距。你有什麼想法,盒子可能會導致它出現?我很困惑 - JButtons也在盒子裏,但沒有顯示任何差距。 – kattusite

+1

我可能會使用四個面板。 1)用於文本區域的2x2'GridLayout'。 2)按鈕的2x2'GridLayout'。 3)用於居中包含按鈕的面板的'GridBagLayout'。 4)用於文本區域面板('LINE_START')的'BorderLayout',以及使用'GridBagLayout'('LINE_END')的面板。 - 不要混淆首選。最小或最大尺寸的任何東西。將「EmptyBorder」添加到具有邊框佈局的面板,然後在顯示幀之前打包該幀。 –

回答

0

我想清楚是什麼導致了間隙的出現,儘管我不太熟悉Swing或LayoutManagers準確地說出原因。

通過去除對內部組件的setMaximumSize()的調用,該程序以我喜歡的方式工作。我的猜測是,當被要求使用絕對最大尺寸時,其中一個版面管理器(可能是嵌入BoxBoxLayout?)的行爲與我預期的不同,而不是依賴於首選尺寸,並讓佈局管理器執行工作。

下面是修訂後的代碼,將有問題的行註釋掉了。

private JScrollPane createComponent(String initial) { 
    JTextArea ta = new JTextArea(3, 10); 
    ta.setText(initial); 
    JScrollPane sp = new JScrollPane(ta); 

    Dimension pref = new Dimension(100, 100); 
    sp.setPreferredSize(pref); 
    //sp.setMaximumSize(pref); 

    sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); 
    sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

    return sp; 
} 

雖然這種解決方案做什麼,我想它,它可能是不理想的,因爲安德魯·湯普森在他的評論中提到的,我要儘量避免設置任何優選/最大尺寸。