2013-11-10 4 views
0

Я новичок в java и кодирую фрейм логина, который после успешного входа в систему (в базу данных mysql (localhost using xampp)) закрывается и открывает основной кадр.Как центрировать группу компонентов в JPanel независимо от его размера

На экране «Мой вход» есть приветственная метка, пользовательская маркировка, метка пароля, текстовое поле и поле пароля и кнопка входа в систему. Я хочу, чтобы эти компоненты были центрированы в окне и оставались центрированными и не изменяли свой размер, не изменяя, насколько большой становится jpanel (путем перетаскивания его большего или меньшего размера после его отображения на экране).

Мой вопрос: как я могу заставить их оставаться центрированными и адаптировать свое местоположение к размеру панелей, если он изменится? Допустим, что размер панелей составляет 100 * 100, а кнопка находится на 50/50, а панель меняется на 200/200, но кнопка остается на 50/50, и если я устанавливаю ее по размеру по горизонтали или по вертикали, она просто увеличивается, но я хочу, чтобы он оставался одного и того же размера, просто адаптировал его местоположение к 100/100.

Я не могу представить изображения моих кадров, потому что кажется, что для этого требуется репутация, которая у меня нет, потому что я только что создал свою учетную запись. Надеюсь, вы можете представить, что я хочу сделать и что у меня есть сейчас.

Мой код LoginFrame используя GroupLayout следующий (я покинул ActionListener из причин его не имеет значения):

public LoginFrame() { 
    setTitle("LoginFrame"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 363, 270); 
    contentPane = new JPanel(); 
    contentPane.setBackground(Color.ORANGE); 
    contentPane.setBorder(new EmptyBorder(0, 0, 0, 0)); 
    setContentPane(contentPane); 

    JLabel lblWelcome = new JLabel("Welcome"); 

    JLabel lblNewLabel = new JLabel("Username: "); 

    textField = new JTextField(); 
    textField.setColumns(10); 

    JLabel lblNewLabel_1 = new JLabel("Password: "); 

    passwordField = new JPasswordField(); 

    JButton btnLogin = new JButton("Login"); 

     GroupLayout gl_contentPane = new GroupLayout(contentPane); 
     gl_contentPane.setHorizontalGroup(
     gl_contentPane.createParallelGroup(Alignment.LEADING) 
      .addGroup(gl_contentPane.createSequentialGroup() 
       .addGap(107) 
       .addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING) 
        .addComponent(lblNewLabel) 
        .addComponent(lblNewLabel_1)) 
       .addPreferredGap(ComponentPlacement.RELATED) 
       .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING) 
        .addComponent(passwordField, GroupLayout.DEFAULT_SIZE, 106, Short.MAX_VALUE) 
        .addComponent(textField, GroupLayout.DEFAULT_SIZE, 104, Short.MAX_VALUE)) 
       .addGap(75)) 
      .addGroup(gl_contentPane.createSequentialGroup() 
       .addGap(145) 
       .addComponent(btnLogin) 
       .addContainerGap(145, Short.MAX_VALUE)) 
      .addGroup(gl_contentPane.createSequentialGroup() 
       .addGap(149) 
       .addComponent(lblWelcome) 
       .addContainerGap(155, Short.MAX_VALUE)) 
    ); 
    gl_contentPane.setVerticalGroup(
     gl_contentPane.createParallelGroup(Alignment.LEADING) 
      .addGroup(gl_contentPane.createSequentialGroup() 
       .addGap(56) 
       .addComponent(lblWelcome) 
       .addGap(18) 
       .addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE) 
        .addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) 
        .addComponent(lblNewLabel)) 
       .addPreferredGap(ComponentPlacement.RELATED) 
       .addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE) 
        .addComponent(passwordField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) 
        .addComponent(lblNewLabel_1)) 
       .addPreferredGap(ComponentPlacement.UNRELATED) 
       .addComponent(btnLogin) 
       .addContainerGap(64, Short.MAX_VALUE)) 
    ); 
    contentPane.setLayout(gl_contentPane); 
} 

Я надеюсь, что я получить некоторые полезные ответы на это, я пытался быть конкретными, скажите если ничего не пропало. Спасибо

ответ

0

Для этих целей я рекомендую использовать GridBagLayout (tutorial) вместо GroupLayout, поскольку он более простой и более гибкий. Он работает с GridBagConstraints (read about it parametrs).

Следующий код делает то, что вы хотите, с помощью GridBagLayout.

public class LoginFrame extends JFrame { 

private JPanel contentPane; 
private JTextField textField; 
private JPasswordField passwordField; 

public LoginFrame() { 
    setTitle("LoginFrame"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 363, 270); 
    contentPane = new JPanel(); 
    contentPane.setBackground(Color.ORANGE); 
    contentPane.setBorder(new EmptyBorder(0, 0, 0, 0)); 
    setContentPane(contentPane); 

    JLabel lblWelcome = new JLabel("Welcome"); 

    JLabel lblNewLabel = new JLabel("Username: "); 

    textField = new JTextField(); 
    textField.setColumns(10); 

    JLabel lblNewLabel_1 = new JLabel("Password: "); 

    passwordField = new JPasswordField(); 

    JButton btnLogin = new JButton("Login"); 

    contentPane.setLayout(new GridBagLayout()); 

    GridBagConstraints c = new GridBagConstraints(); 
    c.insets = new Insets(5, 5, 5, 5); 

    c.gridx = 0; 
    c.gridy = 0; 
    c.gridwidth = 2; 
    c.anchor = GridBagConstraints.CENTER; 
    contentPane.add(lblWelcome, c); 

    c.gridwidth = 1; 
    c.gridy = 1; 
    contentPane.add(lblNewLabel, c); 

    c.gridx = 1; 
    contentPane.add(textField, c); 

    c.fill = GridBagConstraints.HORIZONTAL; 
    c.gridy = 2; 
    contentPane.add(passwordField, c); 

    c.fill = GridBagConstraints.NONE; 
    c.gridx = 0; 
    contentPane.add(lblNewLabel_1, c); 

    c.gridy = 3; 
    c.gridwidth = 2; 
    contentPane.add(btnLogin, c); 
} 

public static void main(String... s) { 
    LoginFrame loginFrame = new LoginFrame(); 
    loginFrame.setVisible(true); 
} 
} 
+0

Это действительно помогло мне сделать именно то, что я хотел достичь! – PeterYoshi

Смежные вопросы