Mam napisać prace licencjacka na temat algorytmów sortujących, mam problem z narysowaniem przebiegu algorytmu po danych. Pisze w Javie korzystam z JFrame JPanel i w panelu z funkcji PaintCompnent. Staram się z wizualizować działanie sortowania bąbelkowego, algorytm przechodzi przez dane i na koniec rysuje posortowane dane jednak nie potrafię narysować poszczególnych kroków (co z czym porownuje). Teoretycznie to tylko i+1 ale coś nie działa.
Wzoruje się na http://www.home.umk.pl/~abak/wdimat/s/Index.html
Ktoś mógłby rzucić okiem?
frame.java
package frame;
import java.awt.Color;
public class Frame extends javax.swing.JFrame {
Rysuj rysuj;
Watek w = new Watek();
public Frame() {
initComponents();
rysuj=new Rysuj();
rysuj.setBackground(new Color(240,255,255));
rysuj.setBounds(0, 0, 1200, 600);
rysujJPanel.add(rysuj);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
rysujJPanel = new javax.swing.JPanel();
menuJPanel = new javax.swing.JPanel();
sortujJButton = new javax.swing.JButton();
startJButton = new javax.swing.JButton();
zatrzymajJButton = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout rysujJPanelLayout = new javax.swing.GroupLayout(rysujJPanel);
rysujJPanel.setLayout(rysujJPanelLayout);
rysujJPanelLayout.setHorizontalGroup(
rysujJPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 1128, Short.MAX_VALUE)
);
rysujJPanelLayout.setVerticalGroup(
rysujJPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
);
sortujJButton.setText("Sortuj");
sortujJButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
sortujJButtonActionPerformed(evt);
}
});
startJButton.setText("Start");
startJButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
startJButtonActionPerformed(evt);
}
});
zatrzymajJButton.setText("Zatrzymaj");
zatrzymajJButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
zatrzymajJButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout menuJPanelLayout = new javax.swing.GroupLayout(menuJPanel);
menuJPanel.setLayout(menuJPanelLayout);
menuJPanelLayout.setHorizontalGroup(
menuJPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(zatrzymajJButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(sortujJButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(startJButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
menuJPanelLayout.setVerticalGroup(
menuJPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(menuJPanelLayout.createSequentialGroup()
.addGap(23, 23, 23)
.addComponent(startJButton)
.addGap(18, 18, 18)
.addComponent(sortujJButton)
.addGap(18, 18, 18)
.addComponent(zatrzymajJButton)
.addContainerGap(465, Short.MAX_VALUE))
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(rysujJPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(menuJPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 81, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(rysujJPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(menuJPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
pack();
}// </editor-fold>
private void startJButtonActionPerformed(java.awt.event.ActionEvent evt) {
rysuj.zdarzenie=0;
rysuj=new Rysuj();
rysuj.setBackground(new Color(240,255,255));
rysuj.setBounds(0, 0, 1200, 600);
rysujJPanel.add(rysuj);
rysuj.repaint();
}
private void sortujJButtonActionPerformed(java.awt.event.ActionEvent evt) {
rysuj.zdarzenie=1;
if(!w.isAlive()) w.start();
rysuj.repaint();
}
private void zatrzymajJButtonActionPerformed(java.awt.event.ActionEvent evt) {
w.suspend();
w = new Watek();
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Frame().setVisible(true);
}
});
}
public class Watek extends Thread {
public void run() {
rysuj.algorytm.babelkowe();
}
}
// Variables declaration - do not modify
private javax.swing.JPanel menuJPanel;
private javax.swing.JPanel rysujJPanel;
private javax.swing.JButton sortujJButton;
private javax.swing.JButton startJButton;
private javax.swing.JButton zatrzymajJButton;
// End of variables declaration
}
rysuj.java
package frame;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class Rysuj extends JPanel
{
Algorytmy algorytm;
int zdarzenie;
public Rysuj()
{
algorytm=new Algorytmy(this);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
int x=-5,y=100,wys=0,szer=10;
for(int i=0;i<algorytm.tab.length;i++)
{
g.setColor(Color.yellow);
x=x+11;
wys=algorytm.tab[i];
g2d.fillRect(x,y,szer,wys);
}
if(zdarzenie==1)
{
x=-5;
g.setColor(Color.red);
wys=algorytm.tab[algorytm.getI()];
x=(algorytm.getI())*11+5;
g2d.fillRect(x,y,szer,wys);
g.setColor(Color.black);
wys=algorytm.tab[algorytm.getI()+1]; // Tutaj chce rysować kolejny prostokąt, tyle tylko że jego wysokość jest za od razu max wartością z tablicy (chyba)
x=(algorytm.getI()+1)*11+5;
g2d.fillRect(x,y,szer,wys);
}
}
}
algorytm.java
package frame;
import java.util.Random;
import javax.swing.JPanel;
public class Algorytmy
{
int []tab;
int k;
JPanel panel;
int dl=100;
public Algorytmy(JPanel panel)
{
this.panel=panel;
tab=new int[dl];
Random rand = new Random();
for(int i=0;i<tab.length;i++)
{
tab[i]=rand.nextInt(100);
//tab[i]=i+101;
System.out.print(tab[i]+" ");
}
System.out.print("\n");
}
public void babelkowe()
{
int temp;
for(int j=0;j<tab.length;j++)
{
for(k=0;k<tab.length-1;k++)
{
if (tab[k+1]<tab[k])
{
temp=tab[k];
tab[k]=tab[k+1];
tab[k+1]=temp;
panel.update(panel.getGraphics());
try
{
Thread.sleep(100);
}
catch(Exception e)
{}
}
else
{
panel.update(panel.getGraphics());
}
}
}
for(int i=0;i<tab.length;i++)
{
System.out.print(tab[i]+" ");
}
System.out.print("\n");
}
public int getI()
{
return k;
}
}
Jestem laikiem jeżeli chodzi o jave, dziękuje za każdą podpowiedź/pomoc.