gpt4 book ai didi

java - 如何从另一个面板更改卡片布局面板?

转载 作者:搜寻专家 更新时间:2023-10-30 21:21:54 26 4
gpt4 key购买 nike

我谷歌了很多,没有找到解决方案。我觉得应该有java高手来帮帮我...

这是我的初始化方法:


private void initialize() {
this.setSize(750, 480);
this.setContentPane(getJContentPane());
this.setTitle("Registration");
JPanel topPane = new TopPane();
this.getContentPane().add(topPane,BorderLayout.PAGE_START);
cards=new JPanel(new CardLayout());
cards.add(step0(),"step0");
cards.add(step1(),"step1");
cards.add(step2(),"step2");
this.getContentPane().add(cards,BorderLayout.CENTER);
}

public JPanel step2(){
EnumMap<DPFPFingerIndex,DPFPTemplate> template = new EnumMap<DPFPFingerIndex, DPFPTemplate>(DPFPFingerIndex.class);
JPanel enrol = new Enrollment(template,2);
return enrol;
}

public JPanel step0(){
JPanel userAgree = new UserAgreement();
return userAgree;
}

public JPanel step1(){
JPanel userInfo = new UserInformation();
return userInfo;
}

public JPanel getCards(){
return cards;
}


这个,是另一个step0 JPanel的方法:

jButtonAgree.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
Registration reg = new Registration();
LayoutManager cards = reg.getCards().getLayout();
((CardLayout) cards).show(reg.getCards(),"step1");
}
});

根本没有任何反应,我尝试了重新验证、重新粉刷和其他工作人员......不起作用......这里有人有任何解决方案!

最佳答案

这一切都是为了向外界公开正确的方法和常量字符串,以允许类自行交换 View 。例如,为您的第一个类提供一个名为 cardlayout 的私有(private) CardLayout 字段和一个名为 cards(持卡人 JPanel)的私有(private) JPanel 字段,以及一些用于将卡片 JPanel 添加到卡片容器的公共(public)字符串常量。还给它一个公共(public)方法,比如称为 public void swapView(String key) 允许外部类交换卡片......像这样:

// code corrected
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Registration extends JPanel {
// use these same constants as button texts later
private static final Dimension PREF_SIZE = new Dimension(450, 300);
public static final String USER_AGREEMENT = "User Agreement";
public static final String USER_INFO = "User Information";
public static final String ENROLLMENT = "Enrollment";
// we'll extract them from this array
public static final String[] KEY_TEXTS = {USER_AGREEMENT, USER_INFO, ENROLLMENT};
private CardLayout cardlayout = new CardLayout();
private JPanel cards = new JPanel(cardlayout);

public Registration() {
cards.add(createUserAgreePanel(), USER_AGREEMENT);
cards.add(createUserInfoPanel(), USER_INFO);
cards.add(createEnrollmentPanel(), ENROLLMENT);
setLayout(new BorderLayout());
add(cards, BorderLayout.CENTER);
}

@Override
public Dimension getPreferredSize() {
return PREF_SIZE;
}

private JPanel createEnrollmentPanel() {
JPanel enrol = new JPanel();
enrol.add(new JLabel("Enrollment"));
return enrol;
}

private JPanel createUserAgreePanel() {
JPanel userAgree = new JPanel();
userAgree.add(new JLabel("User Agreement"));
return userAgree;
}

private JPanel createUserInfoPanel() {
JPanel userInfo = new JPanel();
userInfo.add(new JLabel("User Information"));
return userInfo;
}

public void swapView(String key) {
cardlayout.show(cards, key);
}

}

然后外部类可以通过在此类的可视化实例上调用 swapView 并传入适当的键字符串(例如在本例中为 CardTest.USER_INFO 以显示用户信息 JPanel)来简单地交换 View 。

现在您对这段代码有疑问,我在评论中指出:

    jButtonAgree.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
Registration reg = new Registration(); // **** HERE *****
LayoutManager cards = reg.getCards().getLayout();
((CardLayout) cards).show(reg.getCards(),"step1");
}
});

在那一行中,您正在创建一个新的注册对象,它可能与 GUI 上显示的对象完全无关,因此在这个新对象上调用方法对当前查看的 gui 绝对没有影响。您需要取而代之的是获得对查看的 Registration 对象的引用,也许可以通过为此类提供一个 getRegistration 方法,然后调用它的方法,如下所示:

class OutsideClass {
private Registration registration;
private JButton jButtonAgree = new JButton("Agree");

public OutsideClass() {
jButtonAgree.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// make sure registration reference has been obtained first!
if (registration != null) {
registration.swapView(Registration.USER_AGREEMENT);
}
}
});
}

// here I allow the calling class to pass a reference to the visualized
// Registration instance.
public void setRegistration(Registration registration) {
this.registration = registration;
}
}

例如:

@SuppressWarnings("serial")
class ButtonPanel extends JPanel {
private Registration registration;

public ButtonPanel() {
setLayout(new GridLayout(1, 0, 10, 0));
// go through String array making buttons
for (final String keyText : Registration.KEY_TEXTS) {
JButton btn = new JButton(keyText);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (registration != null) {
registration.swapView(keyText);
}
}
});
add(btn);
}
}

public void setRegistration(Registration registration) {
this.registration = registration;
}
}

以及驱动这一切的 MainClass

class MainClass extends JPanel {
public MainClass() {
Registration registration = new Registration();
ButtonPanel buttonPanel = new ButtonPanel();
buttonPanel.setRegistration(registration);

buttonPanel.setBorder(BorderFactory.createTitledBorder("Button Panel"));
registration.setBorder(BorderFactory.createTitledBorder("Registration Panel"));

setLayout(new BorderLayout());
add(registration, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);
}

private static void createAndShowUI() {
JFrame frame = new JFrame("Registration");
frame.getContentPane().add(new MainClass());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}

关于java - 如何从另一个面板更改卡片布局面板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6175899/

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