Java 为什么在添加actionListener时,我的按钮会从borderlayout中消失?

Java 为什么在添加actionListener时,我的按钮会从borderlayout中消失?,java,swing,jpanel,layout-manager,border-layout,Java,Swing,Jpanel,Layout Manager,Border Layout,我正在为我的java项目编写后端代码,该项目正在实现一个健身记录器。出于某种原因,当我将actionListener函数放在边框布局中的按钮上时,按钮消失了 我尝试在构造函数的不同位置设置函数 public class Buttons extends JFrame implements ActionListener { JFrame frame = new JFrame("Menu"); JPanel MyPanel= new JPanel(); JBut

我正在为我的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");

BorderLayout
最多可容纳五个组件,每个组件位于单独的布局约束中。如果在不同的区域中添加两次零部件,它将面临两个问题:

  • 组件只能出现在一个位置
  • 组件“覆盖”添加到布局区域的原始组件

  • 更一般的提示:

  • 请学习常见的Java命名法(命名约定-例如
    EachWordUpperCaseClass
    firstWordLowerCaseMethod()
    firstWordLowerCaseAttribute
    ,除非它是
    大写常量
    ),并一致使用它
  • 要更快地获得更好的帮助,请添加或注意:发布的代码只需要适当的
    import
    语句即可成为MRE/SSCCE。
  • MyPanel.add(b3,“东”)
    
    
    • 这是有常数的。例如,
      BorderLayout.EAST
      。始终使用常量进行编译时检查
    • 但是
      BorderLayout.LINE\u END
      对区域设置敏感。它将出现在RHS上,表示从左到右的语言,左侧表示从右到左的语言
  • 所有Swing和AWT GUI都应该在EDT(事件调度线程)上创建和更新
  • 代码扩展并保留了对,
    JFrame
    的引用。保留后者,抛弃前者
  • 确保在问题中添加
    java
    (语言)和
    swing
    (GUI工具包)标记!我看到这一点的唯一原因是我(非常)检查了
    jframe
    标记的问题列表!据我记忆所及,这是我第一次检查标签的问题列表。更具讽刺意味的是,它没有列出我认为与这个问题最相关的5个标签
  • 自Java 1.5以来,
    frame.getContentPane().add(..
    可以缩短为
    frame.add(..
  • frame.setSize(500115);
    最好是
    frame.pack();
    ,因为500 x 115只不过是一个猜测,对于不同的操作系统将是“错误的”(内容窗格的大小将因每个系统不同的框架装饰而改变)
  • 应删除。该代码已通过以下方式添加:

    MyPanel.add(b1, "North");
    

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

  • 组件只能出现在一个位置
  • 组件“覆盖”添加到布局区域的原始组件

  • 更一般的提示:

  • 请学习常见的Java命名法(命名约定-例如
    EachWordUpperCaseClass
    firstWordLowerCaseMethod()
    firstWordLowerCaseAttribute
    ,除非它是
    大写常量
    ),并一致使用它
  • 为了更快地获得更好的帮助,请添加or。注意:发布的代码只需要适当的
    import
    语句即可成为MRE/SSCCE。
  • MyPanel.add(b3,“东”);
    re
    East
    • 这有一些常量。例如,
      BorderLayout.EAST
      。始终使用这些常量进行编译时检查
    • 但是,
      BorderLayout.LINE\u END
      对区域设置很敏感。对于从左到右的语言,它会显示在RHS上,对于从右到左的语言,它会显示在左侧
  • 所有Swing和AWT GUI都应该在EDT(事件调度线程)上创建和更新
  • 代码扩展并保留了对,
    JFrame
    的引用。保留后者,抛弃前者
  • 请确保在问题中添加
    java
    (语言)和
    swing
    (GUI工具包)标记!我看到这一点的唯一原因是因为检查了
    jframe
    标签的问题列表!据我记忆所及,这是我第一次检查该标签的问题列表。更具讽刺意味的是,它没有列出我认为与这个问题最相关的5个标签列表
  • 自Java 1.5以来,
    frame.getContentPane().add(..
    可以缩短为
    frame.add(..
  • frame.setSize(500115);
    最好是
    frame.pack();
    ,因为500 x 115只不过是一个猜测,对于不同的操作系统将是“错误的”(内容窗格的大小将因每个系统不同的框架装饰而改变)
  • 如果它有助于解决问题,请说“如果它有助于解决问题,请说”。