私は500,500サイズの小さなフレームを作成しています。フレームにパネルも追加しました。ラベルとテキストボックスを動的に追加しました。パネルに10個のラベルを追加しましたが、正しく表示されていますが、さらに5つのラベルとテキストボックスを追加します。追加されたラベルは、5 つのラベルの後にテキスト ボックスが非表示になっていることを意味するため、フレームの高さを自動的に拡張する方法
3 に答える
メソッドを呼び出すと、.pack()
うまくいくはずです:
パブリックボイドパック()
サブコンポーネントの優先サイズとレイアウトに合わせて、この Window のサイズを変更します。ウィンドウの幅と高さのいずれかが setMinimumSize メソッドへの前の呼び出しで指定された最小サイズより小さい場合、ウィンドウの幅と高さは自動的に拡大されます。ウィンドウおよび/またはその所有者がまだ表示可能になっていない場合は、適切なサイズを計算する前に両方が表示可能になります。Window は、サイズが計算された後に検証されます。
具体的な LayoutManager が最小値、最大値、PreferredSize でどのように機能するかについて、いくつかの重要なルールと必要な知識があり、その子から来ました。
(re)validate()
を追加することを強くお勧めしrepaint()
ますContainer
/ /に
JScrollPane
最初JComponent
に追加されたものとして使用し、最大サイズを決定するために使用します (ディスプレイの解像度が最適です)。最大サイズを超えた場合は使用しないでください。そうしないと、コンテナーの境界が画面からはみ出す可能性があります。JFrame
JDialog
JWindow
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);
}
}