【问题标题】:JPanel, problems with resizingJPanel,调整大小的问题
【发布时间】:2015-02-15 12:43:00
【问题描述】:

我是新手。 尝试自动调整边框大小。我用 2 个面板在我的框架上做了边框。我在第一个面板中添加了带边框的面板。

我想要从所有边缘撤退的边框。在这个边框面板中,我还添加了文本面板和按钮。 当我展开窗口或调整它的大小时,带有边框的面板也在调整大小。但是当我使用 BorderLayout 时,边缘没有缩进。

public class App {
private JFrame frame;
private JPanel panel;
private JPanel panel_1;
private JTextField textField;
private JButton addBtn;

public static void main(String args[]) {
    App app = new App();

    app.initialize();

    app.frame.pack();
    app.frame.setVisible(true);
}

private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 800, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel = new JPanel();
    frame.getContentPane().add(panel, BorderLayout.NORTH);
    panel.setLayout(new BorderLayout(0, 0));

    panel_1 = new JPanel();
    panel_1.setPreferredSize(new Dimension(784, 40));
    panel_1.setBorder(new LineBorder(new Color(0, 0, 0)));

    panel.add(panel_1, BorderLayout.CENTER);

    textField = new JTextField();
    textField.setPreferredSize(new Dimension(6, 24));
    panel_1.add(textField);
    textField.setColumns(50);

    addBtn = new JButton("Add");
    addBtn.setPreferredSize(new Dimension(70, 24));
    panel_1.add(addBtn);
}

}

这是使用 BorderLayout - http://snag.gy/S43C2.jpg。 我还尝试在面板中使用 FlowLayout - http://snag.gy/ndjDG.jpg

你能帮帮我吗?

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。 2) 提供最小尺寸的 ASCII 艺术或简单的 GUI 布局图,如果可调整大小,则具有更大的宽度和高度。
  • 你已经展示了你想要的东西;请说明你想要什么。
  • 好的,我需要在这个屏幕上类似 snag.gy/4vUkE.jpg 我需要用与边缘有距离的边框包围一些组件。
  • "..by 与边缘有距离的边框。" 添加EmptyBorder.. 并且提示:添加@trashgod(或者@ 是重要)通知新评论的人。哦,还在等待那个 MCVE..

标签: java swing jpanel layout-manager


【解决方案1】:

问题在于,因为您在添加到BorderLayout.NORTH 的面板上设置了边框。当您调整窗口大小时,BorderLayout.NORTH 部分只会水平调整大小,这就是边框不会正确调整大小的原因。

public static void main(String args[]) {
    JavaApplication11 app = new JavaApplication11();

    app.initialize();

    app.frame.pack();
    app.frame.setVisible(true);
}

private JFrame frame;
private JPanel panel;
private JTextField textField;
private JButton addBtn;

private void initialize() {
    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel = new JPanel();
    frame.add(panel);

    Border border = new CompoundBorder(new EmptyBorder(5, 10, 15, 20), new LineBorder(Color.BLACK));
    panel.setBorder(border);

    textField = new JTextField(50);
    panel.add(textField);

    addBtn = new JButton("Add");
    panel.add(addBtn);
}

【讨论】:

  • Don't use setPreferredSize() when you really mean to override getPreferredSize(), absolute positioning,例如setBounds(),几乎从来都不是正确的解决方案。
  • 也许这个屏幕显示我想要的 - snag.gy/4vUkE.jpg 。如果 setPreferredSize() 等都是不好的解决方案,那么如何设置组件的大小?
  • 调整窗口大小后,组件总是会重新绘制。这就是为什么首选尺寸可能只在开始时有用,但通常依赖它并不是一个好主意。
  • 那么现在有什么问题呢?你想和边境保持距离吗?你能画出你想要达到的效果吗?
  • 是的,我想与边界保持距离。我只是想了解它是如何制作的。在这个屏幕snag.gy/XBMAQ.jpg - 我用红色箭头标记了一些距离。我想在这些距离上设置不同的尺寸。我找到了这个 panel.setBorder(BorderFactory.createTitledBorder("$Title"));但是如何在没有 prefferedSize 或其他方法的情况下设置距离。
【解决方案2】:

我假设这是您尝试创建的 GUI。

要创建此 GUI,您需要使用多个 JPanel 和多个 Swing 布局管理器。

这是我将使用的 Swing 组件的层次结构。

JFrame - border layout
   JPanel - main panel, border layout
       JPanel - text, button panel, border layout, border north
           JTextField - border center
           JButton - border east
       JScrollPane - border center
           JTable
       JPanel - button panel, flow layout, border south
           JButton (3)

您可以通过在 JPanels 和 JScrollPane 上设置一个空边框来获得间距。空白边框可以任意宽。

【讨论】:

  • 我可以再问 1 个吗?在我的屏幕 snag.gy/XbPbi.jpg 中,我在底部面板上使用 GridLayout 制作了 3 个按钮(0 行和 5 列)。我在那里添加了 3 个按钮和 2 个空面板。因此,由于 GridLayout,我有 3 个相同大小的按钮。是否可以在不使用 getPreferedSize()、setSize() 等方法的情况下使其他面板上的“Add”等其他按钮的大小相同?谢谢
  • @dimads:不,如果不设置首选大小,就不可能使不同 JPanel 中的所有按钮都具有相同大小。使用某些布局管理器,您根本无法更改按钮的大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 2011-05-17
相关资源
最近更新 更多