2016-09-12 15 views
1

Ich habe eine Jpanel, die Komponenten in zwei Ansichten anzeigen wird. Rasteransicht und Kartenansicht.GridLayout Inhalt nicht angezeigt

Die Kartenansicht funktioniert einwandfrei. Aber wenn gridView gewählt wird, werden die Komponenten nicht angezeigt.

enter image description here

MCVE

SourceContainer.java

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.Box.Filler; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JToolBar; 

public class SourceContainer extends JPanel implements ActionListener { 

    JPanel sourceMainPanel; 

    SourceCardPanel sourceCardPanel; 
    SourceGridPanel sourceGridPanel; 

    List<JComponent> components; 

    Boolean cardView = true; 

    public SourceContainer() { 
     init(); 
     components = new ArrayList<>(); 
    } 

    private void init() { 
     setLayout(new BorderLayout()); 
     loadTitleComp(); 
     loadBodyPanel(); 
    } 

    private void loadTitleComp() { 
     JToolBar toolBar = new JToolBar(); 
     toolBar.setFloatable(false); 
     toolBar.add(new Filler(new Dimension(), new Dimension(), new Dimension(10000, 10000))); 
     toolBar.add(new Filler(new Dimension(35, 0), new Dimension(35, 0), new Dimension(10000, 10000))); 

     JLabel label = new JLabel("Source"); 
     label.setFont(label.getFont().deriveFont(Font.BOLD, 14)); 
     toolBar.add(label); 

     toolBar.add(new Filler(new Dimension(), new Dimension(), new Dimension(10000, 10000))); 

     JButton button = new JButton("Switch"); 
     button.setActionCommand("SwitchView"); 
     button.addActionListener(this); 
     toolBar.add(button); 
     add(toolBar, BorderLayout.NORTH); 
    } 

    private void loadBodyPanel() { 
     sourceMainPanel = new JPanel(new CardLayout()); 

     sourceCardPanel = new SourceCardPanel(); 
     sourceGridPanel = new SourceGridPanel(); 

     sourceMainPanel.add(sourceCardPanel, "Card"); 
     sourceMainPanel.add(sourceGridPanel, "Grid"); 

     add(sourceMainPanel, BorderLayout.CENTER); 
    } 

    public void addSourceComp(String name, JComponent comp) { 
     JScrollPane scrollPane = new JScrollPane(comp); 
     scrollPane.setName(name); 
     components.add(scrollPane); 
    } 

    public void load() { 
     switchView(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
     switch (ae.getActionCommand()) { 
      case "SwitchView": 
       cardView = !cardView; 
       switchView(); 
       break; 
      default: 
       throw new UnsupportedOperationException(); 
     } 
    } 

    private void switchView() { 
     CardLayout layout = (CardLayout) sourceMainPanel.getLayout(); 
     String cardName; 
     if (cardView) { 
      cardName = "Card"; 
      sourceCardPanel.loadCards(); 
     } else { 
      sourceGridPanel.loadGrid(); 
      cardName = "Grid"; 
     } 
     layout.show(sourceMainPanel, cardName); 
    } 

    class SourceCardPanel extends JPanel implements ActionListener { 

     JPanel sourcePanel; 
     CardLayout cardLayout; 

     JLabel sourceLabel; 

     public SourceCardPanel() { 
      setLayout(new BorderLayout()); 
      cardLayout = new CardLayout(); 
      sourcePanel = new JPanel(cardLayout); 
      sourceLabel = new JLabel("Soruce Project"); 
      init(); 
     } 

     private void init() { 
      JToolBar toolBar = new JToolBar(); 
      toolBar.setFloatable(false); 

      toolBar.add(new Filler(new Dimension(), new Dimension(), new Dimension(10000, 10000))); 

      JButton lbutton = new JButton("<<<"); 
//     IconUtils.getIconByResourceName("goPrevious")); 
      lbutton.setActionCommand("GoToLeft"); 
      lbutton.addActionListener(this); 
      toolBar.add(lbutton); 

      toolBar.add(sourceLabel); 

      JButton rbutton = new JButton(">>>"); 
//     IconUtils.getIconByResourceName("goNext")); 
      rbutton.setActionCommand("GoToRight"); 
      rbutton.addActionListener(this); 
      toolBar.add(rbutton); 

      toolBar.add(new Filler(new Dimension(), new Dimension(), new Dimension(10000, 10000))); 

      add(toolBar, BorderLayout.NORTH); 
      add(sourcePanel, BorderLayout.CENTER); 
     } 

     public void addCard(JComponent comp) { 
      sourcePanel.add(comp, comp.getName()); 
     } 

     private JComponent getCurrentCard() { 
      for (Component comp : sourcePanel.getComponents()) { 
       if (comp.isVisible()) { 
        return (JComponent) comp; 
       } 
      } 
      return null; 
     } 

     public void loadCards() { 
      sourcePanel.removeAll(); 
      for (JComponent component : components) { 
       addCard(component); 
      } 
      sourceLabel.setText(components.get(0).getName()); 
     } 

     @Override 
     public void actionPerformed(ActionEvent ae) { 
      switch (ae.getActionCommand()) { 
       case "GoToLeft": 
        cardLayout.previous(sourcePanel); 
        break; 
       case "GoToRight": 
        cardLayout.next(sourcePanel); 
        break; 
      } 
      sourceLabel.setText(getCurrentCard().getName()); 
     } 

    } 

    class SourceGridPanel extends JPanel { 

     JPanel gridpanel; 

     public SourceGridPanel() { 
      setLayout(new BorderLayout()); 
      gridpanel = new JPanel(new GridLayout()); 
      add(new JScrollPane(gridpanel), BorderLayout.CENTER); 
     } 

     public void loadGrid() { 
      gridpanel.removeAll(); 
      for (int i = 0; i < components.size(); i++) { 
       create(components.get(i), i); 
      } 
     } 

     private void create(JComponent comp, int index) { 
      JPanel panel = new JPanel(new BorderLayout()); 
      JToolBar toolBar = new JToolBar(); 
      toolBar.setFloatable(false); 
      toolBar.add(new JLabel(comp.getName())); 
      panel.add(toolBar, BorderLayout.NORTH); 
      panel.add(comp, BorderLayout.CENTER); 
      gridpanel.add(panel, index); 
     } 
    } 
} 

Test.java

import java.awt.BorderLayout; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JFrame; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import merge.container.SourceContainer; 

public class Test extends JFrame { 

    public Test() { 
     init(); 
    } 

    private void init() { 
     SourceContainer sc = new SourceContainer(); 
     for (int i = 0; i < 5; i++) { 
      sc.addSourceComp("Sample " + i, new JTree(new Object[]{i})); 
     } 
     sc.load(); 
     add(sc, BorderLayout.CENTER); 
    } 

    public static void main(String[] args) { 
     setUpUI("Nimbus"); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       Test samp = new Test(); 
       samp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       samp.setTitle("Tree Test"); 
       samp.setSize(600, 500); 
       samp.setLocationRelativeTo(null); 
       samp.setVisible(true); 
      } 
     }); 
    } 

    private static void setUpUI(String ui) { 
     try { 
      for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
       if (ui.equals(info.getName())) { 
        UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

} 
+0

welche Komponente ist nicht sichtbar? –

+0

Die jtrees, die in der Rasteransicht hinzugefügt wurden – Madhan

+0

@FastSnail Überprüfen Sie die Screenshots, die ich angehängt habe – Madhan

Antwort

2

in Loadgrid() ändern Ihre Schleife:

for (int i = 0; i < components.size(); i++) { 
    create(components.get(i), i); 
    components.get(i).setVisible(true); 
} 

EDIT: Ich erkannte ich eine Lösung angeboten hatte, ohne tatsächlich eine vollständige Antwort anbieten, so aus Gründen der Vollständigkeit halber:

Cardlayout zeigt 1 Komponente zu einer Zeit durch Modifizieren die Sichtbarkeit der von ihm verwalteten Komponenten. In der Dokumentation wird dies, obwohl sie nicht wirklich es betonen (es verwendet Begriffe wie "Flip" in den meisten des Dokuments):

https://docs.oracle.com/javase/8/docs/api/java/awt/CardLayout.html

Java 8 - Cardlayout

Nur Eine Karte ist gleichzeitig sichtbar und der Container fungiert als Kartenstapel. Die erste Komponente, die einem CardLayout-Objekt hinzugefügt wird, ist die sichtbare Komponente, wenn der Container zum ersten Mal angezeigt wird.

Hier zeigt ein Beispiel dieses Verhalten:

public static void main(String[] args){ 
    ArrayList<JComponent> components = new ArrayList<>(); 
    components.add(new JPanel()); 
    components.add(new JPanel()); 
    components.add(new JPanel()); 

    System.out.println("Component Visibility Prior to Card Layout:"); 
    showVisibilityStatus(components); 

    JPanel cardPane = new JPanel(new CardLayout()); 
    for (JComponent component : components){ 
     cardPane.add(component); 
    } 

    System.out.println("\nComponent Visibility After Card Layout:"); 
    showVisibilityStatus(components); 
} 

public static void showVisibilityStatus(ArrayList<JComponent> components){ 
    for (JComponent component : components){ 
     System.out.println(component.isVisible()); 
    } 
} 

Die Konsole Ausgang davon:

Component Visibility Prior to Card Layout: 
true 
true 
true 

Component Visibility After Card Layout: 
true 
false 
false 

Also, wenn bewegliche Komponenten, die ein Cardlayout mit in in einem Panel platziert wurden Wenn ein anderes Bedienfeld ein anderes Layout verwendet (z. B. GridLayout), muss die Sichtbarkeit dieser Komponenten möglicherweise explizit festgelegt werden.

+0

Ich denke nicht darüber nach. Danke mann – Madhan

+0

Sie sind herzlich willkommen. Ich bin froh, dass ich helfen kann! – Zachary

0

Ich hatte in der Vergangenheit Probleme beim Entfernen und Hinzufügen von Komponenten, nachdem alles verpackt und angezeigt wurde. Nach dem Neuladen der Komponenten in der Schleife haben Sie versucht