2017-12-14 7 views
0

ich habe ein programm mit einem rahmen, der ein hauptfeld mit dem kartenlayout-layout enthält, und ich möchte, dass es verschiedene karten/panel anzeigt.JAVA KarteLayout. wie man eine karte aus verschiedenen klassen anruft

In meinem Fall habe ich wirklich Schwierigkeiten, eine neue Karte von einem Button-Action-Listener zu nennen.

Ich möchte eine neue Karte erscheinen, nachdem ich auf eine Schaltfläche geklickt habe, aber keiner der Codes, die ich in meine Aktion Listener legte, zeigte die Karte, die ich wollte.

Ich kenne meine actionListener Arbeit, weil ich eine println innerhalb getan habe.

Hier ist mein Code. Ich habe alles, was unnötig war los, so dass es leichter zu lesen ist. Danke für die Hilfe!

Ich werde alle Ratschläge über Code Strukturationstheorie

den Mainframe:

public class MainFrame extends JFrame{ 

final static String CONNEXION_VIEW = "connexionView"; 
final static String CONNEXION_FAILED_VIEW = "connexionRefusee"; 

public MainFrame() 
{ 
    super(); 
    initialize(); 
} 


private void initialize() 
{ 
    getMainPanel(); 

    add(getMainPanel()); 

} 

CardLayout cardLayout; 
public CardLayout getCardLayout() 
{ 
    if (cardLayout == null) 
    { 
     cardLayout = new CardLayout(); 
    } 
    return cardLayout; 
} 


JPanel mainPanel; 
public JPanel getMainPanel() 
{ 
    if (mainPanel == null) 
    { 
     mainPanel = new JPanel(); 

     mainPanel.setLayout(getCardLayout()); 

     mainPanel.add(CONNEXION_VIEW, getConnexionView()); 
     mainPanel.add(CONNEXION_FAILED_VIEW, getConnexionFailedView()); 

    } 
    return mainPanel; 
} 

ConnexionView connexionView; 
protected ConnexionView getConnexionView() 
{ 
    if (connexionView == null) 
    { 
     connexionView = new ConnexionView(); 
    } 
    return connexionView; 
} 

ConnexionFailedView connexionFailedView; 
protected ConnexionFailedView getConnexionFailedView() 
{ 
    if (connexionFailedView == null) 
    { 
     connexionFailedView = new ConnexionFailedView(); 
    } 
    return connexionFailedView; 
} 

die Verbindung Ansicht, die mit dem Knopf mit der Aktion Hörer klicken, wo ich meinen Code setzen will

public class ConnexionView extends JPanel{ 

GridBagLayout gbl = new GridBagLayout(); 

private JButton btnConnexion; 

Dimension dimensionBouton = new Dimension(170, 30); 

public ConnexionView() 
{ 
    super(); 
    initialise(); 
} 

private void initialise() 
{ 
    setLayout(gbl); 

    GridBagConstraints gbcbtnConnexion = new GridBagConstraints(); 
    gbcbtnConnexion.gridwidth = GridBagConstraints.REMAINDER; 
    gbcbtnConnexion.gridheight = GridBagConstraints.REMAINDER; 
    gbcbtnConnexion.gridx = 1; 
    gbcbtnConnexion.gridy = 2; 
    add(getBtnConnexion(), gbcbtnConnexion); 
} 

private JButton getBtnConnexion() 
{ 
    if (btnConnexion == null) 
    { 
     btnConnexion = new JButton("Connexion"); 
     btnConnexion.setPreferredSize(dimensionBouton); 
     btnConnexion.setMinimumSize(dimensionBouton); 

     btnConnexion.addMouseListener(new MouseAdapter() 
     { 
      @Override 
      public void mouseClicked(MouseEvent e) 
      { 
       /////code to display the connexion_Failed_View 

       System.out.println("test"); 
      } 
     }); 
    } 
    return btnConnexion; 
} 

}

und die Verbindung fehlgeschlagen Ansicht, die eine i angezeigt werden soll, nachdem die Schaltfläche geklickt wird

public class ConnexionFailedView extends JPanel{ 

public ConnexionFailedView() 
{ 
    super(); 
    initialise(); 
} 

private void initialise() 
{ 
    setBackground(Color.YELLOW); 
} 

Dank im Voraus

Antwort

0

Sie müssen die Komponente in Ihrem Knopf irgendwie zu halten, so dass Sie darauf zugreifen können.

class ConnexionView { 
    private JComponent mainPanel; 
    public ConnexionView(JComponent mp) { mainPanel = mp; } 
} 

Offensichtlich bedeutet das, dass der MainFrame es dann übergeben muss.

Nun kann der Hörer

tun
// it would be cleaner if you passed the layout in the constructor as well 
CardLayout cl = (CardLayout) mainPanel.getLayoutManager(); 
cl.show(mainPanel, MainFrame.CONNEXION_FAILED_VIEW); 
+0

es funktionierte! danke – Clement

+0

@Clement Großartig. Fühlen Sie sich frei, das Häkchen neben der Antwort zu markieren, um es als Beantwortet zu markieren :) – daniu

Verwandte Themen