Как правильно расположить JButtons и размер JTextFields?
Я пытаюсь создать хранилище паролей, но всякий раз, когда я пытаюсь его запустить, JTextField
s очень малы, и панель в некоторой степени покрыта JTable
,
Я пытался играть с размерами и позициями GridBag
но ничего не работает.
Это для моего IB Computer Science IA. Любая помощь будет отличной.
JFrame passwordVault;
JTable passwordTable;
Object[] columnNames = {"Name of Application", "Application Password", "Description"};
JTextField appName, appPass, appDesc;
JButton add, delete, update;
JLabel nameOfApp, passOfApp, descOfApp;
passwordVault = new JFrame("Password Vault");
passwordTable = new JTable();
JPanel passwordPanel = new JPanel();
DefaultTableModel tableModel = new DefaultTableModel();
tableModel.setColumnIdentifiers(columnNames);
passwordTable.setModel(tableModel);
nameOfApp = new JLabel("App Name: ");
passOfApp = new JLabel("App Password: ");
descOfApp = new JLabel("Description: ");
appName = new JTextField();
appPass = new JTextField();
appDesc = new JTextField();
add = new JButton("Add");
delete = new JButton("Delete");
update = new JButton("Update");
appName.setBounds(400, 220, 100, 25);
appPass.setBounds(400, 250, 100, 25);
appDesc.setBounds(400, 280, 100, 25);
add.setBounds(530, 220, 100, 25);
update.setBounds(530, 250, 100, 25);
delete.setBounds(530, 280, 100, 25);
JScrollPane scrollPane = new JScrollPane(passwordTable);
scrollPane.setBounds(0, 0, 1000, 200);
passwordVault.add(scrollPane);
passwordPanel.add(add);
passwordPanel.add(update);
passwordPanel.add(delete);
passwordPanel.setLayout(new GridBagLayout());
passwordPanel.add(nameOfApp, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(appName, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(passOfApp, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(appPass, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(descOfApp, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(appDesc, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(add, new GridBagConstraints(3, 3, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(update, new GridBagConstraints(4, 3, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(delete, new GridBagConstraints(5, 3, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
passwordVault.add(passwordPanel);
passwordVault.setSize(1000,500);
passwordVault.setLocationRelativeTo(null);
passwordVault.setVisible(true);
1 ответ
Решение
Вот отредактированная версия вашей программы, которая форматирует макет, как я думаю, вы пытались:
JFrame passwordVault;
JTable passwordTable;
Object[] columnNames = {"Name of Application", "Application Password", "Description"};
JTextField appName, appPass, appDesc;
JButton add, delete, update;
JLabel nameOfApp, passOfApp, descOfApp;
passwordVault = new JFrame("Password Vault");
passwordTable = new JTable();
JPanel passwordPanel = new JPanel();
DefaultTableModel tableModel = new DefaultTableModel();
tableModel.setColumnIdentifiers(columnNames);
passwordTable.setModel(tableModel);
nameOfApp = new JLabel("App Name: ");
passOfApp = new JLabel("App Password: ");
descOfApp = new JLabel("Description: ");
appName = new JTextField();
appPass = new JTextField();
appDesc = new JTextField();
add = new JButton("Add");
delete = new JButton("Delete");
update = new JButton("Update");
// Used setPreferredSize and setLocation instead of setBounds
appName.setLocation(new Point(400, 220));
appName.setPreferredSize(new Dimension(100, 25));
appPass.setLocation(new Point(400, 250));
appPass.setPreferredSize(new Dimension(100, 25));
appDesc.setLocation(new Point(400, 280));
appDesc.setPreferredSize(new Dimension(100, 25));
add.setLocation(new Point(530, 220));
add.setPreferredSize(new Dimension(100, 25));
update.setLocation(new Point(530, 250));
update.setPreferredSize(new Dimension(100, 25));
delete.setLocation(new Point(530, 280));
delete.setPreferredSize(new Dimension(100, 25));
JScrollPane scrollPane = new JScrollPane(passwordTable);
scrollPane.setBounds(0, 0, 1000, 200);
// Create a JPanel to contain the scrollPane and passwordPanel
JPanel framePanel = new JPanel();
framePanel.setLayout(new GridLayout(2, 1));
framePanel.add(scrollPane);
passwordPanel.setLayout(new GridBagLayout());
passwordPanel.add(nameOfApp, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(appName, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(passOfApp, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(appPass, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(descOfApp, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(appDesc, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(add, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(update, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
passwordPanel.add(delete, new GridBagConstraints(2, 3, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
framePanel.add(passwordPanel);
// Add the framePanel (which contains the other 2 panels) to the JFrame
passwordVault.add(framePanel);
passwordVault.setSize(1000,500);
passwordVault.setLocationRelativeTo(null);
passwordVault.setVisible(true);
Итак, основными изменениями стали:
- Используемый
setPreferredSize
а такжеsetLocation
, вместоsetBounds
дляJTextField
с иJButton
s - Создан основной
JPanel
(назвал этоframePanel
) содержатьscrollPane
а такжеpasswordPanel
, а затем добавилframePanel
кJFrame
Это помогает организовать различные элементы в JFrame
создавая главный JPanel
вместо того, чтобы просто добавить несколько JPanel
с JFrame
сам. Таким образом, один главный JPanel
решает общую компоновку кадра.