2017-07-24 3 views
0

L'idée est d'avoir un JFrame "global" que je peux ensuite ajouter/supprimer JPanels comme nécessaire pour faire une application fluide. Actuellement, lorsque j'essaie de passer du premier JPanel au second, le second ne s'affichera pas. Mon code est ci-dessous:JPanel ne change pas sur JFrame

Handler (classe pour exécuter l'application):

package com.example.Startup; 

import com.example.Global.Global_Frame; 

public class Handler 
{ 
public Handler() 
{ 
    gf = new Global_Frame(); 

     gf.getAccNum(); 
     gf.setVisible(true); 
} 

public static void main(String[] args) 
{ 
    new Handler(); 
} 

Global_Frame gf = null; 
} 

public static void main(String[] args) 
{ 
    new Handler(); 
} 

Global_Vars gv = null; 
Global_Frame gf = null; 
} 

Cadre mondial:

package com.example.Global; 

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.swing.JFrame; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

import com.example.FirstRun.AccDetails; 
import com.example.FirstRun.FirstTimeRun; 

public class Global_Frame extends JFrame 
{ 
private static final long serialVersionUID = 1L; 

ActionListener val = new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     getUserDetails(); 
    } 
}; 

public Global_Frame() 
{ 

    try 
    { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); // get look and feel based on OS 
    } 
    catch (ClassNotFoundException ex) // catch all errors that may occur 
    { 
     Logger.getLogger(Global_Frame.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    catch (InstantiationException ex) 
    { 
     Logger.getLogger(Global_Frame.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    catch (IllegalAccessException ex) 
    { 
     Logger.getLogger(Global_Frame.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    catch (UnsupportedLookAndFeelException ex) 
    { 
     Logger.getLogger(Global_Frame.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    EventQueue.invokeLater(new Runnable() 
    { 
     public void run() //run the class's constructor, therefore starting the UI being built 
     { 
      initComponents(); 
     } 
    }); 
} 

public void initComponents() 
{ 
    setPreferredSize(new Dimension(600, 400)); // setting measurements of jframe 

    revalidate(); // revalidate the elements that will be displayed 
    repaint(); // repainting what is displayed if going coming from a different form 
    pack(); // packaging everything up to use 
    setLocationRelativeTo(null); // setting form position central 
} 

public void getAccNum() 
{ 
    setPreferredSize(new Dimension(600, 400)); // setting measurements of jframe 
    FirstTimeRun panel1 = new FirstTimeRun(val); 
    add(panel1); 

    revalidate(); 
    repaint(); 
    pack(); 
} 

public void getUserDetails() 
{ 
    getContentPane().removeAll(); 

    resizing(750, 500); 
    AccDetails panel2 = new AccDetails(); 
    add(panel2); 

    revalidate(); 
    repaint(); 
    pack(); 
} 

private void resizing(int width, int height) 
{ 
    timer = new Timer (10, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent arg0) 
     { 
      getContentPane().removeAll(); 
      setPreferredSize(new Dimension(sizeW, sizeH)); 

      revalidate(); 
      repaint(); 
      pack(); 

      if (!wToggle) 
       sizeW += 2; 

      if (!hToggle) 
      sizeH += 2; 

      if (toggle) 
      { 
       setLocationRelativeTo(null); 
       toggle = false; 
      } 
      else 
       toggle = true; 

      if (sizeW == width) 
       wToggle = true; 

      if (sizeH == height) 
       hToggle = true; 

      if (hToggle && wToggle) 
       timer.stop(); 
     } 
    }); 

    timer.start(); 
} 

//variables used for window resizing 
private Timer timer; 
private int sizeW = 600; 
private int sizeH = 400; 
private boolean toggle = false; 
private boolean wToggle = false; 
private boolean hToggle = false; 

public int accNum = 0; 
} 

Premier Panel:

package com.example.FirstRun; 

import java.awt.Dimension; 
import java.awt.event.ActionListener; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JPanel; 

public class FirstTimeRun extends JPanel 
{ 
private static final long serialVersionUID = 1L; 

public FirstTimeRun() 
{ 
} 

public FirstTimeRun(ActionListener val) 
{ 
    initComponents(val); 
} 

private void initComponents(ActionListener val) // method to build initial view for user for installation 
{ 
    pnlStart = new JPanel[1]; 
    btnNext = new JButton(); 
    pnlStart[0] = new JPanel(); 

    btnNext.setText("Next"); // adding text to button for starting 
    btnNext.setPreferredSize(new Dimension(80, 35)); //positioning start button 
    btnNext.addActionListener(val); 
    pnlStart[0].add(btnNext); // adding button to JFrame 

    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
    add(pnlStart[0]); 
} 

// objects used in UI 
private JPanel[] pnlStart; 
private JButton btnNext; 
} 

Deuxième groupe:

package com.example.FirstRun; 

import java.awt.BorderLayout; 

import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class AccDetails extends JPanel 
{ 
private static final long serialVersionUID = 1L; 

public AccDetails() 
{ 
    accAssets(); 
} 

private void accAssets() 
{ 
    // instantiating elements of the GUI 
    pnlAccDetails = new JPanel[2]; 
    lblWelcome = new JLabel(); 
    lblMain = new JLabel(); 

    for (int i = 0; i < 2; i++) 
     pnlAccDetails[i] = new JPanel(); 

    lblWelcome.setText("Welcome to Example_App"); // label welcoming user 
    pnlAccDetails[0].setLayout(new BoxLayout(pnlAccDetails[0], BoxLayout.LINE_AXIS)); 
    pnlAccDetails[0].add(lblWelcome); // adding label to form 

    lblMain.setText("<html>The following information that is collected will be used as part of the Example_App process to ensure that each user has unique Example_App paths. Please fill in all areas of the following tabs:</html>"); // main label that explains what happens, html used for formatting 
    pnlAccDetails[1].setLayout(new BorderLayout()); 
    pnlAccDetails[1].add(Box.createHorizontalStrut(20), BorderLayout.LINE_START); 
    pnlAccDetails[1].add(lblMain, BorderLayout.CENTER); //adding label to JFrame 
    pnlAccDetails[1].add(Box.createHorizontalStrut(20), BorderLayout.LINE_END); 

    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
    add(pnlAccDetails[0]); 
    add(pnlAccDetails[1]); 
} 

private JLabel lblWelcome; 
private JLabel lblMain; 
private JPanel[] pnlAccDetails; 
} 

J'ai essayé d'utiliser à la fois un CardLayout et le "revalidate();" "repeindre();" et "pack()" options et je suis perplexe quant à savoir pourquoi il ne montre pas. Merci d'avance pour toute aide qui pourrait vous être offerte. Tout en réduisant mon code, si la méthode de "redimensionnement" est supprimée, les objets sont affichés lorsque les panneaux changent. Je voudrais éviter d'avoir à supprimer complètement cela car c'est une transition en douceur pour changer la taille de JFrame.

+4

Pensez-vous que vous pourriez réduire cela à un simple exemple JPanel/JFrame? http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html – matt

+0

@matt J'ai réduit l'ajout d'objets sur les panneaux 1 et 2 pour faciliter la lecture. –

+3

Veuillez vous efforcer de le rendre encore plus facile car il y a tellement de choses dans le code ci-dessus qui n'a aucune incidence sur le problème. Au contraire, créez et publiez un code [mcve] - juste nécessaire pour compiler, exécuter et montrer le problème, rien de moins et rien de plus. –

Répondre

0

Comme mentionné dans l'édition, la Le problème résidait dans la méthode de redimensionnement. Lorsque la minuterie s'arrêtait, elle n'allait nulle part, provoquant le non chargement de l'interface utilisateur. La correction du code efface l'écran et ajoute l'appel au redimensionnement de l'actionlistener. Ajoutant ensuite un appel à la méthode suivante après:

timer.stop(); 

Merci pour me faire enlever le désordre autour d'elle et de trouver la source du problème & @Hovercraft plein @ Matt Eels upvotes pour vous deux.

0

@John smith il est par exemple de base de passer d'un panneau à un autre panneau J'espère que cela vous aidera à régler votre problème

code:

package stack; 

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class RemoveAndAddPanel implements ActionListener{ 
    JFrame frame; 
    JPanel firstPanel; 
    JPanel secondPanel; 
    JPanel controlPanel; 
    JButton nextButton; 

    public RemoveAndAddPanel() { 
    JFrame.setDefaultLookAndFeelDecorated(true); 
    frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    firstPanel = new JPanel(); 
    firstPanel.add(new JLabel("FirstPanel")); 
    firstPanel.setPreferredSize(new Dimension(100,100)); 

    secondPanel = new JPanel(); 
    secondPanel.add(new JLabel("Second panel")); 
    secondPanel.setPreferredSize(new Dimension(100,100)); 

    nextButton = new JButton("Next panel"); 
    controlPanel = new JPanel(); 

    nextButton.addActionListener(this); 

    controlPanel.add(nextButton); 

    frame.setLayout(new BorderLayout()); 
    frame.add(firstPanel,BorderLayout.CENTER); 
    frame.add(controlPanel, BorderLayout.SOUTH); 

    frame.setVisible(true); 
    frame.setSize(300,100); 
    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
    if(e.getSource() == nextButton) { 
     frame.remove(firstPanel); 
     frame.add(secondPanel); 

     nextButton.setEnabled(false); 
    } 
    frame.validate(); 
    } 
    public static void main(String args[]) { 
    new RemoveAndAddPanel(); 
    } 
} 
+0

S'il vous plaît voir modifier, le problème réside dans le fait que je change la taille de la JFrame entre Panel1 & Panel2 (dans le code intitulé "Global Frame"), je sais comment Pour faire une transition normale, mais avec l'ajout de la minuterie et le redimensionnement du cadre, quelque chose ne va pas avec le changement des panneaux. –

0

La principale chose à considérer lors de panneau changeant dans une JFrame est la mise en page, pour un corps panneau (principal) pour passer à un autre panneau du panneau parent doit être de type CardLayoutbody.setLayout(new java.awt.CardLayout());

Après que vous peut maintenant facilement basculer entre les panneaux avec l'exemple de code ci-dessous

private void updateViewLayout(final HomeUI UI, final JPanel paneeelee){ 

     final JPanel body = UI.getBody(); //this is the JFrame body panel and must be of type cardLayout 
     System.out.println("Page Loader Changing View"); 

     new SwingWorker<Object, Object>() { 

      @Override 
      protected Object doInBackground() throws Exception { 
       body.removeAll();//remove all visible panel before 
       body.add(paneeelee); 
       body.revalidate(); 
       body.repaint(); 
       return null; 
      } 

      @Override 
      protected void done() { 
       UI.getLoader().setVisible(false); 
      } 
     }.execute(); 
    }