gpt4 book ai didi

java - JButton 不显示 JPanel

转载 作者:行者123 更新时间:2023-12-01 18:26:14 24 4
gpt4 key购买 nike

我想用按钮调用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com