9
votes

Comment changer la taille de Jfreechart

J'ai ajouté un jfreechart à un jPanel (à l'aide d'un Borderlayout ), et c'est énorme . Y a-t-il quelque chose que je peux faire pour le rendre plus petit? XXX


0 commentaires

4 Réponses :


0
votes

Essayez de régler la taille du panneau votre graphique.

Vous pourriez avoir besoin de définir les deux JPANEL Middle et ChartPanel CP


0 commentaires

13
votes

Lorsque vous créez votre ChartPanel Code> , vous avez plusieurs options qui affectent le résultat:

  1. Accepter le par défaut_width code> et par défaut_height code>: 680 x 420. P> LI>

  2. Spécifiez la largeur préférée code> et hauteur code> dans le constructeur. p> li>

  3. invoquer setPreFerredSize () code> explicitement si approprié . p> li>

  4. remplacement getPreFerredSize () code> pour calculer la taille de manière dynamique. P>

    @Override
    public Dimension getPreferredSize() {
        // given some values of w & h
        return new Dimension(w, h);
    }
    
  5. Choisissez le Layout du conteneur à que le ChartPanel code> sera ajouté. Notez que la disposition par défaut de jPanel code> est flowlayout code>, tandis que celle de jframe code> est limaceLayout code>. Comme exemple concret, thermomètredemo code> utilise les deux valeurs préférées dans le constructeur et un gridlayout code> pour le conteneur permettant de redimensionner dynamique. p> li> ol>

    image p> p>


3 commentaires

Le cas échéant? D'après ce que je vois dans la réponse la plus avancée (et acceptée), il n'est jamais approprié;)


Ok, je vois ce que tu as fait ici. envisagez de relier votre réponse à votre réponse, pas à la question alors


Merci d'avoir lu et commenté. Si seulement c'était si simple! Je dirais que c'est occasionnellement approprié, comme suggéré ici et Here .



1
votes

En plus de répondre "4" de @trashgod, j'ai eu le même problème et j'ai réussi à résoudre le problème comme ceci: (1) Créer une classe personnalisée qui s'étend jpanel (2) Obtenez la taille en quelque sorte, que vous voudriez passer à votre carte (3) Créer une méthode qui renvoie un objet "ChartPanel" comme celui-ci:

import java.awt.Dimension;
import java.util.ArrayList;
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;

public class MyPieChart extends JPanel {

    public static void main(String[] args) {
        example1();
        example2();
        example3();
    }

    public static void example1() {
        JPanel panel = new JPanel();
        panel.setBounds(50, 80, 100, 100);
        MyPieChart piePanel = new MyPieChart("Example 1", dataset(), panel);
        panel.add(piePanel);
        JFrame frame = new JFrame();
        frame.setLayout(null); 
        frame.setBounds(10, 10, 200, 300);
        frame.add(panel);
        frame.setVisible(true);
    }

    public static void example2() {
        MyPieChart piePanel = new MyPieChart("Example 2", dataset(), 30, 50, 100, 100);
        JFrame frame = new JFrame();
        frame.setLayout(null); 
        frame.setBounds(210, 10, 200, 300);
        frame.add(piePanel);
        frame.setVisible(true);
    }

    public static void example3() {
        MyPieChart piePanel = new MyPieChart("Example 3", dataset(), 100, 100);
        piePanel.setLocation(0,0);
        JFrame frame = new JFrame();
        frame.setLayout(null); 
        frame.setBounds(410, 10, 200, 300);
        frame.add(piePanel);
        frame.setVisible(true);
    }

    static ArrayList<ArrayList<String>> dataset() {
        ArrayList<ArrayList<String>> dataset = new ArrayList<ArrayList<String>>();
        dataset.add(row( "Tom", "LoggedIn", "Spain" ));
        dataset.add(row( "Jerry", "LoggedOut", "England" ));
        dataset.add(row( "Gooffy", "LoggedOut", "France" ));
        return dataset;
    }

    static ArrayList<String> row(String name, String actualState, String country) {
        ArrayList<String> row = new ArrayList<String>();
        row.add(name); row.add(actualState); row.add(country); 
        return row;
    }

    ArrayList<ArrayList<String>> dataset;
    DefaultPieDataset pieDataset = new DefaultPieDataset(); 
    int width, height, posX, posY;
    int colState = 1;
    String title;
    String LoggedIn = "LoggedIn";
    String LoggedOut = "LoggedOut";

    public MyPieChart(String title, ArrayList<ArrayList<String>> dataset, int...args) {

        if(args.length==2) {
            this.width = args[0];
            this.height = args[1];
            this.setSize(width, height);
        }
        else if(args.length==4) {
            this.posX = args[0];
            this.posY = args[1];
            this.width = args[2];
            this.height = args[3];
            this.setBounds(posX, posY, width, height);
        }
        else {
            System.err.println("Error: wrong number of size/position arguments");
            return;
        }

        this.title = title;
        this.dataset = dataset;
        this.add(chart());
    }

    public MyPieChart(String title, ArrayList<ArrayList<String>> dataset, JPanel panel) {
        this.title = title;
        this.dataset = dataset;
        this.width = panel.getWidth();
        this.height = panel.getHeight();
        this.setBounds(panel.getBounds());
        this.add(chart());
    }

    ChartPanel chart() {

        int totalLoggedIn = 0;
        int totalLoggedOut = 0;

        for(ArrayList<String> user : dataset) {
            if(user.get(colState).equals(LoggedIn)) totalLoggedIn++;
            else totalLoggedOut++;
        }
        pieDataset.clear();
        pieDataset.setValue(LoggedIn +": "+ totalLoggedIn, totalLoggedIn);
        pieDataset.setValue(LoggedOut +": "+ totalLoggedOut, totalLoggedOut);

        JFreeChart chart = ChartFactory.createPieChart(title, pieDataset, false, false, false );

        return new ChartPanel(chart) { // this is the trick to manage setting the size of a chart into a panel!
            public Dimension getPreferredSize() {
                return new Dimension(width, height);
            }
        };
    }
}


0 commentaires

1
votes

J'ai eu un problème avec mon diagramme à tarte étant trop gros avec BorderLayout aussi. J'ai fini par résoudre mon problème en convertissant le graphique en une image à la place.

avant Entrez la description de l'image ici

après Entrez la description de l'image ici

code xxx


0 commentaires