Adding ChartPanel to CardLayout

前端 未结 1 872
孤街浪徒
孤街浪徒 2020-12-22 02:06

I have a pretty basic GUI organized with a GridBagLayout. The most complex portion is the bottom where West is populated with ScrollPane and the right is a pane

1条回答
  •  醉梦人生
    2020-12-22 02:39

    Using this example, it's clear that a ChartPanel works correctly in a CardLayout. The example below overrides getPreferredSize(), as shown here, to establish an initial size for the ChartPanel. The use of GridLayout on each card allows the chart to fill the panel as the enclosing frame is resized.

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

    0 讨论(0)
提交回复
热议问题