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();
}
}
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
1+ pour poster un [sscce] (http://sscce.org). –