簡體   English   中英

JFrame中裝箱的JScrollPanes之間的多余空間

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM