私のアルゴリズム クラスでは、mergesort を使用して配列を並べ替え、各ステップで配列をヒストグラムとして描画して、何が起こっているかをグラフィカルに確認する必要があります。配列を更新する paintComponent メソッドで問題が発生しています。プログラムを初めて実行すると、ごちゃごちゃした配列が表示され(本来あるべきように)、マージソートボタンをクリックすると、ソートされた配列が表示されることを期待していますが、代わりに何も得られません。どんな助けでも感謝します、ありがとう。
注: 私は現在マージソートを使用していないことを知っています。最初にグラフィックを機能させようとしています。
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();
}
}