BoxLayoutの使用に関する問題に直面しました
私の例では、テキストフィールドの高さを減らし、ボタンの幅を変更しようとしています(図の緑色のマーカーで示されているように)。 setPrefferedSize()とsetMaximumSize()のテクニックについては知っていますが、正常に機能しませんでした。行add(Box.createHorizontalGlue())も役に立ちませんでした。
アイデアをありがとう
public class Testy extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
constructGUI();
}
});
}
private static void constructGUI() {
JFrame frame = new JFrame("Testy");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel centerPanel = new JPanel();
centerPanel.setBackground(Color.DARK_GRAY);
centerPanel.setPreferredSize(new Dimension(100, 400));
frame.add(centerPanel, BorderLayout.CENTER);
Testy eastPanel = new Testy();
frame.add(eastPanel, BorderLayout.EAST);
frame.pack();
frame.setVisible(true);
}
public Testy() {
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
JButton button = new JButton("Button ...... 1");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
button = new JButton("Button 2");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
button = new JButton("Button ........... 3");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
JLabel label = new JLabel("Label");
//label.setPreferredSize(...);
//label.setMaximumSize(...);
add(label);
JTextField textField = new JTextField();
//textField.setPreferredSize(...);
//textField.setMaximumSize(...);
add(textField);
button = new JButton("Button 4");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
//add(Box.createHorizontalGlue());
}
}
まず、Java Swingのコンポーネントの位置とサイズは、コンポーネント自体ではなく、レイアウトマネージャー(レイアウトマネージャーが設定されている場合)に依存することを理解する必要があります。コンポーネントはマネージャーにサイズを要求します。
この場合、私は異なるレイアウトを使用します-GridLayoutとBorderLayoutの組み合わせで十分で、非常にシンプルで簡単です。しかし、BoxLayoutを使用したい場合は、...
ドキュメントによると:
BoxLayoutは、コンポーネントの要求された最小、優先、および最大サイズに注意を払います。レイアウトを微調整しているときに、これらのサイズを調整する必要がある場合があります。 ...たとえば、ボタンの最大サイズは通常、優先サイズと同じです。追加のスペースが利用可能なときにボタンをより広く描画したい場合は、最大サイズを変更する必要があります。
次に、コンポーネントの最大サイズを設定します。c.setMaximumSize(new Dimension(Integer.MAX_VALUE, c.getMinimumSize().height));
(c
はbutton
、label
およびtextField
を意味します)
編集1:
動作するソースコードは次のとおりです。
_import Java.awt.BorderLayout;
import Java.awt.Color;
import Java.awt.Dimension;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class Testy extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
constructGUI();
}
});
}
private static void constructGUI() {
JFrame frame = new JFrame("Testy");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel centerPanel = new JPanel();
centerPanel.setBackground(Color.DARK_GRAY);
centerPanel.setPreferredSize(new Dimension(100, 400));
frame.add(centerPanel, BorderLayout.CENTER);
Testy eastPanel = new Testy();
frame.add(eastPanel, BorderLayout.EAST);
frame.pack();
frame.setVisible(true);
}
public Testy() {
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
JButton button = new JButton("Button ...... 1");
//button.setPreferredSize(...);
button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
add(button);
button = new JButton("Button 2");
//button.setPreferredSize(...);
button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
add(button);
button = new JButton("Button ........... 3");
//button.setPreferredSize(...);
button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
add(button);
JLabel label = new JLabel("Label");
//label.setPreferredSize(...);
label.setMaximumSize(new Dimension(Integer.MAX_VALUE, label.getMinimumSize().height));
add(label);
JTextField textField = new JTextField();
//textField.setPreferredSize(...);
textField.setMaximumSize(new Dimension(Integer.MAX_VALUE, textField.getMinimumSize().height));
add(textField);
button = new JButton("Button 4");
//button.setPreferredSize(...);
button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
add(button);
// add(Box.createVerticalGlue());
}
}
_
編集2:
右の列の下部にボタン4を配置する場合は、この行add(Box.createVerticalGlue());
をadd(textField);
とbutton = new JButton("Button 4");
の間に追加します。
簡単な解決策として、ネストされたレイアウトを使用できます。つまり、右側でJPanel
を使用してBorderLayout
を作成し、CENTER
にJPanel(say compPanel)
を配置し、PAGE_END
にJPanel(say buttonPanel)
を配置します。ロケーション。次に、新しいJPanel(say panel)
をGridLayout
とともに使用し、その上にすべてのコンポーネントを配置し、このcompPanel
をcenterPanel
内に配置します。 JButton(button4)
をbuttonPanel
内にそのまま配置します。
逆に、BoxLayout
は、特定のJComponent
の推奨サイズを尊重します。これは通常、JComponent
が保持するコンテンツに基づいて計算されるか、明示的に指定されるため、コンポーネントは他の特定のコンポーネントに対して適切に整列しない傾向があります。
これが実際の例です:
import Java.awt.*;
import javax.swing.*;
public class Testy extends JPanel {
private JPanel panel;
private JPanel buttonPanel;
public Testy() {
setLayout(new BorderLayout(5, 5));
JPanel compPanel = new JPanel();
panel = new JPanel(new GridLayout(6, 1, 5, 5));
JButton button = new JButton("Button ...... 1");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
panel.add(button);
button = new JButton("Button 2");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
panel.add(button);
button = new JButton("Button ........... 3");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
panel.add(button);
JLabel label = new JLabel("Label");
//label.setPreferredSize(...);
//label.setMaximumSize(...);
panel.add(label);
JTextField textField = new JTextField();
//textField.setPreferredSize(...);
//textField.setMaximumSize(...);
panel.add(textField);
compPanel.add(panel);
buttonPanel = new JPanel();
button = new JButton("Button 4");
buttonPanel.add(button);
add(compPanel, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.PAGE_END);
}
private void constructGUI() {
JFrame frame = new JFrame("Testy");
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
JPanel centerPanel = new JPanel();
frame.getContentPane().setLayout(new BorderLayout(5, 5));
centerPanel.setBackground(Color.DARK_GRAY);
frame.add(centerPanel, BorderLayout.CENTER);
frame.add(this, BorderLayout.LINE_END);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Testy().constructGUI();
}
});
}
}
出力:
これは、描画に基づいて近づくはずです。JLabelの下のコンポーネントで作業する必要があります(setPreferredSize()を使用)。
JPanel main = new JPanel(new GridLayout(1, 2));
JPanel left = new JPanel();
//left.setPreferredSize(some size);
JPanel right = new JPanel(new GridLayout(6, 1));
//right.setPreferredSize(some size);
right.add(new JButton("Button 1"));
//...
right.add(new JButton("Button 4"));
main.add(left);
main.add(right);