2 votes

Java Swing, j'utilise une boucle for dans le dessin mais seul le dernier élément est rendu sur le panneau.

Édité en tant que MRE. Je ne savais pas vraiment comment écrire le code sans étendre JFrame ou JPanel. Cela reproduira la même erreur que celle que je vois. J'essaie de rendre les barres sur le JPanel, mais il semble que seule la dernière itération de la boucle for dans la classe PlotPanel soit dessinée.

package com.company;
import java.awt.*;
import javax.swing.*;

public class VisualizeAlgorithms {
    public static int initPosX = 0;
    public static int initPosY = 0;
    public static int numBars = 200;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            PlotFrame frame = new PlotFrame();

        });
    }
}

class PlotFrame extends JFrame {
    PlotPanel plotPanel;
    PlotFrame() {
        plotPanel = new PlotPanel();
        this.add(plotPanel);
        this.setTitle("Plot");
        this.setBackground(Color.DARK_GRAY);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setVisible(true);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
    }

    public int[] createArray(int numBars) {
        int[] numsArray = new int[numBars];
        for (int i = 0; i < numBars; i++) {
            numsArray[i] = i + 1;
        }
        return numsArray;
    }

}

class PlotPanel extends JPanel{

    static final int PLOT_WIDTH = 1200;
    static final int PLOT_HEIGHT = 800;
    static final int MAX_BAR_HEIGHT = PLOT_HEIGHT;
    static final int BAR_WIDTH = PLOT_WIDTH / VisualizeAlgorithms.numBars;

    Dimension plotSize = new Dimension(PLOT_WIDTH, PLOT_HEIGHT);

    PlotPanel() {
        this.setPreferredSize(plotSize);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.CYAN);
        draw(g);
    }

    public void draw(Graphics g){
        int numBars = VisualizeAlgorithms.numBars;
        for (int i = 0; i < numBars; i++) {
            g.fillRect(BAR_WIDTH * i, VisualizeAlgorithms.initPosY, BAR_WIDTH, ((i+1)/numBars)*(MAX_BAR_HEIGHT));
        }
    }
}

1voto

Kobeer19 Points 31

Je ne sais pas si je peux accepter les commentaires comme réponses, j'ai donc posté la réponse ici. Il s'agissait en effet de changer la hauteur du rectangle à int h = ((i+1)*MAX_BAR_HEIGHT/numBars) . Merci à @AndrewThompson et @c0der non seulement pour la réponse mais aussi pour les informations complémentaires.

A côté : @c0der a donné un excellent conseil : "en cas de doute, imprimez". Je recommande d'utiliser ce changement :

public void draw(Graphics g){
     int numBars = VisualizeAlgorithms.numBars;
     for (int i = 0; i < numBars; i++) {
         int x = BAR_WIDTH * I;
         int y = VisualizeAlgorithms.initPosY;
         int w = BAR_WIDTH;
         int h = ((i+1)/numBars)*(MAX_BAR_HEIGHT);
         System.out.println(String.format("x,y WxH: %1s,%1s %1sx%1s", x,y,w,h));
         g.fillRect(x,y,w,h);
     }
 } 

(imprimer les valeurs utilisées pour fillRect)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X