java - 当我向它添加 actionListener 时,为什么我的按钮会从边框布局中消失?
问题描述
我正在为实现健身记录器的 java 项目编写后端代码。出于某种原因,当我将 actionListener 函数放在我的边框布局中的按钮上时,按钮就会消失。
我尝试在构造函数的不同位置设置函数。
public class Buttons extends JFrame implements ActionListener {
JFrame frame = new JFrame("Menu");
JPanel MyPanel= new JPanel();
JButton b1= new JButton("Daily Logger");
JButton b2= new JButton("View Weekly Logs");
JButton b3= new JButton("Weight Calculator");
JButton b4= new JButton("BMI Calculator");
JButton b5= new JButton("Log Out");
public Buttons(){
MyPanel.setLayout(new BorderLayout());
MyPanel.add(b1, "North");
MyPanel.add(b2, "Center");
MyPanel.add(b3, "East");
MyPanel.add(b4, "West");
MyPanel.add(b5, "South");
b1.addActionListener(this);
add(b1);
frame.getContentPane().add(MyPanel, "North");
frame.setSize(500,115);
frame.setVisible(true);
}
public static void main(String[] args) {
new Buttons();
}
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command.equals("Daily Logger"))
myMethod();
}
public void myMethod() {
JOptionPane.showMessageDialog(this,"Onto the next step");
}
}
当我添加 actionListener 函数时,我希望按钮显示在边框布局中,但它消失了。如果按钮确实可以正常工作,它应该实现 myMethod() 函数。我的主要目标是展示我在另一个类中创建的 JTable,以便在按下按钮时显示出来。
解决方案
add(b1);
应该被删除。代码已经通过以下方式添加了它:
MyPanel.add(b1, "North");
ABorderLayout
最多可容纳五个组件,每个组件位于单独的布局约束中。如果一个组件被添加两次,在不同的领域,它会面临两个问题:
- 一个组件只能出现在一个地方。
- 该组件“覆盖”添加到布局的该区域的原始组件。
更一般的提示:
- 请学习常见的 Java 命名法(命名约定 - 例如
EachWordUpperCaseClass
,firstWordLowerCaseMethod()
,firstWordLowerCaseAttribute
除非它是UPPER_CASE_CONSTANT
)并始终如一地使用它。 - 为了尽快获得更好的帮助,请添加一个最小的可重现示例或简短、自包含、正确的示例。注意:发布的代码只需要适当
import
的语句即可成为 MRE / SSCCE。 MyPanel.add(b3, "East");
回覆East
- 这有一些常数。EG
BorderLayout.EAST
。始终使用常量进行编译时检查。 - 但是
BorderLayout.LINE_END
对语言环境很敏感。对于从左到右的语言,它将出现在 RHS 上,对于从右到左的语言,它会出现在左侧。
- 这有一些常数。EG
- 所有 Swing 和 AWT GUI 都应该在 EDT(事件调度线程)上创建和更新。
- 该代码既扩展又保持对 . 的引用
JFrame
。保留后者,抛弃前者。 - 请务必在问题中添加
java
(语言)和swing
(GUI 工具包)标签!我看到这个的唯一原因是因为我(非常)检查了jframe
标签的问题列表!据我所知,这是我第一次检查该标签的问题列表。更讽刺的是,它并没有列出我认为与这个问题最相关的 5 个标签。 frame.getContentPane().add(..
可以缩短到frame.add(..
Java 1.5 以后。frame.setSize(500,115);
应该更好frame.pack();
,因为 500 x 115 并不比猜测好,并且对于不同的操作系统会是“错误的”(内容窗格的大小会因每个系统的不同框架装饰而改变)。
推荐阅读
- java - 文件名、目录名或卷标语法不正确[TestHTMLReporter]
- database - 单节点couchdb如何选择shard和replicas的数量?
- java - 如何从 Mono 中检索数据
在java上 - oop - 哪种设计模式用于处理多输入和多输出?
- c++ - 颈部异常---骨骼动画
- amazon-web-services - 如何使用 Terraform 为 AWS DMS 设置转义 json?
- javascript - 单击汉堡菜单时如何隐藏元素
- ruby-on-rails - 国际化(翻译)数组的rails模型值如何?
- python - Numpy fill_diagonal pyspark
- spring - maven.springframework.org 读取超时