我有三个课程{FirstFrame, Login, Register
} ... FirstFrame
中有一个方法可以在Logi
和Register
之间进行更改
FirstFrame
代码:
public class FirstFrame extends javax.swing.JFrame {
public FirstFrame() {
initComponents();
setLayout(new BorderLayout());
changeTo(Login.class);
}
public void changeTo(Class<?> c){
getContentPane().removeAll();
try {
Object obj = c.newInstance();
getContentPane().add((Component) obj);
pack();
setVisible(true);
System.out.println("here");
} catch (InstantiationException ex) {
Logger.getLogger(FirstFrame.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(FirstFrame.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
在Register
我有一个存储数据的按钮然后返回Login
(据说)
如果我从FirstFrame
这里的问题是如何从changeTo(Class<?> c)
内部呼叫Register
?
答案 0 :(得分:4)
如,
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class FirstFrame extends JPanel {
private static final int PREF_W = 400;
private static final int PREF_H = 300;
private Login login = new Login(this);
private Register register = new Register(this);
private CardLayout cardLayout = new CardLayout();
public FirstFrame() {
setLayout(cardLayout);
add(login, Login.class.toString());
add(register, Register.class.toString());
}
public void swapCards(String key) {
cardLayout.show(this, key);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
private static void createAndShowGui() {
FirstFrame mainPanel = new FirstFrame();
JFrame frame = new JFrame("FirstFrame");
frame.setDefaultCloseOperation(JFrame.EXIT_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();
}
});
}
}
class SwapCardAction extends AbstractAction {
private String key;
private FirstFrame firstFrame;
public SwapCardAction(String name, int mnemonic, String key,
FirstFrame firstFrame) {
super(name);
this.key = key;
this.firstFrame = firstFrame;
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent evt) {
firstFrame.swapCards(key);
}
}
class Register extends JPanel {
public Register(final FirstFrame firstFrame) {
setBackground(new Color(255, 200, 200));
JButton gotToLoginBtn = new JButton(new SwapCardAction("Login",
KeyEvent.VK_L, Login.class.toString(), firstFrame));
JPanel btnPanel = new JPanel();
btnPanel.setOpaque(false);
btnPanel.add(gotToLoginBtn);
setLayout(new BorderLayout());
JLabel label = new JLabel("Register", SwingConstants.CENTER);
add(label, BorderLayout.CENTER);
add(btnPanel, BorderLayout.SOUTH);
}
}
class Login extends JPanel {
public Login(FirstFrame firstFrame) {
JButton gotToRegisterBtn = new JButton(new SwapCardAction("Register",
KeyEvent.VK_R, Register.class.toString(), firstFrame));
setBackground(new Color(150, 200, 255));
JPanel btnPanel = new JPanel();
btnPanel.add(gotToRegisterBtn);
btnPanel.setOpaque(false);
setLayout(new BorderLayout());
JLabel label = new JLabel("Login", SwingConstants.CENTER);
add(label, BorderLayout.CENTER);
add(btnPanel, BorderLayout.SOUTH);
}
}
答案 1 :(得分:2)
我建议的最简单的解决方案是将FirstFrame
的引用传递给Register
和Login
的构造函数;或者添加另一个controller并将其传递给该控制器。
答案 2 :(得分:0)
这是我在@Hovercraft Full Of Eels的帮助下所做的 - 以及@Elliott Frisch的简单想法 - :
public class FirstFrame extends javax.swing.JFrame {
JPanel cards;
public FirstFrame() {
initComponents();
cards = new JPanel(new CardLayout());
cards.add(new Login(), "login");
cards.add(new Register(this), "reg"); //Passing the FirstFrame instance here
setLayout(new BorderLayout());
add(cards);
changeCard("login"); // Switching Cards
setLocationByPlatform(true);
setVisible(true);
}
public void changeCard(String cName){
CardLayout cl = (CardLayout) cards.getLayout();
cl.show(cards, cName);
pack();
}
}
寄存器类:
public class Register extends javax.swing.JPanel {
FirstFrame firstf;
public Register(FirstFrame ff) {
initComponents();
firstf = ff;
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
firstf.changeCard("login");
}
}