java - 如何正确定位 JButtons 和大小 JTextFields?
问题描述
我正在尝试创建一个密码库,但每当我尝试运行它时,JTextField
s 都非常小,并且面板有点被JTable
.
我尝试过使用尺寸和位置,GridBag
但没有任何效果。
这是给我的 IB 计算机科学 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);
解决方案
这是您的程序的编辑版本,它按照我认为您尝试的方式格式化布局:
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
andsetLocation
代替ssetBounds
和sJTextField
JButton
- 创建了一个 main
JPanel
(称为 itframePanel
)来包含scrollPane
andpasswordPanel
,然后添加framePanel
到JFrame
JFrame
它通过创建一个 main来帮助组织 a 中的不同元素,而不是仅仅向自身JPanel
添加多个JPanel
s 。JFrame
这样,一个主要JPanel
的决定框架的整体布局。
推荐阅读
- css - Bootstrap 4中不重叠页脚的粘性列
- java - Eclipse/OSGI、Java 11、JAXB 和类加载器
- mysql - 是否可以编写一个 SQL 查询来返回另一个表中不存在的值?
- python - 将 PDF 保存到目录
- paypal - 我正在尝试连接到贝宝
- c# - 使用 xamarin 表单的带有可滚动标题的顶部 tabview
- flutter - Flutter Streambuilder + Firestore 在使用后台位置插件后返回空快照
- echarts - apache echarts markLine 中的格式或样式标签
- javascript - 有没有一种很好的方法可以将基于 JQuery 的小部件包装到可以在 Vue.js 中轻松使用的模块中?
- r - 将行内容添加到另一行的列尾