【问题标题】:Why is my Titled Border Panel so small为什么我的标题边框面板这么小
【发布时间】:2016-04-04 23:45:00
【问题描述】:

我正在创建一个带有图形面板、命令面板和命令列表面板的 GUI。我使用 BorderLayout South 将命令面板放在框架底部,但我的侧面板很小且不可读。

我会在最后提供一张我希望我的框架看起来像的图片:

我目前拥有的:

谁能解释一下为什么 TitledBorder 面板这么小?

我的代码如下:

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class PenDriver {

public static void main(String[] args) {

    JFrame frame = new JFrame("Pen Simulator");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600, 400);

    penPanel panel = new penPanel();

    frame.add(panel);

    frame.setVisible(true);

}

}

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;

public class penPanel extends JPanel {

private JTextField userCommand;
private JLabel instruction1;
private JButton instruct, clear;
private JLabel cmd1;

public penPanel() {

    setLayout(new BorderLayout());

    // CREATE THE COMMAND PANEL///////

    // Set Layout
    JPanel command = new JPanel();
    command.setLayout(new BoxLayout(command, BoxLayout.LINE_AXIS));
    // Create Label and add to panel
    instruction1 = new JLabel("Enter Command:");
    // Create Buttons
    instruct = new JButton("Execute");
    clear = new JButton("Clear Graphics");

    // Create Text Field to panel
    userCommand = new JTextField(10);

    command.add(instruction1);
    command.add(Box.createRigidArea(new Dimension(4, 0)));
    command.add(userCommand);
    command.add(Box.createRigidArea(new Dimension(2, 0)));
    command.add(instruct);
    command.add(Box.createRigidArea(new Dimension(2, 0)));
    command.add(clear);

    // COMMAND PANEL FINISHED////////

    // CREATE THE COMMAND LIST PANEL//////////
    JPanel cmdList = new JPanel();
    cmdList.setBorder(BorderFactory.createTitledBorder("Command List:"));
    cmdList.setLayout(new BoxLayout(cmdList, BoxLayout.PAGE_AXIS));
    cmd1 = new JLabel("UP = up");
    cmdList.setSize(new Dimension(50, 400));
    cmdList.add(cmd1);

    add(command, BorderLayout.SOUTH);
    add(cmdList, BorderLayout.EAST);

}

}

谢谢!

编辑:在修改了这段代码之后:

    cmdList.setPreferredSize(new Dimension(120, 800));
    cmdList.add(cmd1);

    add(command, BorderLayout.SOUTH);
    command.add(Box.createRigidArea(new Dimension(120, 0)));
    add(cmdList, BorderLayout.EAST);

仍然不完全是我想要的,也不确定这是否是我应该做的。我应该直接更改驱动程序文件而不是 JPanel 吗?

请注意“清除图形”按钮的右侧仍然有一个间隙。有什么办法可以摆脱吗?

【问题讨论】:

  • 尝试在右侧面板中使用setPreferredSize 而不是setSize
  • @trashgod :感谢您的链接,这很有趣。
  • 您甚至不必调用 setPreferredSize()。 BorderLayout 将调用 cmdList。 getPreferredSize(),让它根据其内容确定所需的大小,然后使 EAST 面板足够大以适合。设置特定大小几乎总是错误的,因为如果您修改该面板的内容或更改该面板中任何内容的字体,您将更改该大小。 (但是,如果您的组件在 JScrollPane 内,那么您可以设置 ScrollPane 的首选大小,如果内容大于您指定的大小,则让它添加滚动条)
  • @fred,这就是为什么给出链接说你应该覆盖getPreferredSize() 方法,这可能是一个有效的解决方案。问题是边框中的文本未用于面板的首选大小计算。因此,一种解决方案可以覆盖面板的 getPreferredSize() 方法,以返回标题边框中文本宽度的默认首选宽度的最大值。因此,在这种情况下,覆盖首选大小可能是一个有效的解决方案。

标签: java swing layout


【解决方案1】:

谁能解释一下为什么 TitledBorder 面板这么小?

边框中文本的大小不用于确定组件的大小。因此,宽度取决于您添加到面板的组件的首选大小。

所以需要重写面板的getPreferredSize()方法,返回默认首选尺寸计算的最大值或标题边框的尺寸:

JPanel cmdList = new JPanel()
{
    @Override
    public Dimension getPreferredSize()
    {
        Dimension preferredSize = super.getPreferredSize();

        Border border =    getBorder();
        int borderWidth = 0;

     if (border instanceof TitledBorder)
     {
         Insets insets = getInsets();
         TitledBorder titledBorder = (TitledBorder)border;
         borderWidth = titledBorder.getMinimumSize(this).width + insets.left + insets.right;
     }

     int preferredWidth = Math.max(preferredSize.width, borderWidth);

     return new Dimension(preferredWidth, preferredSize.height);
    }
};

请注意“清除图形”按钮的右侧仍然有一个间隙。有什么办法可以摆脱吗?

command.add(Box.createRigidArea(new Dimension(120, 0)));

您刚刚将刚性区域添加到命令面板,因此您要求在末尾添加额外的 120 像素。

【讨论】:

  • 好的,我已经完成了,并在上面发布了结果。我没有用 panel.add 做到这一点,虽然我是通过改变这些行来做到的: cmdList.setPreferredSize(new Dimension(120, 800)); cmdList.add(cmd1);添加(命令,BorderLayout.SOUTH); command.add(Box.createRigidArea(new Dimension(120, 0))); add(cmdList, BorderLayout.EAST);
  • 将在上面的编辑中发布,因为这里不发布。
  • @SkyPlusk,不,永远不要使用 setPreferredSize()!!!您只是在随机猜测标题边框的大小。确定首选尺寸是布局管理器的工作。有关解决此问题的正确方法,请参阅我的更新答案。
  • if 语句说明了什么?我理解代码的顶部,因为您使用自己的参数覆盖了一个方法,但介意解释插​​入部分等。谢谢
  • @SkyPlus,插图提供了为上/左/下/右边框保留的空间。这是在组件周围绘制线条所需的空间。另一种方法是获取边框的文本长度。
猜你喜欢
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多