JFreeChart 同一帧上的多个图表

Multiple chart on the same frame with JFreeChart

我想在同一框架上显示多个图表,如下所示:

此示例来自 java2s.com,但该域现已过期。

实际上我是这样做的,但它不起作用,我只在框架中显示了一张图表:

JFrame frame = new JFrame("Many charts same frame");

JFreeChart barChart1 = 
    ChartFactory.createHistogram("Histogram1","", "", dataset,
            PlotOrientation.VERTICAL, true, true, false);

frame.getContentPane().add(new ChartPanel(barChart1));

JFreeChart barChart2 = 
    ChartFactory.createHistogram("Histogram2","", "", dataset,
            PlotOrientation.VERTICAL, true, true, false);

frame.getContentPane().add(new ChartPanel(barChart2));

frame.pack();

frame.setVisible(true);

有什么想法吗?

这是因为 JFrame 默认使用 BorderLayout 布局管理器。此布局管理器将容器分为五个区域,即 CENTER、NORTH/PAGE_START、SOUTH/PAGE_END、WEST/LINE_START 和 EAST/LINE_END。 Take a look here. 如果您只是想将组件放入容器中并让它为您组织它们,您可以使用例如 FlowLayout,这是 JPanel 的默认布局管理器.尝试这样的事情来更改 JFrame.

的布局管理器
JFrame frame = new JFrame("Many charts same frame");
frame.setLayout( new FlowLayout() );

JFreeChart barChart1 = 
    ChartFactory.createHistogram("Histogram1","", "", dataset,
            PlotOrientation.VERTICAL, true, true, false);

frame.getContentPane().add(new ChartPanel(barChart1));

JFreeChart barChart2 = 
    ChartFactory.createHistogram("Histogram2","", "", dataset,
            PlotOrientation.VERTICAL, true, true, false);

frame.getContentPane().add(new ChartPanel(barChart2));

frame.pack();

frame.setVisible(true);

这样做可能会解决您的问题。如果你想继续使用 BorderLayout,你只需要说出组件必须插入的位置,即在什么区域。例如:

frame.getContentPane().add(new ChartPanel(barChart1), BorderLayout.NORTH);
frame.getContentPane().add(new ChartPanel(barChart2), BorderLayout.CENTER);

您也不需要使用 JFramegetContentPane() 方法。由于Java 5,如果我没记错的话,你可以直接使用add方法。类似于:

frame.add(new ChartPanel(barChart1));

这里有一个例子向您展示这两个布局管理器之间的区别,看看:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;

public class LayoutManagerTest {

    public static void main( String[] args ) {

        JFrame f1 = new JFrame( "BorderLayout" );
        f1.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        f1.add( new JButton( "btn1" ) );
        f1.add( new JButton( "btn2" ) );
        f1.add( new JButton( "btn3" ) );
        f1.add( new JButton( "btn4" ) );
        f1.add( new JButton( "btn5" ) );
        f1.setSize( 500, 200 );
        f1.setLocationRelativeTo( null );



        JFrame f2 = new JFrame( "BorderLayout with regions" );
        f2.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        f2.add( new JButton( "btn1" ), BorderLayout.NORTH );
        f2.add( new JButton( "btn2" ), BorderLayout.SOUTH );
        f2.add( new JButton( "btn3" ), BorderLayout.WEST );
        f2.add( new JButton( "btn4" ), BorderLayout.EAST );
        f2.add( new JButton( "btn5" ), BorderLayout.CENTER );
        f2.setSize( 500, 200 );
        f2.setLocationRelativeTo( null );



        JFrame f3 = new JFrame( "FlowLayout" );
        f3.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        f3.setLayout( new FlowLayout() );

        f3.add( new JButton( "btn1" ) );
        f3.add( new JButton( "btn2" ) );
        f3.add( new JButton( "btn3" ) );
        f3.add( new JButton( "btn4" ) );
        f3.add( new JButton( "btn5" ) );
        f3.setSize( 500, 200 );
        f3.setLocationRelativeTo( null );



        f1.setVisible( true );
        f2.setVisible( true );
        f3.setVisible( true );

    }

}