2016-04-03 5 views
1

Ich habe eine ziemlich einfache GUI organisiert mit einem GridBagLayout. Der komplexeste Teil ist der untere Bereich, in dem West mit ScrollPane gefüllt ist und der rechte Bereich ist ein Bereich mit einem CardLayout, der mehrere ChartPanels enthält, so dass ich zwischen einigen Graphen wechseln kann.Hinzufügen von ChartPanel zu CardLayout

Mein Problem kommt, wenn ich das Programm starte.

enter image description here

Die Redimensionierung Problem geht weg, nachdem ich den Rahmen in jeder Richtung ändern. Ich habe bestätigt, dass das Diagrammfeld das Problem ist, da dies nicht durch das Hinzufügen des CardLayout Panels behoben wird. Ich erstelle eine leere ChartPanel und füllen Sie es später, nachdem einige Maßnahmen ergriffen werden, aber das ist, was ich getan habe:

public class Tester { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("Chipmunk: Variant Data Collection Tool"); 
     JPanel hotspotPanel = new JPanel(new CardLayout()); 
     ChartPanel subHotspotPanel = new ChartPanel(null); 
     JPanel indelHotspotPanel = new JPanel(new BorderLayout()); 
     JTextPane resultPane = new JTextPane(); 
     JPanel main = new JPanel(new GridBagLayout()); 
     JPanel header = new JPanel(new BorderLayout()); 

     header.setBackground(Color.WHITE); 
     frame.setLayout(new BorderLayout()); 
     frame.setMinimumSize(new Dimension(875, 600)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
     frame.setLocation(dim.width/2-frame.getSize().width/2, dim.height/2-frame.getSize().height/2); 
     resultPane.setOpaque(false); 
     resultPane.setEditable(false); 
     GridBagConstraints c = new GridBagConstraints(); 
     DocumentFilter filter = new UppercaseDocumentFilter(); 
     JTextField geneField = new JTextField(10); 
     ((AbstractDocument) geneField.getDocument()).setDocumentFilter(filter); 
     geneField.setMinimumSize(geneField.getPreferredSize()); 
     JTextField proEffField = new JTextField(10); 
     proEffField.setMinimumSize(proEffField.getPreferredSize()); 
     String[] mutTypes = { "missense", "nonsense", "frameshift", "nonframeshift"}; 
     JComboBox<String> mutTypeComboBox = new JComboBox<String>(mutTypes); 
     JButton saveResultsButton = new JButton("Save to TSV"); 
     JPanel glass = (JPanel) frame.getGlassPane(); 
     JButton clearButton = new JButton("Clear"); 
     JButton cosmicButton = new JButton("To COSMIC"); 
     JButton dataButton = new JButton("Show Data"); 
     dataButton.setEnabled(false); 
     JButton goButton = new JButton("GO"); 

     c.weightx = 1.0;c.gridx = 0;c.gridy = 0;c.anchor = GridBagConstraints.EAST;c.ipadx=5;c.ipady=5; 
     main.add(new JLabel("Gene: "), c); 
     c.gridx = 1;c.gridy = 0;c.anchor = GridBagConstraints.WEST; 
     main.add(geneField, c); 
     c.gridx = 0;c.gridy = 1;c.anchor = GridBagConstraints.EAST; 
     main.add(new JLabel("Protein Effect: "), c); 
     c.gridx = 1;c.gridy = 1;c.anchor = GridBagConstraints.WEST; 
     main.add(proEffField, c); 
     c.gridx =0;c.gridy = 2;c.anchor = GridBagConstraints.EAST; 
     main.add(new JLabel("Mutation Type: "), c); 
     c.gridx =1;c.gridy = 2;c.anchor = GridBagConstraints.WEST; 
     main.add(mutTypeComboBox, c); 
     c.gridx =0;c.gridy = 3;c.anchor = GridBagConstraints.WEST; 
     main.add(saveResultsButton, c); 
     c.gridx = 0;c.gridy = 3;c.anchor = GridBagConstraints.EAST; 
     main.add(goButton, c); 
     c.gridx = 1;c.gridy = 3;c.anchor = GridBagConstraints.WEST; 
     main.add(clearButton,c); 
     c.gridx = 0;c.gridy = 3;c.anchor = GridBagConstraints.CENTER; 
     main.add(dataButton,c); 
     c.gridx = 1;c.gridy = 3;c.anchor = GridBagConstraints.EAST; 
     main.add(cosmicButton,c); 
     c.gridx = 0; c.gridy =4;c.gridwidth =1; c.weightx = 1.0;c.weighty = 1.0; c.fill = GridBagConstraints.BOTH; 
     JScrollPane scrollPane = new JScrollPane(resultPane); 
     main.add(scrollPane, c); 
     c.gridx = 1; c.gridy =4;c.gridwidth = 1; c.weightx = 1.0;c.weighty = 1.0; c.fill = GridBagConstraints.BOTH; 

     hotspotPanel.add(subHotspotPanel, "SUBPANEL"); 
     hotspotPanel.add(indelHotspotPanel, "INDELPANEL"); 
     hotspotPanel.add(new JPanel(), "BLANK"); 
     main.add(hotspotPanel, c); 
     frame.add(header, BorderLayout.NORTH); 
     frame.add(main, BorderLayout.CENTER); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

} 
+1

'Die Redimensionierung Problem geht weg, nachdem ich den Rahmen in jedem direction.' Größe ändern - klingt wie Sie Komponenten an den Rahmen hinzugefügt werden, nachdem der Rahmen bereits sichtbar ist. Die Anweisung 'setVisible (true) 'sollte aufgerufen werden, NACHDEM alle Komponenten zum Rahmen hinzugefügt wurden. Wenn Sie mehr Hilfe benötigen, dann veröffentlichen Sie eine richtige [SSCCE] (http://sscce.org/), die das Problem demonstriert. – camickr

+0

Bestätigt, dass das nicht das Problem ist, aktualisierte Post mit SSCCE –

+0

Der Code kompiliert nicht, wir haben keinen Zugriff auf die ChartPanel-Klasse. Wiederum ist der Punkt eines 'SSCCE', den Code zu vereinfachen, das Problem zu demonstrieren. Wir wollen nicht nur einen Core Dump Ihres aktuellen Codes. Benötigen Sie wirklich alle Komponenten, um das Problem zu demonstrieren? Die Chancen stehen gut, wenn Sie irrelevanten Code entfernen, werden Sie das Problem finden. Wir haben auch nicht den DocumentFilter. Wie ist das für ein Layout-Problem relevant? – camickr

Antwort

1

dieses example verwenden, ist es klar, dass ein ChartPanel Arbeiten korrekt in einem CardLayout. Das folgende Beispiel überschreibt getPreferredSize(), wie gezeigt here, um eine anfängliche Größe für festzulegen. Die Verwendung von GridLayout auf jeder Karte ermöglicht es dem Diagramm, das Feld zu füllen, wenn der umschließende Rahmen in der Größe verändert wird.

image

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.util.Random; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.data.general.DefaultPieDataset; 

/** 
* @see https://stackoverflow.com/a/36392696/230513 
* @see https://stackoverflow.com/a/36243395/230513 
*/ 
public class CardPanel extends JPanel { 

    private static final Random r = new Random(); 
    private static final JPanel cards = new JPanel(new CardLayout()); 
    private final String name; 

    public CardPanel(String name) { 
     super(new GridLayout()); 
     this.name = name; 
     DefaultPieDataset pieDataset = new DefaultPieDataset(); 
     pieDataset.setValue("One", r.nextInt(10) + 10); 
     pieDataset.setValue("Two", r.nextInt(20) + 10); 
     pieDataset.setValue("Three", r.nextInt(30) + 10); 
     JFreeChart chart = ChartFactory.createPieChart3D(
      "3D Pie Chart", pieDataset, true, true, true); 
     chart.setTitle(name); 
     this.add(new ChartPanel(chart) { 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(500, (int)(500 * 0.62)); 
      } 
     }); 
    } 

    @Override 
    public String toString() { 
     return name; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       create(); 
      } 
     }); 
    } 

    private static void create() { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     for (int i = 1; i < 9; i++) { 
      CardPanel p = new CardPanel("Chart " + String.valueOf(i)); 
      cards.add(p, p.toString()); 
     } 
     JPanel control = new JPanel(); 
     control.add(new JButton(new AbstractAction("\u22b2Prev") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       CardLayout cl = (CardLayout) cards.getLayout(); 
       cl.previous(cards); 
      } 
     })); 
     control.add(new JButton(new AbstractAction("Next\u22b3") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       CardLayout cl = (CardLayout) cards.getLayout(); 
       cl.next(cards); 
      } 
     })); 
     f.add(cards, BorderLayout.CENTER); 
     f.add(control, BorderLayout.SOUTH); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
}