前提・実現したいこと
この領域を中央に置きたいです.
現在ログイン画面の作成をしており,まとまった形として写真のように中央にまとまったものをデザインとして考えています.サイズはフルスクリーンです.
レイアウトをいろいろ試してはいるのですが,思ったようにはいかず,またどれが適しているのか経験が浅いため分からないです.
赤い枠のパネルにラベル,入力のパネル,ボタンのパネルを真ん中に来るように指定しています.現在BorderLayot.NORTHでむりやり縮めていますが,BorderLayot.CENTERにするとばらけます.mainPanel.setPreferredSizeをやって領域を調整したりもしたのですが,効果がなく苦戦しています.
質問の途中ですがGroupLayoutを使うとうまくいけるのかなと。。。
該当のソースコード
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.border.LineBorder; public class MyPanel extends JPanel implements ActionListener { private static final int PASS_FIELD_SIZE = 30; private static final int TEXT_FIELD_SIZE = 30; private static final int FONT_SIZE = 50; private static final int TITLE_FONT_SIZE = 80; private JTextField userId; private JPasswordField password; private JButton checkBtn, newAcountBtn; private GridBagConstraints gbc; public MyPanel() { //setLayout(null); setLayout(new BorderLayout()); gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.insets = new Insets(5, 10, 5, 10); //title JLabel labelTitle = createJL("ログイン"); //入力関連のパネル JPanel fieldPanel = new JPanel(new GridBagLayout()); fieldPanel.add(createJL("ID: ", 0, 0), gbc); userId = createTF(1, 0); fieldPanel.add(userId, gbc); fieldPanel.add(createJL("Password: ", 0, 1), gbc); password = createPF(1, 1); fieldPanel.add(password, gbc); //ボタン関連のパネル JPanel btnP = new JPanel(); newAcountBtn = createBtn("新規登録"); checkBtn = createBtn("check"); btnP.add(newAcountBtn); btnP.add(checkBtn); //パネルの統合及び位置サイズ調整 JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); LineBorder border = new LineBorder(Color.RED, 10, true); mainPanel.setBorder(border); labelTitle.setAlignmentX(Component.CENTER_ALIGNMENT); fieldPanel.setAlignmentX(Component.CENTER_ALIGNMENT); btnP.setAlignmentX(Component.CENTER_ALIGNMENT); mainPanel.add(labelTitle); mainPanel.add(fieldPanel); mainPanel.add(btnP); add(mainPanel, BorderLayout.NORTH); } public void actionPerformed(ActionEvent e) { } public JButton createBtn(String str) { final int WIDTH = 250; final int HEIGHT = 70; JButton btn = new JButton(str); btn.setPreferredSize(new Dimension(WIDTH, HEIGHT)); btn.setFont(new Font("MS ゴシック", Font.BOLD, FONT_SIZE)); btn.addActionListener(this); return btn; } public JLabel createJL(String str) { JLabel label = new JLabel(str); label.setFont(new Font("MS ゴシック", Font.BOLD, TITLE_FONT_SIZE)); return label; } public JLabel createJL(String str, int x, int y) { JLabel label = new JLabel(str); label.setFont(new Font("MS ゴシック", Font.BOLD, FONT_SIZE)); gbc.gridx = x; gbc.gridy = y; return label; } public JTextField createTF(int x, int y) { JTextField tf = new JTextField(TEXT_FIELD_SIZE); tf.setFont(new Font("MS ゴシック", Font.BOLD, FONT_SIZE)); gbc.gridx = x; gbc.gridy = y; return tf; } public JPasswordField createPF(int x, int y) { JPasswordField pf = new JPasswordField(PASS_FIELD_SIZE); pf.setFont(new Font("MS ゴシック", Font.BOLD, FONT_SIZE)); gbc.gridx = x; gbc.gridy = y; return pf; } }
import java.awt.Dimension; import java.awt.Toolkit; import javax.swing.JFrame; public class MyFrame extends JFrame{ public static void main(String[] args) { new MyFrame(); } public MyFrame() { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setTitle("test"); setSize(screenSize.width, screenSize.height); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MyPanel panel = new MyPanel(); add(panel); setLocationRelativeTo(null); setResizable(false); this.setVisible(true); } }
試したこと
もともと画面サイズに応じて計算後,setBoundsで配置を指定していたのですが,画面サイズによってフォントサイズが大きすぎるとコンポーネントが切れてしまい,この方法だと調整が大変なためやめました.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/27 06:07
2021/01/27 08:20