首页 > 解决方案 > 当我向它添加 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,以便在按下按钮时显示出来。

标签: javaswingjpanellayout-managerborder-layout

解决方案


add(b1);

应该被删除。代码已经通过以下方式添加了它:

MyPanel.add(b1, "North");

ABorderLayout最多可容纳五个组件,每个组件位于单独的布局约束中。如果一个组件被添加两次,在不同的领域,它会面临两个问题:

  1. 一个组件只能出现在一个地方。
  2. 该组件“覆盖”添加到布局的该区域的原始组件。

更一般的提示:

  1. 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClass, firstWordLowerCaseMethod()firstWordLowerCaseAttribute除非它是UPPER_CASE_CONSTANT)并始终如一地使用它。
  2. 为了尽快获得更好的帮助,请添加一个最小的可重现示例简短、自包含、正确的示例注意:发布的代码只需要适当import的语句即可成为 MRE / SSCCE。
  3. MyPanel.add(b3, "East");回覆East
    • 这有一些常数。EG BorderLayout.EAST。始终使用常量进行编译时检查。
    • 但是BorderLayout.LINE_END对语言环境很敏感。对于从左到右的语言,它将出现在 RHS 上,对于从右到左的语言,它会出现在左侧。
  4. 所有 Swing 和 AWT GUI 都应该在 EDT(事件调度线程)上创建和更新。
  5. 该代码既扩展又保持对 . 的引用JFrame。保留后者,抛弃前者。
  6. 请务必在问题中添加java(语言)和swing(GUI 工具包)标签!我看到这个的唯一原因是因为我(非常)检查了jframe标签的问题列表!据我所知,这是我第一次检查该标签的问题列表。更讽刺的是,它并没有列出我认为与这个问题最相关的 5 个标签。
  7. frame.getContentPane().add(..可以缩短到frame.add(..Java 1.5 以后。
  8. frame.setSize(500,115);应该更好frame.pack();,因为 500 x 115 并不比猜测好,并且对于不同的操作系统会是“错误的”(内容窗格的大小会因每个系统的不同框架装饰而改变)。

推荐阅读