Java 将ChartPanel添加到CardLayout

Java 将ChartPanel添加到CardLayout,java,swing,jfreechart,cardlayout,Java,Swing,Jfreechart,Cardlayout,我有一个非常基本的GUI,用GridBagLayout组织起来。最复杂的部分是底部,西部填充了滚动窗格,右侧是一个带有CardLayout的面板,该面板有多个图表面板,因此我可以在几个图形之间切换 我的问题是在我启动程序时出现的 调整大小的问题消失后,我在任何方向调整框架。我已确认chartpanel是问题所在,因为不将其添加到CardLayoutpanel会解决问题。我创建了一个空白的ChartPanel,并在采取某些操作后填充它,但这就是我所做的: public class Tester

我有一个非常基本的GUI,用
GridBagLayout
组织起来。最复杂的部分是底部,西部填充了滚动窗格,右侧是一个带有
CardLayout
的面板,该面板有多个图表面板,因此我可以在几个图形之间切换

我的问题是在我启动程序时出现的

调整大小的问题消失后,我在任何方向调整框架。我已确认chartpanel是问题所在,因为不将其添加到
CardLayout
panel会解决问题。我创建了一个空白的
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);
    }

}
公共类测试器{
公共静态void main(字符串[]args){
JFrame=新的JFrame(“花栗鼠:变型数据收集工具”);
JPanel hotspotPanel=新的JPanel(新的CardLayout());
ChartPanel subHotspotPanel=新的ChartPanel(空);
JPanel indelHotspotPanel=newjpanel(newborderlayout());
JTextPane resultPane=新的JTextPane();
JPanel main=newjpanel(newgridbaglayout());
JPanel header=newjpanel(newborderlayout());
标题.立根背景(颜色.白色);
frame.setLayout(新的BorderLayout());
框架设置最小尺寸(新尺寸(875600));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
维度dim=Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation(dim.width/2-frame.getSize().width/2,dim.height/2-frame.getSize().height/2);
结果平面设置不透明(假);
resultPane.setEditable(假);
GridBagConstraints c=新的GridBagConstraints();
DocumentFilter filter=新的大写DocumentFilter();
JTextField geneField=新的JTextField(10);
((AbstractDocument)geneField.getDocument()).setDocumentFilter(filter);
geneField.setMinimumSize(geneField.getPreferredSize());
JTextField proEffField=新的JTextField(10);
proEffField.setMinimumSize(proEffField.getPreferredSize());
String[]mutTypes={“错义”、“无意义”、“移帧”、“非移帧”};
JComboBox mutTypeComboBox=新的JComboBox(mutTypes);
JButton saveResultsButton=新JButton(“保存到TSV”);
JPanel glass=(JPanel)frame.getGlassPane();
JButton clearButton=新JButton(“清除”);
JButton cosmicButton=新JButton(“To COSMIC”);
JButton dataButton=新JButton(“显示数据”);
dataButton.setEnabled(false);
JButton goButton=新JButton(“GO”);
c、 权重x=1.0;c.gridx=0;c.gridy=0;c.anchor=gridbagstraints.EAST;c.ipadx=5;c.ipady=5;
添加(新的JLabel(“基因:”),c);
c、 gridx=1;c.gridy=0;c.anchor=gridbagstraints.WEST;
main.add(geneField,c);
c、 gridx=0;c.gridy=1;c.anchor=gridbagstraints.EAST;
添加(新的JLabel(“蛋白质效应”),c);
c、 gridx=1;c.gridy=1;c.anchor=gridbagstraints.WEST;
main.add(proEffField,c);
c、 gridx=0;c.gridy=2;c.anchor=gridbagstraints.EAST;
添加(新的JLabel(“突变类型:”),c);
c、 gridx=1;c.gridy=2;c.anchor=gridbagstraints.WEST;
main.add(mutTypeComboBox,c);
c、 gridx=0;c.gridy=3;c.anchor=gridbagstraints.WEST;
main.add(saveResultsButton,c);
c、 gridx=0;c.gridy=3;c.anchor=gridbagstraints.EAST;
主。添加(戈布顿,c);
c、 gridx=1;c.gridy=3;c.anchor=gridbagstraints.WEST;
main.add(clearButton,c);
c、 gridx=0;c.gridy=3;c.anchor=gridbagsconstraints.CENTER;
main.add(数据按钮,c);
c、 gridx=1;c.gridy=3;c.anchor=gridbagstraints.EAST;
main.add(cosmicButton,c);
c、 gridx=0;c.gridy=4;c.gridwidth=1;c.weightx=1.0;c.weighty=1.0;c.fill=gridbagstraints.BOTH;
JScrollPane scrollPane=新的JScrollPane(resultPane);
main.add(滚动窗格,c);
c、 gridx=1;c.gridy=4;c.gridwidth=1;c.weightx=1.0;c.weighty=1.0;c.fill=gridbagstraints.BOTH;
热点面板。添加(子热点面板,“子面板”);
添加(indelHotspotPanel,“INDELPANEL”);
添加(新的JPanel(),“BLANK”);
主。添加(热点面板,c);
框架。添加(标题、边框布局。北);
添加(主、边框布局、中心);
frame.pack();
frame.setVisible(true);
}
}
使用此选项,可以清楚地看到
图表面板
卡片布局
中正常工作。下面的示例覆盖
getPreferredSize()
,如图所示,为
ChartPanel
建立初始大小。在每张卡片上使用
GridLayout
,可以在调整封闭框架的大小时让图表填充面板

导入java.awt.BorderLayout;
导入java.awt.CardLayout;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.util.Random;
导入javax.swing.AbstractAction;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入org.jfree.chart.ChartFactory;
导入org.jfree.chart.ChartPanel;
导入org.jfree.chart.JFreeChart;
导入org.jfree.data.general.DefaultPieDataset;
/**
*@见https://stackoverflow.com/a/36392696/230513
*@见https://stackoverflow.com/a/36243395/230513
*/
公共类CardPanel扩展了JPanel{
私有静态最终随机r=新随机();
私有静态最终JPanel卡=新JPanel(新CardLayout());
私有最终字符串名;
公共CardPanel(字符串名称){
超级(新网格布局());
this.name=名称;
DefaultPieDataset=新的DefaultPieDataset();
pieDataset.setValue(“一”,r.nextInt(10)+10);
pieDataset.setValue(“两个”,r.nextInt(20)+10);
pieDataset.setValue(“三”,r.nextInt(30)+10);
JFreeChart chart=ChartFactory.createPieC
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);
    }
}