[英]Extra space between boxed JScrollPanes in a JFrame
我正在嘗試在JFrame
創建一個相對較小的基於文本的游戲。 我計划將此JFrame
保持恆定大小,因此我將其稱為setResizable(false)
。
我的目標是使文本I / O功能有點像控制台或命令提示符,因此我有兩個JTextArea
,每個都在JScollPane
,然后將它們都添加到Box
,一個在其他。 我希望這些組件保持恆定的大小,因此我使用適當的尺寸調用setPreferredSize()
和setMaximumSize()
。
但是,當我將其中兩個Box添加到JFrame
,有一個水平間隙將它們分開。 間隙似乎已附加到組件的右邊框。 請參見此行為的圖片:
)。
我在內容窗格中使用FlowLayout
,並將hGap設置為0,但是我添加的組件之間仍然存在間隙,我無法弄清原因。
為了確認JFrame
本身或其布局管理器沒有問題,我還添加了兩個包含按鈕的框,以說明它們之間沒有縫隙。
如果可能的話,我想消除這些差距,或者至少確定是什么原因造成了這些差距。 在這一點上,我不知道還有什么可能導致此問題,並且我很樂意提供任何建議。
編輯:這是我希望此演示類看起來像的圖片:
我已將相關的代碼片段摘錄到此類中以演示我的問題:
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();
}
}
盡管我對Swing或LayoutManagers不夠熟悉,無法確切地說出原因,但我弄清楚了造成間隙出現的原因。
通過僅刪除對內部組件的setMaximumSize()
的調用,該程序可以按照我希望的方式工作。 我的猜測是,其中一個布局管理器(可能是Box
內置的BoxLayout
?)的行為與我要求使用絕對最大大小時所期望的不太一樣,而不是依賴於首選大小並讓布局管理器執行工作。
這是修改后的代碼,相關行已被注釋掉。
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;
}
盡管此解決方案可以實現我想要的功能,但是它可能並不理想,正如Andrew Thompson在其評論中提到的那樣,我應盡量避免設置任何首選/最大尺寸。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.