gpt4 book ai didi

java - 调整 JFrame 大小时去除组件之间的额外空间

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:39:24 26 4
gpt4 key购买 nike

我正在使用 GridBagLayout 在框架中排列一些组件。
首次创建框架时,组件之间有一个合适的空间。 enter image description here

但是一旦我调整框架的大小,组件之间就会有很多不需要的空间 enter image description here

我尝试按照一些用户的建议调整权重和插图,但似乎并没有解决问题

import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JTextArea;

public class Frame1 extends JFrame {

JLabel one = new JLabel("one");
JLabel two = new JLabel("two");
JLabel three = new JLabel("three");

JTextField oneF = new JTextField(20);
JTextField twoF = new JTextField(20);
JTextField threeF = new JTextField(20);

JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("menu");

GridBagConstraints c = new GridBagConstraints();

public Frame1() {
setTitle("GridBagLayout Test");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new GridBagLayout());

menuBar.add(menu);

c.gridx = 0;
c.gridy = 0;
c.gridwidth = c.REMAINDER;
c.fill = c.HORIZONTAL;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 1;
c.anchor = c.NORTH;
c.insets = new Insets(5,5,5,5);
add(menuBar, c);

c.gridx = 0;
c.gridy = 1;
c.gridwidth = 1;
c.fill = c.NONE;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 1;
c.anchor = c.NORTH;
c.insets = new Insets(5,5,5,5);
add(one, c);

c.gridx = 1;
c.gridy = 1;
c.gridwidth = 1;
c.fill = c.NONE;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 1;
c.anchor = c.NORTH;
c.insets = new Insets(5,5,5,5);
add(oneF, c);

c.gridx = 0;
c.gridy = 2;
c.gridwidth = 1;
c.fill = c.NONE;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 1;
c.anchor = c.NORTH;
c.insets = new Insets(5,5,5,5);
add(two, c);

c.gridx = 1;
c.gridy = 2;
c.gridwidth = 1;
c.fill = c.NONE;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 1;
c.anchor = c.NORTH;
c.insets = new Insets(5,5,5,5);
add(twoF, c);

c.gridx = 0;
c.gridy = 3;
c.gridwidth = 1;
c.fill = c.NONE;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 1;
c.anchor = c.NORTH;
c.insets = new Insets(5,5,5,5);
add(three, c);

c.gridx = 1;
c.gridy = 3;
c.gridwidth = 1;
c.fill = c.NONE;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 1;
c.anchor = c.NORTH;
c.insets = new Insets(5,5,5,5);
add(threeF, c);

//setResizable(false);
pack();
setVisible(true);
}

}

ps:- 我是 GUI 编程的新手,所以请原谅我的任何新手错误。

编辑 1:这是我完成后想要的。我知道目前它看起来并不接近我的想法......我仍在努力enter image description here

谢谢

最佳答案

  • 使用嵌套布局(几个 LayoutManager 的组合),你的图片告诉我,

  • 对于放置在左侧的组件,您仍然可以使用 GridBagLayout

  • 在我的代码中(尽可能简单的想法)放置在左侧的 JComponent 不能调整大小,因为受到 LayoutManager 的默认设置的限制,更多信息请参见 Oracle tutorial

enter image description here

.

enter image description here

.

画自 SSCCE/MCVE

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyFrame {

private static final long serialVersionUID = 1L;
private JFrame myFrame = new JFrame("Whatever");
private JPanel parentPanel = new JPanel(new BorderLayout(10, 10)) {

private static final long serialVersionUID = 1L;

@Override
public Dimension getPreferredSize() {
return new Dimension(600, 400);
}

@Override
public Color getBackground() {
return new Color(255, 000, 000);
}
};
private JPanel leftPanel = new JPanel(/*default is FlowLayout*/) {

private static final long serialVersionUID = 1L;

@Override
public Dimension getPreferredSize() {
return new Dimension(300, 400);
}

@Override
public Color getBackground() {
return new Color(255, 255, 000);
}
};
private JPanel leftChildPanel = new JPanel() {

private static final long serialVersionUID = 1L;

@Override
public Dimension getPreferredSize() {
return new Dimension(300, 400);
}

@Override
public Color getBackground() {
return new Color(255, 255, 225);
}
};
private JPanel rightPanel = new JPanel(new BorderLayout(10, 10)) {

private static final long serialVersionUID = 1L;

@Override
public Dimension getPreferredSize() {
return new Dimension(300, 380);
}

@Override
public Color getBackground() {
return new Color(000, 255, 225);
}
};

public MyFrame() {
parentPanel.add(leftPanel, BorderLayout.WEST);
leftPanel.add(leftChildPanel);
parentPanel.add(rightPanel);
myFrame.add(parentPanel);
myFrame.setLocation(150, 150);
myFrame.pack();
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setVisible(true);
}

public static void main(String[] args) {
EventQueue.invokeLater(() -> {
new MyFrame();
});
}
}

关于java - 调整 JFrame 大小时去除组件之间的额外空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45905653/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com