[英]How to auto extend the height of frame in java swing
我创建了一个具有500,500尺寸的小框架,在我的框架中还添加了面板,我还动态添加了标签和文本框,我在面板中添加了10个标签,显示正确,但是我将添加上面的另外5个标签和文本框添加标签意味着5个标签和文本框被隐藏之后,因此我如何自动扩展框架高度
调用.pack()
方法应该可以解决问题:
公共无效包()
使此窗口的大小适合其子组件的首选大小和布局。 如果任意一个尺寸小于上一次调用setMinimumSize方法指定的最小尺寸,则窗口的宽度和高度将自动放大。 如果窗口和/或其所有者仍无法显示,则在计算首选大小之前,将它们都显示。 计算窗口大小后,将对其进行验证。
有一些重要的规则和必需的知识,具体的LayoutManager如何与min,max和PreferredSize一起使用来自其子级
我强烈建议为已经可见的Container
添加(re)validate()
和repaint()
使用JScrollPane
作为添加到JFrame
/ JDialog
/ JWindow
第一个JComponent
并使用它来确定JFrame
最大大小(最好是从显示分辨率出发),如果超过最大大小,请不要使用pack()
,否则容器边界可能不在屏幕上
代码示例,必须在第2点添加规则。
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
public class AddComponentsAtRuntime {
private JFrame f;
private Container panel;
private JCheckBox checkValidate, checkReValidate, checkRepaint, checkPack;
public AddComponentsAtRuntime() {
JButton b = new JButton();
b.setBackground(Color.red);
b.setBorder(new LineBorder(Color.black, 2));
b.setPreferredSize(new Dimension(600, 10));
panel = new Container();
panel.setLayout(new GridLayout(0, 1));
panel.add(b);
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(panel, "Center");
f.add(getCheckBoxPanel(), "South");
f.setLocation(200, 200);
f.pack();
f.setVisible(true);
}
private JPanel getCheckBoxPanel() {
checkValidate = new JCheckBox("validate");
checkValidate.setSelected(false);
checkReValidate = new JCheckBox("revalidate");
checkReValidate.setSelected(false);
checkRepaint = new JCheckBox("repaint");
checkRepaint.setSelected(false);
checkPack = new JCheckBox("pack");
checkPack.setSelected(false);
JButton addComp = new JButton("Add New One");
addComp.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JButton b = new JButton();
b.setBackground(Color.red);
b.setBorder(new LineBorder(Color.black, 2));
b.setPreferredSize(new Dimension(600, 10));
panel.add(b);
makeChange();
System.out.println(" Components Count after Adds :" + panel.getComponentCount());
}
});
JButton removeComp = new JButton("Remove One");
removeComp.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int count = panel.getComponentCount();
if (count > 0) {
panel.remove(0);
}
makeChange();
System.out.println(" Components Count after Removes :" + panel.getComponentCount());
}
});
JPanel panel2 = new JPanel();
panel2.add(checkValidate);
panel2.add(checkReValidate);
panel2.add(checkRepaint);
panel2.add(checkPack);
panel2.add(addComp);
panel2.add(removeComp);
return panel2;
}
private void makeChange() {
if (checkValidate.isSelected()) {
panel.validate();
}
if (checkReValidate.isSelected()) {
panel.revalidate();
}
if (checkRepaint.isSelected()) {
panel.repaint();
}
if (checkPack.isSelected()) {
f.pack();
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
AddComponentsAtRuntime makingChanges = new AddComponentsAtRuntime();
}
});
}
}
没有布尔值,可以将其设置为true来使框架自动增长。
您可能希望在每次添加内容时都执行内容面板的getPreferredSize()
,并执行frame.setSize(...)
来适应新组件。
这是一个演示
public class FrameTestBase {
public static void main(String args[]) {
final JFrame t = new JFrame();
t.getContentPane().setLayout(new GridLayout(-1, 1));
t.add(new JButton(new AbstractAction("Add label") {
@Override
public void actionPerformed(ActionEvent arg0) {
t.getContentPane().add(new JLabel("hello"));
// Auto-adjust height.
Dimension dim = t.getContentPane().getPreferredSize();
dim.width = 500;
t.setSize(dim);
}
}));
t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
t.setSize(500, 500);
t.setVisible(true);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.