北パネル ( ) としてFlowLayout
内部に 5 つのラベルを入れたいとします。ウィンドウ/フレームのサイズを変更すると、ラベルが消えずに新しい行に移動します。BorderLayout
BorderLayout.NORTH
最小値、最大値、preferredLayoutSize メソッドについて読んでいます。しかし、彼らは役に立たないようで、私はまだ混乱しています.
また、ラッパーなどの他のレイアウトを使用したくありません。
北パネル ( ) としてFlowLayout
内部に 5 つのラベルを入れたいとします。ウィンドウ/フレームのサイズを変更すると、ラベルが消えずに新しい行に移動します。BorderLayout
BorderLayout.NORTH
最小値、最大値、preferredLayoutSize メソッドについて読んでいます。しかし、彼らは役に立たないようで、私はまだ混乱しています.
また、ラッパーなどの他のレイアウトを使用したくありません。
厄介なことの 1 つはFlowLayout
、使用可能な水平スペースが小さすぎる場合にコンテンツを「ラップ」しないことです。
代わりに、WrapLayoutを見てください。それFlowLayout
はラッピングを使用しています...
次のコードは、あなたが要求したことを正確に実行します。
プログラムには、contentPaneがに設定されているフレームがありますBorderLayout
。flowPanel
フローレイアウトを持ち、に追加される別のパネルが含まれていBorderLayout.NORTH
ます。
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class PanelFun extends JFrame {
final JPanel flowPanel;
public PanelFun() {
setPreferredSize(new Dimension(300,300));
getContentPane().setLayout(new BorderLayout());
flowPanel = new JPanel(new FlowLayout());
addLabels();
getContentPane().add(flowPanel, BorderLayout.NORTH);
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
PanelFun.this.getContentPane().remove(flowPanel); //this statement is really optional.
PanelFun.this.getContentPane().add(flowPanel);
}
});
}
void addLabels(){
flowPanel.add(new JLabel("One"));
flowPanel.add(new JLabel("Two"));
flowPanel.add(new JLabel("Three"));
flowPanel.add(new JLabel("Four"));
flowPanel.add(new JLabel("Five"));
}
public static void main(String[] args) {
final PanelFun frame = new PanelFun();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
frame.setVisible(true);
}
});
}
}
それで、それはどのように機能しますか?
フレームのサイズが変更されたときに内部のコンポーネントを再調整するための鍵flowPanel
は、このコードです。
Swing
PS:コードの一部を初めて使用し、理解していない場合はお知らせください。
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
PanelFun.this.getContentPane().remove(flowPanel);
PanelFun.this.getContentPane().add(flowPanel);
}
});
このコードflowPanel
がないと、含まれているフレームのサイズが変更されたときにコンポーネントを再配置するのは通常の動作ではないため、はコンポーネントを再調整しません。
ただし、flowPanel
パネルに追加すると、使用可能なスペースに従ってコンポーネントが配置されるという動作もあります。したがって、flowPanel
フレームのサイズが変更されるたびに追加すると、使用可能なスペースを使用するように内部要素が再配置されます。
アップデート:
camickrが正しく指摘しているように、中央に何かを追加した場合、この方法は機能しません(BorderLayout.CENTER
)