2017-08-24 7 views
1

J'essaye de créer un moyen de visualiser l'array array en créant une forme de "bargraphe" en utilisant line2d/graphics2d. L'idée est d'avoir l'index du tableau sur l'axe des x, puis d'avoir la valeur sur le y et de le mettre à jour en utilisant différentes méthodes de tri. J'essaye donc d'utiliser une arrayList pour stocker les valeurs de y et d'utiliser une boucle for dans la méthode paint pour dessiner toutes les lignes, mais il semble que chaque fois que j'essaye d'utiliser repaint, elle redéfinit ma arrayList, alors comment faire? ?Utilisation d'une arrayList comme coordonnée y dans graphics2d

Voici le code que je utilise:

import javax.swing.*; 
import java.awt.BasicStroke; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Line2D; 
import java.util.ArrayList; 
import java.util.Random; 

public class Frame_Main extends JFrame { 

    private JPanel screen = new Screen(); 
    private Screen _screen = new Screen(); 

    private int rndMaxRange = 100; 
    private int maxArraySize = 50; 

    // TODO Make sure static is really needed 
    public static ArrayList<Integer> array = new ArrayList<>(); 

    public Frame_Main() { 
     this.setSize(700, 500); 
     this.setVisible(true); 
     this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     this.add(screen); 
    } 

    public static void main(String[] args) { 
     Frame_Main m = new Frame_Main(); 

     m.randomizeArray(array); 
     m.refreshVisuals(array); 
    } 

    public void refreshVisuals(ArrayList<Integer> arrayList) { 

     _screen.setArrayList(arrayList); 
     _screen.repaint(); 

     System.out.println("Refreshed drawing. Screen Array Size: " + _screen.lineArrayList.size()); 
    } 

    public void randomizeArray(ArrayList<Integer> arrayList) { 
     arrayList.clear(); 
     Random rnd = new Random(); 

     for (int i = 0; i < maxArraySize; i++) { 
      arrayList.add(rnd.nextInt(rndMaxRange) + 1); 
     } 

     System.out.println("Created an array with the size: " + arrayList.size()); 
    } 
} 

class Screen extends JPanel { 

    public ArrayList<Integer> lineArrayList = new ArrayList<>(); 

    // private int canvasWidth = Frame_Main.WIDTH; 
    private int lineWidth; 

    public void setArrayList(ArrayList<Integer> arrayList) { 
     lineArrayList.addAll(arrayList); 
    } 

    public void paint(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 

     lineWidth = 3; 
     g2.setStroke(new BasicStroke(lineWidth)); 

     System.out.println("lineArrayList Size: " + lineArrayList.size()); 

     int x = 0; 

     for (int i : lineArrayList) { 
      g2.draw(new Line2D.Float(x, x, 0, i)); 
      x = x + lineWidth; 
     } 
    } 
} 
+0

' « chaque fois que j'essaie d'utiliser repeindre remet à zéro mon arrayList ... »' - dire plus s'il vous plaît des détails de exactement ce qui se passe. Que voulez-vous dire par "réinitialise mon arraylist"? –

+0

Ouais désolé. Quand j'utilise la méthode repaint/paint intégrée dans graphics2d, il semble que ma taille arrayList soit nulle/efface l'arraylist. J'ai essayé d'utiliser des points d'arrêt et il semble que ma arrayList dans la classe screen soit correctement dimensionnée jusqu'à ce que j'appelle paint() ou repaint() ce qui signifie que si je casse pendant ces méthodes, la taille arrayList est 0. Espérons que cela effacera! – Walrusser

+0

Cette information est trop importante pour enterrer dans le commentaire. S'il vous plaît [modifier] votre message original et l'inclure pour tout voir. –

Répondre

1

Vous n'ajoutez votre variable _SCREEN à l'interface graphique, il est jamais affiché, et ainsi appeler repaint() sur elle ne fait rien.

Donc, pour starteres, changer

this.add(screen); 

à:

add(_screen); 

Autres questions sans rapport avec:

  • Vous devez remplacer la méthode paintComponent de JPanel, et non sa méthode de peinture
  • Vous devriez d'abord appeler la méthode de peinture du super chose dans votre priorité.

par exemple, quelque chose comme ...

import java.awt.BasicStroke; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.Stroke; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class MyScreen extends JPanel { 
    private static final int PREF_W = 700; 
    private static final int PREF_H = 500; 
    private static final int LINE_WIDTH = 5; 
    private static final Stroke STROKE = new BasicStroke((float) LINE_WIDTH); 
    private static final int MAX_DATA_SIZE = 50; 
    private static final int MAX_RANGE = 400; 
    private List<Integer> displayData = new ArrayList<>(); 
    private Random random = new Random(); 

    public MyScreen() { 
     for (int i = 0; i < MAX_DATA_SIZE; i++) { 
      displayData.add(random.nextInt(MAX_RANGE) + 1); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     // to do house-keeping painting 
     super.paintComponent(g); 

     // to smooth out graphics 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     if (displayData == null) { 
      return; 
     } 

     g2.setStroke(STROKE); 
     int x = 0; 
     for (Integer i : displayData) { 
      g2.drawLine(x, x, 0, i); 
      x += LINE_WIDTH; 
     } 
    } 


    private static void createAndShowGui() { 
     MyScreen mainPanel = new MyScreen(); 

     JFrame frame = new JFrame("My Screen"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
}