java - JButton 不显示 JPanel

标签 java swing cardlayout

我想用按钮调用 My JPanel。我的 Jpanel 实际上是主面板的子 JPanel,具有卡片布局。

为此,我使用卡片布局 api 方法 HERE单击按钮后显示 JPanel。

JButton btnCallPanel1 = new JButton("Call PanelOne");
   btnCallPanel1.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {

            CardLayout card = (CardLayout)mainPanel.getLayout();
            card.show(mainPanel, "PanelOne");                     //call Panel One

        }  

输出:

什么也没有出现,面板没有被调用,也没有错误弹出。

我的代码是 HERE

package wan.dev.sample.cardlayout;

import java.awt.CardLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JLabel;

public class HowToUseCardLayout {

    private JFrame frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    HowToUseCardLayout window = new HowToUseCardLayout();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public HowToUseCardLayout() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 688, 358);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JPanel mainPanel = new JPanel();
        mainPanel.setBounds(0, 0, 672, 260);
        frame.getContentPane().add(mainPanel);
        mainPanel.setLayout(new CardLayout(0, 0));

                JPanel PrePanel = new JPanel();
                mainPanel.add(PrePanel, "name_246268073832057");
                PrePanel.setLayout(null);

                        JLabel lblPanel_1 = new JLabel("Pre Panel");
                        lblPanel_1.setBounds(280, 115, 57, 20);
                        PrePanel.add(lblPanel_1);

        JPanel panelOne = new JPanel();
        mainPanel.add(panelOne, "name_246268067657434");
        panelOne.setLayout(null);

        JLabel lblPanel = new JLabel("panel 1");
        lblPanel.setBounds(279, 118, 46, 14);
        panelOne.add(lblPanel);

        JButton btnPan1 = new JButton("Call PanelOne");
        btnPan1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                CardLayout card = (CardLayout) mainPanel.getLayout();
                card.show(mainPanel, "PanelOne");

            }
        });
        btnPan1.setBounds(262, 286, 144, 23);
        frame.getContentPane().add(btnPan1);
    }
}

回答

我无法调用我的面板的原因是因为我没有使用标识符调用它。 我必须为我想要的 jpanel 提供标识符名称,并在我的 cardLayout.show(..) 上使用该标识符

Public Static final String PANEL_ONE = "panel one";                  //Name of JPanel Identifier


//add panel to main panel and declare panelOne identifier
mainPanel.add(panelOne, PANEL_ONE);                         //PANEL_ONE function like 
                                                            //an identifier


JButton btnCallPanel1 = new JButton("Call PanelOne");
btnCallPanel1.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {

        CardLayout card = 
                     (CardLayout)mainPanel.getLayout();

        card.show(mainPanel, PANEL_ONE);                     //call panelOne using PANEL_ONE 
                                                             //instead of JPanel name

    }  

最佳答案

正如我所怀疑的那样 - 您正在使用 String 参数“PanelOne”调用 CardLayout.show(...) 方法,但尚未添加CardLayout 使用容器的任何组件都使用相同的字符串,因此它不起作用是有道理的。解决方案:不要这样做。使用与使用容器将组件添加到 CardLayout 的字符串相同的字符串作为显示该组件的字符串。

即,如果您想显示容器 foo 并使用 String "bar" 将其添加到 CardLayout 使用容器中,那么您必须将“bar”传递到 CardLayoutshow(...) 方法中。同样,为此使用字符串常量,这样可以减少困惑的可能性。

其他问题:您正在使用 null 布局和 setBounds — 不要使用。这样做会导致 GUI 非常不灵活,虽然它们在一个平台上看起来不错,但在大多数其他平台或屏幕分辨率上看起来很糟糕,而且更新和维护非常困难。

例如,

import java.awt.CardLayout;
import java.awt.event.ActionEvent;

import javax.swing.*;

public class CardLayoutFoo extends JPanel {
   public static final String BAR = "bar";
   public static final String BUTTON_PANEL = "button panel";
   private CardLayout cardlayout = new CardLayout();

   public CardLayoutFoo() {
      setLayout(cardlayout);

      JLabel fooLabel = new JLabel("Foo", SwingConstants.CENTER);
      add(fooLabel, BAR); // added using String constant, BAR

      JButton showFooBtn = new JButton(new AbstractAction("Show Foo") {

         @Override
         public void actionPerformed(ActionEvent evt) {
            // use same String, BAR, to get the fooLabl shown
            cardlayout.show(CardLayoutFoo.this, BAR);
         }
      });
      JPanel btnPanel = new JPanel();
      btnPanel.add(showFooBtn);
      add(btnPanel, BUTTON_PANEL);

      cardlayout.show(this, BUTTON_PANEL);            
   }

   private static void createAndShowGui() {
      CardLayoutFoo mainPanel = new CardLayoutFoo();

      JFrame frame = new JFrame("CardLayoutFoo");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

关于java - JButton 不显示 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26091915/

相关文章:

java - 如何中断 CompletableFuture::join?

java - 仅在创建新文件时删除 .dat 文件

java - 扩展时方法返回值发生变化

java - Java 中鼠标单击框架中的图像不新鲜

java - Swing JTable : Event when row is visible, 或滚动到底部时?

java - 在现有的 JFrame 中重绘一个新的 JFrame?

java - 使用 Apache POI 确定 MS Excel 文件类型

java - java中内部框架之间的切换

java - Qt Framework 中是否有与 Swing CardLayout 等效的东西?

java - 使用 CardLayout 将自定义面板添加到 Applet