从终止当前面板的另一个类(方法)的面板调用方法

时间:2014-04-06 00:59:32

标签: java swing class methods jpanel

我有三个课程{FirstFrame, Login, Register} ... FirstFrame中有一个方法可以在LogiRegister之间进行更改

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

3 个答案:

答案 0 :(得分:4)

  1. 使用CardLayout来帮助您进行交换,因为这正是它的用途。
  2. 为FirstFrame提供一个允许其他类交换的公共方法。
  3. 将FirstFrame的实例传递给需要调用此方法的对象。这可以通过构造函数或setter方法参数来完成。
  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的引用传递给RegisterLogin的构造函数;或者添加另一个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");

}     

}