Почему я не могу изменить расположение JButton? - PullRequest
0 голосов
/ 06 августа 2020

Код:

public class launcher implements ActionListener {

private static JFrame window;
private static JPanel panel; 

private JButton createPassword;
private JButton seePassword;

public launcher() {
    
    window = new JFrame(); 
    panel = new JPanel();
    
    window.setTitle("Password Vault");
    window.setSize(400, 260);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setLocationRelativeTo(null);
    window.setResizable(false);
    window.setVisible(true);
    window.getContentPane().add(panel); // Adds panel to JFrame
    
    createPassword = new JButton("Create Password");
    createPassword.setBounds(20, 100, 150, 100);
    createPassword.addActionListener(this);
    
    seePassword = new JButton("View Password");
    seePassword.setLocation(20, 50);
    seePassword.addActionListener(this);
    
    panel.add(createPassword);
    panel.add(seePassword);
}

public static void main(String[] args) {

    new launcher();
}

Почему я не могу изменить расположение кнопок JButton? Я пробовал использовать функции setBounds и setLocation, но мои кнопки по-прежнему остаются в верхней средней части окна JFrame. Я также попытался объявить свои кнопки внутри метода launcher () и объявить их как переменную stati c.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Вы НЕ должны пытаться установить размер / расположение кнопок.

Swing был разработан для использования с менеджерами компоновки. Менеджер компоновки установит размер / расположение кнопки на основе правил менеджера компоновки.

Менеджер компоновки по умолчанию для JPanel - FlowLayout, поэтому вы видите кнопку по центру.

Если вы хотите расположить кнопки по-другому, вам нужно сменить менеджер компоновки.

Прочтите раздел из учебника Swing на Менеджеры компоновки для получения дополнительной информации и примеров .

Похоже, вы хотите, чтобы кнопки отображались вертикально, поэтому, возможно, можно использовать BoxLayout или GridLayout в зависимости от ваших требований.

Другие проблемы с вашим кодом:

  1. Имена классов должны начинаться с символа верхнего регистра
  2. Нет необходимости использовать переменные stati c. Это не то, как следует использовать ключевое слово stati c.
  3. Компоненты должны быть добавлены в фрейм ДО того, как фрейм станет видимым.
  4. Вы должны вызывать pack () в фрейме, ПЕРЕД вызовом setVisible (...), чтобы компоненты могли отображаться в их предпочтительном размере.
0 голосов
/ 06 августа 2020

Хотя вы действительно не должны менять место ваших компонентов без менеджера компоновки, способ есть. Если вы поместите эту строку кода в свой код, она должна работать с setBounds:

window.setLayout(null);
...