JFrame

时间:2017-01-17 06:33:15

标签: java swing jframe jscrollpane boxlayout

我正在尝试在JFrame内创建一个相对小规模的基于文本的游戏。我打算将此JFrame保持不变,因此我调用了setResizable(false)

我的目标是创建一个文本I / O功能,有点像控制台或命令提示符,所以我有两个JTextArea,每个都在JScollPane内,然后我添加了它们都是Box,一个在另一个之上。我希望这些组件保持不变的大小,因此我使用适当的尺寸调用了setPreferredSize()setMaximumSize()

然而,当我向JFrame添加其中两个Box时,会有一个水平间隙将它们分开。间隙似乎附在组件的右边框上。请参阅此行为的附图:

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 个答案:

答案 0 :(得分:0)

我弄清楚导致出现差距的原因,尽管我对Swing或LayoutManagers不太熟悉,无法确切说明原因。

通过仅删除对内部组件的SELECT column1, column2, columnn, subquery1.sq1, subquery2.sq2, (SELECT CASE WHEN (subquery1.sq1) > 0 AND (subquery2.sq2) > 0 THEN CAST ( (subquery1.sq1) / (subquery2.sq2) AS DECIMAL) * 100 ELSE 0 END) AS "lessWastefulQueryResults" FROM some_table JOIN (SELECT * FROM other_table GROUP BY some_columns) subquery1 ON some_table.some_columns = subquery1.some_columns JOIN (SELECT * FROM yet_another_table GROUP BY more_columns) subquery1 ON some_table.more_columns = subquery1.more_columns 的调用,程序按照我喜欢的方式工作。我的猜测是,当被要求使用绝对最大尺寸时,其中一个布局管理器(可能setMaximumSize()内置的BoxLayout)的行为与我的预期不同,而不是依赖于首选大小,让布局管理员完成工作。

这是修改过的代码,有问题的行被注释掉了。

Box

虽然这个解决方案做了我想要的,但它可能并不理想,正如Andrew Thompson在他的评论中提到的那样,我应该尽量避免设置任何首选/最大尺寸。