Java 网格布局和最小宽度
我想使面板具有受约束的最大宽度,但当容器变短时,它会减小其宽度 我使用了GridBagLayout,但当大小变得足够短时,它的行为会很奇怪Java 网格布局和最小宽度,java,swing,gridbaglayout,Java,Swing,Gridbaglayout,我想使面板具有受约束的最大宽度,但当容器变短时,它会减小其宽度 我使用了GridBagLayout,但当大小变得足够短时,它的行为会很奇怪 import java.awt.Color; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import javax.swing.JFrame; import javax.swing.JPanel; /** *
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* @author Michael Nesterenko
*
*/
public class SSCE extends JFrame {
/**
*
*/
public SSCE() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridBagLayout gbl = new GridBagLayout();
gbl.columnWidths = new int[] {200, 1};
gbl.columnWeights = new double[] {0, 1};
gbl.rowHeights = new int[] {10};
gbl.rowWeights = new double[] {0};
setLayout(gbl);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
JPanel sizeRestrictedPanel = new JPanel();
sizeRestrictedPanel.setBackground(Color.BLUE);
sizeRestrictedPanel.setMinimumSize(new Dimension(50, 50));
sizeRestrictedPanel.setMaximumSize(new Dimension(300, 50));
sizeRestrictedPanel.setPreferredSize(new Dimension(300, 50));
add(sizeRestrictedPanel, gbc);
JPanel dummy = new JPanel();
dummy.setBackground(Color.RED);
add(dummy, gbc);
setPreferredSize(new Dimension(600, 200));
pack();
}
/**
* @param args
*/
public static void main(String[] args) {
new SSCE().setVisible(true);
}
}
当框架宽度变得足够短时,蓝色面板将立即调整大小,但我希望它能够随着窗口大小的调整而平滑调整大小。您可以定义GridBagConstraints.ipadx和GridBagConstraints.ipady约束以设置最小宽度/高度
/**
* This field specifies the internal padding of the component, how much
* space to add to the minimum width of the component. The width of
* the component is at least its minimum width plus
* <code>ipadx</code> pixels.
* <p>
* The default value is <code>0</code>.
* @serial
* @see #clone()
* @see java.awt.GridBagConstraints#ipady
*/
public int ipadx;
/**
* This field specifies the internal padding, that is, how much
* space to add to the minimum height of the component. The height of
* the component is at least its minimum height plus
* <code>ipady</code> pixels.
* <p>
* The default value is 0.
* @serial
* @see #clone()
* @see java.awt.GridBagConstraints#ipadx
*/
public int ipady;
可以定义GridBagConstraints.ipadx和GridBagConstraints.ipady约束来设置最小宽度/高度
/**
* This field specifies the internal padding of the component, how much
* space to add to the minimum width of the component. The width of
* the component is at least its minimum width plus
* <code>ipadx</code> pixels.
* <p>
* The default value is <code>0</code>.
* @serial
* @see #clone()
* @see java.awt.GridBagConstraints#ipady
*/
public int ipadx;
/**
* This field specifies the internal padding, that is, how much
* space to add to the minimum height of the component. The height of
* the component is at least its minimum height plus
* <code>ipady</code> pixels.
* <p>
* The default value is 0.
* @serial
* @see #clone()
* @see java.awt.GridBagConstraints#ipadx
*/
public int ipady;
当用户缩小窗口宽度时,首先只有红色面板收缩 问题中的代码示例实际上是从一个扩展窗口开始的,该窗口超出了打包组件所给出的大小。如果我们删除行集合PreferredSizeNew Dimension600、200;然后我们得到如下所示的窗口,而不是一个带有扩展的红色面板的窗口。如果我们将宽度减小到小于此大小,那么我们将强制蓝色面板小于其首选大小,并且其行为异常。这是因为GridBagLayout不再支持蓝色面板的首选尺寸,它现在为每个面板提供了相等的空间,并尝试满足其最小尺寸 我建议不要在GridBagLayout中使用setPreferredSize。 您可能希望确定窗口仍然有用所需的最小尺寸,并且不允许用户将大小减小到该最小值以下。当用户展开窗口时,某些组件所占用的空间不应超过最初分配的空间。我们可以使用GridBagConstraints weightx和weighty而不是setMaximumSize来实现这一点 下面的代码显示了两个面板的平滑调整,我添加了一些文本来显示尺寸
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.*;
/**
* @author Michael Nesterenko, Leon LaSpina
*
*/
public class SSCE extends JFrame {
JLabel blueDimension, redDimension;
JPanel sizeRestrictedPanel, dummyPanel, bottomPanel;
public SSCE() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel testPanel = new JPanel();
bottomPanel = new JPanel();
setLayout(new BorderLayout());
GridBagLayout gbl = new GridBagLayout();
testPanel.setLayout(gbl);
add(testPanel, BorderLayout.CENTER);
add(bottomPanel, BorderLayout.SOUTH);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 0.75;
sizeRestrictedPanel = new JPanel();
sizeRestrictedPanel.setBackground(Color.BLUE);
sizeRestrictedPanel.setMinimumSize(new Dimension(50, 50));
sizeRestrictedPanel.setMaximumSize(new Dimension(300, 50));
//sizeRestrictedPanel.setPreferredSize(new Dimension(300, 50));
testPanel.add(sizeRestrictedPanel, gbc);
dummyPanel = new JPanel();
dummyPanel.setBackground(Color.RED);
dummyPanel.setMinimumSize(new Dimension(50, 50));
//dummyPanel.setPreferredSize(new Dimension(50, 50));
gbc.weightx = 0.25;
testPanel.add(dummyPanel, gbc);
setSize(new Dimension(600, 200));
blueDimension = new JLabel("------");
blueDimension.setForeground(Color.BLUE);
redDimension = new JLabel("------");
redDimension.setForeground(Color.RED);
bottomPanel.add(blueDimension);
bottomPanel.add(new JLabel(" "));
bottomPanel.add(blueDimension);
bottomPanel.add(redDimension);
this.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
updateDimensionText();
}
});
}
private void updateDimensionText() {
Dimension d1 = sizeRestrictedPanel.getSize();
String s1 = d1.width + "," + d1.height;
Dimension d2 = dummyPanel.getSize();
String s2 = d2.width + "," + d2.height;
blueDimension.setText(s1);
redDimension.setText(s2);
}
/**
* @param args
*/
public static void main(String[] args) {
SSCE win = new SSCE();
win.setVisible(true);
win.updateDimensionText();
}
}
当用户缩小窗口宽度时,首先只有红色面板收缩 问题中的代码示例实际上是从一个扩展窗口开始的,该窗口超出了打包组件所给出的大小。如果我们删除行集合PreferredSizeNew Dimension600、200;然后我们得到如下所示的窗口,而不是一个带有扩展的红色面板的窗口。如果我们将宽度减小到小于此大小,那么我们将强制蓝色面板小于其首选大小,并且其行为异常。这是因为GridBagLayout不再支持蓝色面板的首选尺寸,它现在为每个面板提供了相等的空间,并尝试满足其最小尺寸 我建议不要在GridBagLayout中使用setPreferredSize。 您可能希望确定窗口仍然有用所需的最小尺寸,并且不允许用户将大小减小到该最小值以下。当用户展开窗口时,某些组件所占用的空间不应超过最初分配的空间。我们可以使用GridBagConstraints weightx和weighty而不是setMaximumSize来实现这一点 下面的代码显示了两个面板的平滑调整,我添加了一些文本来显示尺寸
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.*;
/**
* @author Michael Nesterenko, Leon LaSpina
*
*/
public class SSCE extends JFrame {
JLabel blueDimension, redDimension;
JPanel sizeRestrictedPanel, dummyPanel, bottomPanel;
public SSCE() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel testPanel = new JPanel();
bottomPanel = new JPanel();
setLayout(new BorderLayout());
GridBagLayout gbl = new GridBagLayout();
testPanel.setLayout(gbl);
add(testPanel, BorderLayout.CENTER);
add(bottomPanel, BorderLayout.SOUTH);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 0.75;
sizeRestrictedPanel = new JPanel();
sizeRestrictedPanel.setBackground(Color.BLUE);
sizeRestrictedPanel.setMinimumSize(new Dimension(50, 50));
sizeRestrictedPanel.setMaximumSize(new Dimension(300, 50));
//sizeRestrictedPanel.setPreferredSize(new Dimension(300, 50));
testPanel.add(sizeRestrictedPanel, gbc);
dummyPanel = new JPanel();
dummyPanel.setBackground(Color.RED);
dummyPanel.setMinimumSize(new Dimension(50, 50));
//dummyPanel.setPreferredSize(new Dimension(50, 50));
gbc.weightx = 0.25;
testPanel.add(dummyPanel, gbc);
setSize(new Dimension(600, 200));
blueDimension = new JLabel("------");
blueDimension.setForeground(Color.BLUE);
redDimension = new JLabel("------");
redDimension.setForeground(Color.RED);
bottomPanel.add(blueDimension);
bottomPanel.add(new JLabel(" "));
bottomPanel.add(blueDimension);
bottomPanel.add(redDimension);
this.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
updateDimensionText();
}
});
}
private void updateDimensionText() {
Dimension d1 = sizeRestrictedPanel.getSize();
String s1 = d1.width + "," + d1.height;
Dimension d2 = dummyPanel.getSize();
String s2 = d2.width + "," + d2.height;
blueDimension.setText(s1);
redDimension.setText(s2);
}
/**
* @param args
*/
public static void main(String[] args) {
SSCE win = new SSCE();
win.setVisible(true);
win.updateDimensionText();
}
}
setXxXSize方法的使用也可能是罪魁祸首。如果您可以提供一个小的图像,准确地描述您对结果的期望,这将是非常有用的:-@nIcEcOw,我希望在框架窗口足够大时,蓝色面板具有一定的限制宽度,但当窗口变短时,蓝色面板不再适合任何其他颜色,蓝色面板的宽度将变为等于窗口的宽度,并平滑地调整大小。目前它只是跳转到一些较小的值。请看一下,看看这是否与您的情况相似。对于Tigy的大小,你可以考虑使用并附加到你的蓝色JPANELL中,使用SETXXXSIZE方法也可能是罪魁祸首。如果您可以提供一个小的图像,准确地描述您对结果的期望,这将是非常有用的:-@nIcEcOw,我希望在框架窗口足够大时,蓝色面板具有一定的限制宽度,但当窗口变短时,蓝色面板不再适合任何其他颜色,蓝色面板的宽度将变为等于窗口的宽度,并平滑地调整大小。目前它只是跳转到一些较小的值。请看一下,看看这是否与您的情况相似。对于THYGY的大小,您可以考虑使用并附加到您的蓝色J面板上。