2013-03-28 5 views
1

Pour ma classe d'algorithmes, nous devons trier un tableau en utilisant mergesort et dessiner à chaque étape un tableau sous forme d'histogramme pour voir graphiquement ce qui se passe. Je rencontre un problème avec la méthode paintComponent mettant à jour le tableau. Quand je lance le programme pour la première fois, il montre le tableau brouillé (comme il se doit) et quand je clique sur le bouton mergesort, je m'attends à voir le tableau trié mais à la place, je n'ai rien. Toute aide serait appréciée Merci.Java: Les graphiques disparaissent en cliquant sur JButton

Note: Je sais que je n'utilise pas mergesort maintenant, j'essaie simplement de faire fonctionner les graphiques en premier.

package a2; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Arrays; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class GraphicalSort extends JFrame implements ActionListener { 
    static int[] data = new int[200]; 
    JPanel panel = new JPanel(); //Panel to hold graphical display of array 
    JPanel buttonsPanel = new JPanel(); 
    JButton mButton = new JButton("Mergesort"); 

    int xPos = 0; 
    static int barWidth = 8; 
    static int barHeight = 1; 

    public GraphicalSort() { 
     setLayout(new BorderLayout()); 
     mButton.addActionListener(this); 
     buttonsPanel.add(mButton); 
     for (int i = 0; i < data.length; i++) { 
      data[i] = (int) (500 * Math.random() + 1); 
     } 
     setSize(barWidth * data.length, barHeight * 500 + buttonsPanel.getHeight()); 
     panel = new ArrayPanel(); 
     add(buttonsPanel, BorderLayout.NORTH); 
     add(panel, BorderLayout.CENTER); 
     repaint(); 
     validate(); 
    } 

    public static void main(String[] args) { 
     GraphicalSort gs = new GraphicalSort(); 
     gs.setTitle("Graphical Sort"); 
     gs.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     gs.setLocationRelativeTo(null); 
     gs.setResizable(false); 
     gs.setVisible(true); 
    } 

    @SuppressWarnings("serial") 
    class ArrayPanel extends JPanel { 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.BLACK); 
      for (int i = 0; i < data.length; i++) { 
       g.fillRect(xPos, (barHeight * 500) - (barHeight * data[i]), barWidth, barHeight * data[i]); 
       xPos += barWidth; 
      } 
     } 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     remove(panel); 
     if (e.getSource() == mButton) { 
      Arrays.sort(data); 
      panel = new ArrayPanel(); 
    } 
     add(panel, BorderLayout.CENTER); 
     repaint(); 
     validate(); 
    } 
} 
+1

Vous ne devriez pas besoin de retirer/ajouter les ArrayPanel comme vous êtes, vous devriez être en mesure d'ajouter une fois et laissez les repeints s'en occuper – MadProgrammer

+0

1+ pour poster un [sscce] (http://sscce.org). –

Répondre

2

Vous ne réinitialisez pas la variable d'instance xPos qui ne devrait pas vraiment être une variable d'instance car vous en avez seulement besoin dans paintComponent. Débarrassez-vous-en et déplacez-le dans la méthode paintComponent().

Vous n'avez pas non plus besoin d'enlever et de rajouter le panneau. Voici donc ce que je l'ai fait (note la suppression des statics Celles-ci devraient être variables d'instance!):

int[] data = new int[200]; 
JPanel panel; 
JPanel buttonsPanel = new JPanel(); 
JButton mButton = new JButton("Mergesort"); 

int barWidth = 8; 
int barHeight = 1; 

class ArrayPanel extends JPanel { 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLACK); 
     int xPos = 0; 
     for (int i = 0; i < data.length; i++) { 
      System.out.println("Drawing " + i); 
      g.fillRect(xPos, (barHeight * 500) - (barHeight * data[i]), barWidth, barHeight * data[i]); 
      xPos += barWidth; 
     } 
    } 
} 


public void actionPerformed(ActionEvent e) { 
    Arrays.sort(data); 
    panel.repaint(); 
} 
+0

Cela a fonctionné merci beaucoup. Cela m'a dérangé pendant des heures. Merci! – zr870

2

Vous devez réinitialiser votre variable xPos, sinon la coordonnée x apparaît hors écran:

int xPos = 0; 

En plus: la création d'une nouvelle ArrayPanel est inutile — simplement réinitialiser les variables et appel repaint fonctionnera en faisant xPos une variable de membre de classe de ArrayPanel.