Несколько графиков в одном кадре с JFreeChart - PullRequest
0 голосов
/ 21 февраля 2019

Я хотел бы отобразить множество диаграмм в одном кадре, как показано ниже:

enter image description here

Этот пример взят из 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);

Есть идеи?

1 Ответ

0 голосов
/ 21 февраля 2019

Это потому, что JFrame использует по умолчанию менеджер раскладки BorderLayout.Этот менеджер компоновки делит контейнер на пять регионов: CENTRE, NORTH / PAGE_START, SOUTH / PAGE_END, WEST / LINE_START и EAST / LINE_END. Посмотрите здесь. Если вы просто хотите выбросить компоненты в контейнер и позволить ему упорядочить их для вас, вы можете использовать, например, 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);

Вам не нужно использовать getContentPane() метод JFrame тоже.Начиная с 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 );

    }

}
...