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);
您也不需要使用 JFrame
的 getContentPane()
方法。由于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 );
}
}
我想在同一框架上显示多个图表,如下所示:
此示例来自 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);
您也不需要使用 JFrame
的 getContentPane()
方法。由于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 );
}
}