[英]Java: Graphics Disappear upon clicking JButton
對於我的算法類,我們必須使用mergesort對數組進行排序,並在每一步將數組繪制為直方圖,以圖形方式查看正在發生的事情。 我遇到了paintComponent方法更新數組的問題。 當我第一次運行程序時,它會顯示混亂的數組(應該如此)然后當我單擊mergesort按鈕時,我希望看到排序的數組,但相反,我什么也得不到。 任何幫助將不勝感激,謝謝。
注意:我知道我現在不使用mergesort,我只是想讓圖形先運行。
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();
}
}
您需要重置xPos
變量,否則x坐標將出現在屏幕外:
int xPos = 0;
另外:創建一個新的ArrayPanel
是不必要的 - 只需重置變量並調用repaint就可以使xPos
成為ArrayPanel
的類成員變量。
您沒有重置xPos實例變量,它實際上不應該是實例變量,因為您只需要在paintComponent中使用它。 所以擺脫它並將其移動到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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.