[英]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.