Brauche Hilfe bei einem Sortier-Applet mit Canvas

hi leute,

ich brauche hilfe bei einem applet für das sortierverfahren bubblesort.

mein problem ist, dass ich nicht weiß was ich bei der ausgabe (draw()-methode) falsch mache, diese gibt einfach nicht meinen string (liste) aus…

hier mein quellcode, ide ist netbeans 7:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.lang.reflect.InvocationTargetException;

public class SortAlgos extends javax.swing.JApplet {

private static final long serialVersionUID = 1L;

@Override
public void init()
{
//
/* 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/l…
*/
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(SortAlgos.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch(InstantiationException ex)
{
java.util.logging.Logger.getLogger(SortAlgos.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch(IllegalAccessException ex)
{
java.util.logging.Logger.getLogger(SortAlgos.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch(javax.swing.UnsupportedLookAndFeelException ex)
{
java.util.logging.Logger.getLogger(SortAlgos.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//

try
{
java.awt.EventQueue.invokeAndWait(new Runnable() {

@Override
public void run()
{
initComponents();
initBG();
getAll();
}
});
}
catch(InvocationTargetException ex)
{
System.out.println("init: " + ex + „\n“ + ex.getLocalizedMessage() + „\n“ + ex.getMessage());
}
catch(InterruptedException ex)
{
System.out.println("init: " + ex + „\n“ + ex.getLocalizedMessage() + „\n“ + ex.getMessage());
}
}

@SuppressWarnings(„unchecked“)
//
private void initComponents() {

jButton1 = new javax.swing.JButton();
jTextField1 = new javax.swing.JTextField();
canvas1 = new java.awt.Canvas();

setBackground(new java.awt.Color(102, 102, 102));
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

jButton1.setText(„Bubble Sort“);
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});

jTextField1.setText("[9,11,3,4,5,1,8]");

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(canvas1, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 428, Short.MAX_VALUE)
.addGap(18, 18, 18)
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addComponent(canvas1, javax.swing.GroupLayout.DEFAULT_SIZE, 277, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jButton1)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);
}//

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
{
leeren();
if(run)
{
run = false;
System.out.println(„Abbruch“);
while(bsort.isAlive())
{
try
{
Thread.sleep(1);
}
catch(InterruptedException ex)
{
System.out.println("sleep1: " + ex);
}
}
}
else
{
run = true;
getAll();
bsort.start();
}
}
// Variables declaration - do not modify
private java.awt.Canvas canvas1;
private javax.swing.JButton jButton1;
private javax.swing.JTextField jTextField1;
// End of variables declaration
private String liste = „“;
private int z = 0;
private int[] elemente;
private Thread bsort = null;
private boolean run = false;
private boolean oppb = false;
private int oppi = 1;
private Image backbuffer;
private Graphics graphic;

public void draw()
{
graphic.drawString(liste, 0, 0);
// hier malen
repaint();
}

@Override
public void update(Graphics g)
{
g.drawImage(backbuffer, 0, 0, this);
}

@Override
public void paint(Graphics g)
{
update(g);
}

private void setThread()
{
bsort = new Thread() {

@Override
public void run()
{
boolean nichtfertig = true;
int temp;
while(nichtfertig)
{
nichtfertig = false;
if(!run)
{
break;
}
//draw();
for(int i = 0; i elemente[i + 1])
{
temp = elemente[i];
elemente[i] = elemente[i + 1];
elemente[i + 1] = temp;
nichtfertig = true;
oppb = true;
draw();
oppb = false;
}
else
{
draw();
}
}
}
draw();
run = false;
}

private void sleep(int i)
{
try
{
Thread.sleep(i);
} catch(InterruptedException ex)
{
//jTextArea1.append("sleep: " + ex);
}
}
};
}

private void leeren()
{
liste = „“;
z = 0;
elemente = null;
bsort = null;
run = false;
}

private void getAll()
{
liste = jTextField1.getText().substring(1, jTextField1.getText().length() - 1);
String[] e = liste.split(",");
elemente = new int[e.length];

for(int i = 0; i

vllt gibt es jemanden, der mir dabei behilflich sein kann mein problem zu beheben.

vielen dank schon mal,
tobi

versuche es mal mit einem Debugger; per Tool generierter Quellcode ist leider nicht sehr „durchsichtig“

hi leute,

ich brauche hilfe bei einem applet für das sortierverfahren
bubblesort.

mein problem ist, dass ich nicht weiß was ich bei der ausgabe
(draw()-methode) falsch mache, diese gibt einfach nicht meinen
string (liste) aus…

Hallo Tobi,

zunächst mal ein genereller Hinweis: Bei solchen Problemen sollte man immer versuchen, das Problem auf das Minimum zu reduzieren. Man schreibt also ein Programm, in dem nur das vorkommt, was wirklich nötig ist, um das Problem nachzuvollziehen.

Grund 1: Es ist für potentiell Hilfswillige ziemlich abschreckend, wenn sie erst die Dinge, wie wirklich mit dem Problem zu tun haben, von dem ganzen überflüssigen Drumherum trennen sollen. Ich habe oft weder Zeit noch Lust, den Fehler in ein paar Hundert Zeilen Code zu suchen. Dein Code ist - nebenbei bemerkt - ein Prachtbeispiel für Unübersichtlichkeit.

Grund 2: Beim Reduzieren des Problems wirst du oft selbst die Lösung finden.

Egal. Mir sind mehrere potentielle Problemquellen aufgefallen, die du auf jeden Fall beseitigen solltest:

  1. Du vermischst Widgets aus AWT und Swing. Z.B. verwendest du ein Canvas. In Swing solltest du, wenn du eine Komponente brauchst, deren Oberfläche du selbst zeichnen willst, von JComponent oder JPanel ableiten und die Methode paintComponent() überschreiben.

  2. Du fängst eine InvokationTargetException an, lässt danach aber das Programm weiterlaufen. Damit befindet es sich in einem Zustand, den du vermutlich nicht eingeplant hast, was zu Folgefehlern führt. Anders gesagt: Dass dein Progamm nichts zeichnet, ist kein Wunder, wenn schon die init()-Methode auf die Schnauze fällt. :wink:

Wenn du dir mal in der API-Doku ansiehst, was das für eine Exception ist, kannst du dort lesen, dass es nur ein Wrapper für die eigentlich aufgetretene Exception ist, und dass du an diese per getCause rankommst. Wenn du also analysieren willst, was passiert ist, dann geht das z.B. so:

} catch (InvocationTargetException ex) {
Throwable cause = ex.getCause();
cause.printStackTrace();

Und dann bekomme ich als Ausgabe:

java.lang.IllegalArgumentException: Width (0) and height (0) cannot be dieses Graphics ist das Richtige.

D.h., wenn du möchtest, dass etwas auf der Oberfläche einer Komponente dargestellt wird, dann musst du die Methode paintComponent() der Komponente so überschreiben, dass dort das, was zu sehen sein soll, in ebem das Graphics gezeichnet wird, welches das System der Methode als Parameter übergibt.

Und wenn das Ganze dynamisch ablaufen soll, dann arbeitest du mit MVC, siehe http://feu.mpaap.de/bootcamp/MVC.pdf: Die Parameter deiner Zeichnerei, die sich mit der Zeit ändern, liegen im Model. Und auf dieses greift das View zu, wenn es sich neu zeichnen soll. Du kanst nun - gerne aus einem steuernden Thread - regelmäßig das Model ändern und dann repaint auf dem View aufrufen. Und schon läuft es. Ein lauffähiges und halbwegs sauber gebautes Beispiel für diese Vorgehensweise, das zufälig weitgehend dem entsprechen dürfte, was du vorhast, kann ich dir mailen, wenn du mir deine Mailadresse an mpaap äääht netcologne.de schickst.

Gruß,
Michael

Hallo,

das Lesen deines Codes ist sehr anstrengend. Selbst, wenn man ihn nach den Java Code Conventions (http://www.oracle.com/technetwork/java/codeconvtoc-1…) formatieren lässt, hast du Würmer ohne Ende. Kommentare, was du eigentlich erreichen willst, fehlen.

Reduziere deinen Code auf das Notwendige, dann debugge. Deine drei Elemente werden nicht zuverlässig angezeigt. Da musst du ansetzen.
Teste im Kleinen und ergänze dann. Anders wirst du keine funktionsfähigen Programme schreiben.

Hallo,

also ohne mich jetzt in deinen Code zu vertiefen und ganz allgemein zur Fehlersuche.
Du sagst in deine Methode draw wird kein String ausgegeben.

  1. Versuch was anderes zu zeichnen, zB eine Linie und wird die dann angezeigt? Vielleicht haut das mit repaint() nicht hin??
  2. Nachsehen mit konsolenausgabe ob im String überhaupt was drin steht. Kannst du einen anderen beliebigen String ausgeben?

Eine andere Möglichkeit ist den Code immer kleiner und schlanker zu machen. Also Teile weglassen (auskommentieren), und dann testen, ob Fehler noch da ist.

So, das erst mal als kleine Tips
Fehler suchen ist was Feines
Hugh ich habe gesprochen
Torsten

Hallo tobi,

ich habe das Programm mal debuggen lassen. Das Problem ist vermutlich, dass „graphic“ ein Nullzeiger ist, aber so sicher bin ich mir nicht. Für eine genaue Analyse hätte ich leider erst am nächsten Wochenende zeit. Hast du bereits Graphics.create() versucht?

http://docs.oracle.com/javase/1.4.2/docs/api/java/aw…

Viele Grüße

tincian

hi leute,

ich brauche hilfe bei einem applet für das sortierverfahren
bubblesort.

mein problem ist, dass ich nicht weiß was ich bei der ausgabe
(draw()-methode) falsch mache, diese gibt einfach nicht meinen
string (liste) aus…

hier mein quellcode, ide ist netbeans 7:

vllt gibt es jemanden, der mir dabei behilflich sein kann mein
problem zu beheben.

vielen dank schon mal,
tobi

ich beschäftige mich schon seitlängerem nicht mehr mit Java.
Empfehlenswert ist auf jedenfall ein Java Tutorial z.B.
http://www.gailer-net.de