1

私のアルゴリズム クラスでは、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();
    }
}
4

2 に答える 2

2

変数をリセットする必要がありxPosます。そうしないと、x 座標が画面外に表示されます。

int xPos = 0;

余談ですが、 new を作成するArrayPanel必要はありません。変数をリセットして repaint を呼び出すだけでxPos、 のクラス メンバ変数を作成することで機能しますArrayPanel

于 2013-03-28T00:46:45.597 に答える
2

PaintComponentでのみ必要なため、実際にはインスタンス変数であってはならないxPosインスタンス変数をリセットしていません。したがって、それを取り除き、paintComponent() メソッドに移動します。

また、パネルを削除して再度追加する必要もありません。だからここに私がしたことです(静的変数の削除に注意してください!それらはインスタンス変数でなければなりません):

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();
}
于 2013-03-28T00:48:47.173 に答える