【发布时间】: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() 方法,以返回标题边框中文本宽度的默认首选宽度的最大值。因此,在这种情况下,覆盖首选大小可能是一个有效的解决方案。