【问题标题】:JTextArea in GridBagLayout stealing too much spaceGridBagLayout 中的 JTextArea 窃取了太多空间
【发布时间】:2013-02-21 05:06:41
【问题描述】:

我有一个 GridBagLayout,出于某种原因,我的 JTextArea 决定它不想听 gridbag 的比例,当创建包含布局的面板时,我的文本框会增长直到它占用 1/2屏幕。下面是一些代码:

        tp = new JTabbedPane();
        tp.setFont(Main.f);
        //Adds tabs with several buttosn to my tabbed pane
        for(Menu menu : FileManager.menus){
            JPanel tmp = new JPanel();
            int s = (int) Math.ceil(Math.sqrt(menu.products.size()));
            tmp.setLayout(new GridLayout(s,s));
            for(Product p : menu.products){//Act as
                p.setFont(Main.f);
                p.addActionListener(this);
                tmp.add(p);
            }
            tp.addTab(menu.name,null,tmp,null);
        }
        receipt.setBorder(BorderFactory.createEtchedBorder());

        //starting up with GridBag
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.ipadx = 0;
        gbc.ipady = 0;

        //sets up and adds the JTabbedPane
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;
        gbc.weightx = 0.8;
        gbc.weighty = 0.8;
        add(tp,gbc);

        //sets up and adds receipt - The one that takes up half the screen
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 0.2;
        receipt.setEditable(false);
        receipt.setText("Ticket number: 0\n" +
                "Transaction number: 0\n");
        receipt.setLineWrap(true);
        add(receipt,gbc);

        //sets up and adds a JPanel that has a bunch of buttons on it(Uses gridlayout)
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 2;
        gbc.gridheight = 1;
        gbc.weightx = 1;
        gbc.weighty = 0.2;
        add(buttons,gbc);

        buttons.setLayout(new GridLayout(1,8));
        createButton(newtable);
        createButton(remove);
        for(JButton a : quicks)
            createButton(a);
        createButton(pay);
        createButton(exit);

        revalidate();
        repaint();

当我将 TextArea 更改为空白 JButton 时,它根本不会占用太多空间。基本上,该空间由右侧的对象填充。如何告诉 gridbag 我希望左侧对象跨越屏幕的 4/5,而右侧对象跨越最后 1/5?在这个版本中,我尝试使用加权来实现,在我的原始版本中,我尝试使用单元格来实现,所以左侧对象位于 gridx=0 gridwidth = 4,右侧对象位于 gridx = 4 gridwidth = 1

这两种方法都不起作用。我也愿意接受其他想法(比如更好的布局或 JTable?)

感谢您的帮助, 追逐

它在做什么 它应该做什么的维度

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 如果将 textarea 放在 JScrollPane 中会怎样?
  • 您能发布启动 JTextArea 的代码吗?从头顶开始,我会设置 textarea 上的列数,而不给它任何水平权重。请记住,权重用于评估额外可用空间的比率(即,在移除每个组件所需的首选宽度/高度之后)

标签: java swing gridbaglayout


【解决方案1】:

如果您不固定在精确的 4/5 和 1/5 比例,您可以使用 BorderLayout 并将按钮放置在中心,将文本区域放置在东方。

边框布局将根据您提供的宽度显示文本区域 - 指定首选大小(宽度,您可以将高度设置为您想要的任何数字,边框布局将忽略它)。其余的空间则由按钮面板占据。

您可以在此处了解有关边框布局的更多信息:http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html

【讨论】:

  • 这是一个很好的计划 - 最初我没有为底部的所有按钮设置 JPanel,但正如我现在所做的那样,它会起作用。如果我将首选宽度设置为 getWidth()/5,它将实现正确的比率。
  • @csga5000 getWidth() 在实际显示组件之前将为 0。
  • @JakubZaverka 组件大小不取决于其可见性,而是取决于组件是否已由其 LayoutManager 布局(例如,如果在包含框架上调用了 pack())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 2019-08-29
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
相关资源
最近更新 更多