JPanel
から派生したパネルがあります。 JLabel
から派生したカスタムコントロールがあります。このカスタムJLabel
をパネルの中央に配置しようとしています。
これを行うための唯一の方法は、nullレイアウト(setLayout(null)
)を使用してから、カスタムJLabelのsetLocation()
ポイントを計算して、適切な場所に配置することです。
このアプリでは、カスタムJLabel
が1つのパネルからこのパネルに物理的に移動され、以前にsetLocation
で設定された場所が影響していると考えています。ただし、(0,0)に設定すると、コンポーネントは左上隅に上がります。
BorderLayout
は機能しません。コンポーネントが1つだけ提供され、_BorderLayout.CENTER
_に配置されると、中央セクションが展開されてすべてのスペースがいっぱいになるためです。
別のサイトから切り取って貼り付けた例では、BoxLayout
とcomponent.setAlignmentX(Component.CENTER_ALIGNMENT)
を使用しました。これも機能しませんでした。
別の回答では、パネルのgetInset()
関数をオーバーライドすることについて言及しました(それはそれが呼ばれたものだと思います)が、それは行き止まりであることが判明しました。
これまでは、GridBagLayout
レイアウトのパネルで作業しており、カスタムGridBagConstraints
をパネルに挿入するときにJLabel
オブジェクトを含めています。ただし、これは非効率的です。 JLabel
をJPanel
の中央に配置するより良い方法はありますか?
GridBagLayout を JPanel に設定 JLabelGridBagConstraints を JPanel 、-に設定 JLabel は中央揃えになります
例
import Java.awt.*;
import javax.swing.*;
public class CenteredJLabel {
private JFrame frame = new JFrame("Test");
private JPanel panel = new JPanel();
private JLabel label = new JLabel("CenteredJLabel");
public CenteredJLabel() {
panel.setLayout(new GridBagLayout());
panel.add(label);
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(panel);
frame.setSize(400, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
CenteredJLabel centeredJLabel = new CenteredJLabel();
}
});
}
}
JLabel
の名前がlabel
であると仮定し、次を使用します。
label.setHorizontalAlignment(JLabel.CENTER);
Java Standard LibraryにあるすべてのLayoutManagersを忘れて、 MigLayout を使用してください。私の経験では、通常、期待どおりの動作をする方がはるかに簡単です。
以下は、MigLayoutを使用した後の目標を達成する方法です。
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
public class Test
{
public static void main( String[] args )
{
JFrame frame = new JFrame( );
JPanel panel = new JPanel( );
// use MigLayout
panel.setLayout( new MigLayout( ) );
// add the panel to the frame
frame.add( panel );
// create the label
JLabel label = new JLabel( "Text" );
// give the label MigLayout constraints
panel.add( label, "Push, align center" );
// show the frame
frame.setSize( 400, 400 );
frame.setVisible( true );
}
}
そのほとんどは単なる定型です。キーはレイアウト制約です:"Push, align center"
:
align center
は、MigLayoutにJLabelをグリッドセルの中央に配置するように指示します。
Push
は、利用可能なスペースを埋めるためにグリッドセルを拡張するようMigLayoutに指示します。
BoxLayoutがその方法です。 X_AXIS BoxLayoutを設定する場合、コンポーネントの前後に水平方向の接着剤を追加してみてください。
panel.add(Box.createHorizontalGlue());
panel.add(label);
panel.add(Box.createHorizontalGlue());