2016-04-03 26 views
1

我有一个非常基本的GUI,组织了一个GridBagLayout。最复杂的部分是West用ScrollPane填充的底部,右边是带有CardLayout的面板,该面板有多个ChartPanel,因此我可以在几张图之间切换。将ChartPanel添加到CardLayout中

当我启动程序时出现了我的问题。

enter image description here

的大小调整问题消失后,我调整在任何方向的框架。我已经确认该chartpanel是问题,因为没有将此添加到CardLayout面板修复它。我创建一个空白ChartPanel后来填充它采取一些行动后,但是这是我做了什么:

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

'大小调整问题消失后,我调整框架中的任何direction.' - 听起来像是你将组件添加到帧后的帧已经可见。应在所有组件添加到框架后调用'setVisible(true)'语句。如果您需要更多帮助,请发布适当的[SSCCE](http://sscce.org/)来证明问题。 – camickr

+0

确认这不是问题,与SSCCE更新后 –

+0

代码不编译我们无法访问ChartPanel类。 “SSCCE”的重点在于简化代码来证明问题。我们不只是想要当前代码的核心转储。你真的需要所有组件来证明问题吗?当你删除不相关的代码时,你会发现问题的可能性。我们也没有DocumentFilter。再次,这与布局问题有什么关系? – camickr

回答

1

使用该example,很明显,一个ChartPanel工作正常在CardLayout。下面的示例覆盖getPreferredSize(),如图所示here,以建立ChartPanel的初始大小。在每个卡上使用GridLayout允许图表在封闭框架调整大小时填充面板。

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); 
    } 
}