Java:单击JButton时图形消失
对于我的算法类,我们必须使用mergesort对数组进行排序,并在每一步将数组绘制为直方图,以图形方式查看发生了什么。paintComponent方法更新数组时遇到问题。当我第一次运行该程序时,它显示了它应该显示的混乱数组,然后当我单击mergesort按钮时,我希望看到已排序的数组,但是我没有得到任何结果。任何帮助都将不胜感激,谢谢 注意:我知道我现在没有使用mergesort,我只是想先让图形工作Java:单击JButton时图形消失,java,arrays,swing,graphics,jpanel,Java,Arrays,Swing,Graphics,Jpanel,对于我的算法类,我们必须使用mergesort对数组进行排序,并在每一步将数组绘制为直方图,以图形方式查看发生了什么。paintComponent方法更新数组时遇到问题。当我第一次运行该程序时,它显示了它应该显示的混乱数组,然后当我单击mergesort按钮时,我希望看到已排序的数组,但是我没有得到任何结果。任何帮助都将不胜感激,谢谢 注意:我知道我现在没有使用mergesort,我只是想先让图形工作 package a2; import java.awt.BorderLayout; impo
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变量,否则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();
}
您没有重置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();
}
您不需要像现在这样删除/添加ArrayPanel,您应该能够添加一次,并让重新绘制处理它1+,以便发布一个。您不需要像现在这样删除/添加ArrayPanel,您应该能够添加一次,并让重新绘制处理它1+,以便发布一个。非常感谢您。这已经困扰了我好几个小时了。谢谢它奏效了,非常感谢。这已经困扰了我好几个小时了。谢谢