Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Wolf registrierter User
Anmeldungsdatum: 23.08.2004 Beiträge: 16610
Wohnort: Zuhause
|
(#1356607) Verfasst am: 07.09.2009, 21:31 Titel: Java kompilieren |
|
|
Ich versuch gerade mal wieder mit Java zu arbeiten. Wie üblich scheiterts am Kompilieren.
Installiert habe ich JDK Update 16.
Bei den Umgebungsvariablen habe ich zu den Pfaden den Pfad zu javac hinzugefügt und die Konsole findet bei javac -version immerhin etwas.
Ich erinnere mich einmal einen sehr Javatextprogram gehabt zu haben mit den ich einfach komplimieren konnte, mittlerweile habe ich Notepad++, eclipse und Textpad 5 wo ich nicht mehr einfach komplimieren klicken konnte, sondern wenn überhaupt nur irgendwelche Befehle eingeben konnte von denen ich noch nicht den richtigen gefunden hab.
Über Konsole javac Dateiname.java bekomme ich eine Fehlermeldung(Datei nicht gefunden).
Ich hab den Pfad wo mein Testprogramm ist in Umgebungsvariablen Classnpath hinzugefügt.
Bringt auch nichts.
_________________ Trish:(
|
|
Nach oben |
|
 |
Spartacus Leto Ist hier raus!
Anmeldungsdatum: 27.08.2005 Beiträge: 5659
|
(#1356612) Verfasst am: 07.09.2009, 21:50 Titel: Re: Java kompilieren |
|
|
Wolf hat folgendes geschrieben: | Ich versuch gerade mal wieder mit Java zu arbeiten. Wie üblich scheiterts am Kompilieren.
Installiert habe ich JDK Update 16.
Bei den Umgebungsvariablen habe ich zu den Pfaden den Pfad zu javac hinzugefügt und die Konsole findet bei javac -version immerhin etwas.
Ich erinnere mich einmal einen sehr Javatextprogram gehabt zu haben mit den ich einfach komplimieren konnte, mittlerweile habe ich Notepad++, eclipse und Textpad 5 wo ich nicht mehr einfach komplimieren klicken konnte, sondern wenn überhaupt nur irgendwelche Befehle eingeben konnte von denen ich noch nicht den richtigen gefunden hab.
Über Konsole javac Dateiname.java bekomme ich eine Fehlermeldung(Datei nicht gefunden).
Ich hab den Pfad wo mein Testprogramm ist in Umgebungsvariablen Classnpath hinzugefügt.
Bringt auch nichts. |
Meinst du vielleicht das Programm?? Ist zwar primär für Schüler gedacht, aber durchaus brauchbar.
|
|
Nach oben |
|
 |
Wolf registrierter User
Anmeldungsdatum: 23.08.2004 Beiträge: 16610
Wohnort: Zuhause
|
(#1356619) Verfasst am: 07.09.2009, 22:03 Titel: |
|
|
Danke. Das kannte ich gar nicht.
Funktioniert ohne das ich irgendwas basteln musste. Super!
_________________ Trish:(
|
|
Nach oben |
|
 |
boomklever Impfgegnergegner
Anmeldungsdatum: 25.07.2006 Beiträge: 11112
Wohnort: Stuttgart
|
(#1356620) Verfasst am: 07.09.2009, 22:03 Titel: |
|
|
Seit dem JDK 1.2 muss der CLASSPATH ueberhaupt nicht mehr fuer die Standardklassen gesetzt werden, sondern nur noch fuer 3rd party classes. Wenn du also keine benutzerspezifischen Klassen einbinden musst, sollte alles out-of-the-box funktionieren. Wenn du weitere Klassen einbinden musst, legst du diese entweder in einer konsistenten Ordnerstruktur (z.B. unter /opt/java/classes) ab oder, wenn du sie später nicht wiederverwenden willst im CWD. Deinen $CLASSPATH setzt du dann auf das systemweite Klassenverzeichnis und auf das CWD:
Code: |
$ export CLASSPATH=$CLASSPATH:/opt/java/classes:.
|
bzw. fuegst denselben Eintrag deiner .bashrc (oder dem Äquivalent der von dir benutzten Shell) hinzu.
BTW: Welche Fehlermeldung gibt dir der Compiler denn genau zurueck? Du kompilierst dein Programm mit dem folgenden Befehl?
Und startest das Programm folgendermassen?
(ohne die extension)
_________________
Don't gift pearls before casting an octopus in a movie.
-- Cherry (ACNH)
|
|
Nach oben |
|
 |
gollrich superheftig general
Anmeldungsdatum: 06.12.2007 Beiträge: 1098
Wohnort: Mannheim
|
(#1356843) Verfasst am: 08.09.2009, 15:34 Titel: |
|
|
Gibts einen vernünfitigen Grund warum du nicht mit Eclipse NetBeans IDEA arbeitest ? ... reine Selbstgeißelung ? ...
Auch wenn es gerne immer wieder von alten Dozenten gepredigt wird, mit java und javac am anfang zu arbeiten... der Lerneffekt ist null und die Frustation einfach nur hoch....
Java entwickeln hat nix mit Syntax, Linking oder Compilieren zu tun... da für hat man ne IDE ,... der Rest ist immer noch genug Hirnschmalz....
|
|
Nach oben |
|
 |
Shadaik evolviert
Anmeldungsdatum: 17.07.2003 Beiträge: 26377
Wohnort: MG
|
(#1357338) Verfasst am: 09.09.2009, 16:25 Titel: |
|
|
gollrich hat folgendes geschrieben: | Gibts einen vernünfitigen Grund warum du nicht mit Eclipse NetBeans IDEA arbeitest ? ... reine Selbstgeißelung ? ...
Auch wenn es gerne immer wieder von alten Dozenten gepredigt wird, mit java und javac am anfang zu arbeiten... der Lerneffekt ist null und die Frustation einfach nur hoch....
Java entwickeln hat nix mit Syntax, Linking oder Compilieren zu tun... da für hat man ne IDE ,... der Rest ist immer noch genug Hirnschmalz.... | Zum Beispiel, wiel er nunmal für eine Plattform (beispielsweise diverse Mobiltelefone) entwickelt, auf der Java üblich ist?
_________________ Fische schwimmen nur in zwei Situationen mit dem Strom: Auf der Flucht und im Tode
|
|
Nach oben |
|
 |
gollrich superheftig general
Anmeldungsdatum: 06.12.2007 Beiträge: 1098
Wohnort: Mannheim
|
(#1357489) Verfasst am: 09.09.2009, 20:36 Titel: |
|
|
Shadaik hat folgendes geschrieben: | gollrich hat folgendes geschrieben: | Gibts einen vernünfitigen Grund warum du nicht mit Eclipse NetBeans IDEA arbeitest ? ... reine Selbstgeißelung ? ...
Auch wenn es gerne immer wieder von alten Dozenten gepredigt wird, mit java und javac am anfang zu arbeiten... der Lerneffekt ist null und die Frustation einfach nur hoch....
Java entwickeln hat nix mit Syntax, Linking oder Compilieren zu tun... da für hat man ne IDE ,... der Rest ist immer noch genug Hirnschmalz.... | Zum Beispiel, wiel er nunmal für eine Plattform (beispielsweise diverse Mobiltelefone) entwickelt, auf der Java üblich ist? |
Das geht mehr als nur ausgezeichnet mit Eclipse und der jeweiligen SDK des Mobiltelefonherstellers, bzw. J2MEPolish und Ant .... ...
java javac hab ich dabei noch nie benutzt ....
grüße gollrich
|
|
Nach oben |
|
 |
Wolf registrierter User
Anmeldungsdatum: 23.08.2004 Beiträge: 16610
Wohnort: Zuhause
|
(#1372791) Verfasst am: 05.10.2009, 21:40 Titel: |
|
|
Wie funktioniert das actionperformed in java?
Ein Button soll nach anklicken einen Wert auf falsch setzen.
Ich bekomme folgende Fehlermeldung:
Zitat: | local variable b is accessed from within inner class; needs to be declared final |
Wenns final ist kann ich den Wert erst recht nicht ändern.
_________________ Trish:(
|
|
Nach oben |
|
 |
Lukianos Oberzyniker
Anmeldungsdatum: 28.12.2008 Beiträge: 63
Wohnort: Dresden
|
(#1372826) Verfasst am: 05.10.2009, 23:04 Titel: |
|
|
Ohne ein wenig Code ist es schwer.
Ich versuchs mal:
Code: | AeussereKlasse.this.b = true; |
|
|
Nach oben |
|
 |
Wolf registrierter User
Anmeldungsdatum: 23.08.2004 Beiträge: 16610
Wohnort: Zuhause
|
(#1372964) Verfasst am: 06.10.2009, 08:31 Titel: |
|
|
Code: | public class Klasse extends JPanel
[...]diverse Methoden[...]
public void run(boolean bo){
while(bo){
[..]}
}
public static void main(string[] args){
Klasse meineKlasse= new Klasse();
boolean b=true;
meineKlasse.run(b);
final JButton stopper = new JButton("Stop");
stopper.addActionListener(new ActionListener(){
public void actionPerformed(actionevent e){
this.b=false;});
|
So findet er b nicht und selbst wenn habe ich meine Zweifel das es so funktioniert.
Meiner Empfindung nach gehört das ganze sowieso nicht in den static Teil doch, im anderen Teil bekommen ich Probleme überhaupt den ActionListener zu erzeugen.
Letzlich will ich die aufgerufene run-Methode manuell beenden.
_________________ Trish:(
|
|
Nach oben |
|
 |
Ragmaanir Fieser Necessitator
Anmeldungsdatum: 12.06.2005 Beiträge: 833
Wohnort: Hamburg
|
(#1373207) Verfasst am: 06.10.2009, 17:05 Titel: |
|
|
Wolf hat folgendes geschrieben: | Code: | public class Klasse extends JPanel
[...]diverse Methoden[...]
public void run(boolean bo){
while(bo){
[..]}
}
public static void main(string[] args){
Klasse meineKlasse= new Klasse();
boolean b=true;
meineKlasse.run(b);
final JButton stopper = new JButton("Stop");
stopper.addActionListener(new ActionListener(){
public void actionPerformed(actionevent e){
this.b=false;});
|
So findet er b nicht und selbst wenn habe ich meine Zweifel das es so funktioniert.
Meiner Empfindung nach gehört das ganze sowieso nicht in den static Teil doch, im anderen Teil bekommen ich Probleme überhaupt den ActionListener zu erzeugen.
Letzlich will ich die aufgerufene run-Methode manuell beenden. |
Code: |
public class Klasse extends JPanel
{
private JButton stopper = new JButton("Stop");
private boolean running = false;
[...]diverse Methoden[...]
public Klasse(){
stopper.addActionListener(new ActionListener()
{
public void actionPerformed(actionevent e){
stop();
}
});
}
public void stop(){
running = false;
}
public void run(){
running = true;
while(running){
[..]
}
}
public static void main(string[] args)
{
Klasse meineKlasse = new Klasse();
meineKlasse.run();
}
}
|
Du musst die while-Schleife aber eventuell in einem eigenen Thread ausführen damit die GUi nicht eingefroren wird. Was willst du in der while Schleife überhaupt machen? Ich nehme mal an dass es eine Berechnung ist oder so die man per Stop Button beenden können soll. Es fehlt glaube ich auch noch n JFrame in dem das Panel angezeigt werden soll.
_________________ Dieser Post enthält die unumstößliche, objektive Wahrheit.
|
|
Nach oben |
|
 |
Wolf registrierter User
Anmeldungsdatum: 23.08.2004 Beiträge: 16610
Wohnort: Zuhause
|
(#1373255) Verfasst am: 06.10.2009, 18:34 Titel: |
|
|
Danke. Jetzt wo's im Konstrukter steht funktionierts.
Wenn ich dannach erneut run aufrufe stürzt das Progrämmchen ab
_________________ Trish:(
|
|
Nach oben |
|
 |
Ragmaanir Fieser Necessitator
Anmeldungsdatum: 12.06.2005 Beiträge: 833
Wohnort: Hamburg
|
(#1373264) Verfasst am: 06.10.2009, 18:54 Titel: |
|
|
Wolf hat folgendes geschrieben: | Danke. Jetzt wo's im Konstrukter steht funktionierts.
Wenn ich dannach erneut run aufrufe stürzt das Progrämmchen ab |
Exception (welche?) oder bleibt es hängen (eingefrorenes GUI)? Und was meinst du mit "funktionierts"? Heißt das, dass die while-Schleife einmal korrekt ausgeführt wird?
_________________ Dieser Post enthält die unumstößliche, objektive Wahrheit.
|
|
Nach oben |
|
 |
Wolf registrierter User
Anmeldungsdatum: 23.08.2004 Beiträge: 16610
Wohnort: Zuhause
|
(#1373265) Verfasst am: 06.10.2009, 18:59 Titel: |
|
|
Ragmaanir hat folgendes geschrieben: | Wolf hat folgendes geschrieben: | Danke. Jetzt wo's im Konstrukter steht funktionierts.
Wenn ich dannach erneut run aufrufe stürzt das Progrämmchen ab |
Exception (welche?) oder bleibt es hängen (eingefrorenes GUI)?
| Es friert ein.
Und was meinst du mit "funktionierts"? Heißt das, dass die while-Schleife einmal korrekt ausgeführt wird? [/quote]Die while Schleife wird solange ausgeführt bis ich auf den Stop-Button klicke.
Desweiteren kann ich paint nicht in action performed aufrufen(Ganz bewusst nicht repaint.) Liegt evtl daran das ich nicht genau weiß was ich in die Klammern der Paintmethode schreiben soll.
Bekomme folgende Fehlermeldung vom compiler: Code: |
invalid method declaration; return type required
actionPerformed(action e){
|
Danke für die Hilfe.
_________________ Trish:(
|
|
Nach oben |
|
 |
Ragmaanir Fieser Necessitator
Anmeldungsdatum: 12.06.2005 Beiträge: 833
Wohnort: Hamburg
|
(#1373268) Verfasst am: 06.10.2009, 19:10 Titel: |
|
|
Wolf hat folgendes geschrieben: | Ragmaanir hat folgendes geschrieben: | Wolf hat folgendes geschrieben: | Danke. Jetzt wo's im Konstrukter steht funktionierts.
Wenn ich dannach erneut run aufrufe stürzt das Progrämmchen ab |
Exception (welche?) oder bleibt es hängen (eingefrorenes GUI)?
| Es friert ein.
|
D.h.: Wenn du das erste mal die run methode startest (zB per button), dann läuft sie bis du auf stop klickst. Wenn du dann nochmal die run methode startest, dann friert es ein. Hab ich das richtig verstanden? Zeig da am besten mal den Code (Konstruktoren der Klassen + code der bei button klicks ausgeführt wird).
Zitat: |
Desweiteren kann ich paint nicht in action performed aufrufen(Ganz bewusst nicht repaint.) Liegt evtl daran das ich nicht genau weiß was ich in die Klammern der Paintmethode schreiben soll.
Bekomme folgende Fehlermeldung vom compiler: Code: |
invalid method declaration; return type required
actionPerformed(action e){
|
|
Hm, das sieht eher so aus als hättest du bei actionPerformed den Rückgabetyp nicht angegeben:
Code: | public void actionPerformed(action e){ |
Ansonsten zeig mal mehr code, ist sonst schwer einzuschätzen wo die Fehler liegen.
Zitat: | Danke für die Hilfe. |
Kein Problem
_________________ Dieser Post enthält die unumstößliche, objektive Wahrheit.
|
|
Nach oben |
|
 |
Wolf registrierter User
Anmeldungsdatum: 23.08.2004 Beiträge: 16610
Wohnort: Zuhause
|
(#1373272) Verfasst am: 06.10.2009, 19:17 Titel: |
|
|
Ragmaanir hat folgendes geschrieben: | D.h.: Wenn du das erste mal die run methode startest (zB per button), dann läuft sie bis du auf stop klickst. Wenn du dann nochmal die run methode startest, dann friert es ein. Hab ich das richtig verstanden? Zeig da am besten mal den Code (Konstruktoren der Klassen + code der bei button klicks ausgeführt wird).
| Die run-Methode wird automatisch gestartet.
static main[...]
Klasse meineKlasse = new Klasse();
meineKlasse.run();
Im Button stand eigentlich nur: running = true, run(); return;
Der Button war im Konstruktur der Klasse eingebaut.
Zitat: |
Desweiteren kann ich paint nicht in action performed aufrufen(Ganz bewusst nicht repaint.) Liegt evtl daran das ich nicht genau weiß was ich in die Klammern der Paintmethode schreiben soll.
Bekomme folgende Fehlermeldung vom compiler: Code: |
invalid method declaration; return type required
actionPerformed(action e){
|
|
Hm, das sieht eher so aus als hättest du bei actionPerformed den Rückgabetyp nicht angegeben:
[/quote]Wie mache ich das?
Ich will das neu gezeichnet wird, aber nicht mit repaint, sondern mit paint, da ein paar alte Dinge gelöscht werden sollten.
_________________ Trish:(
|
|
Nach oben |
|
 |
Ragmaanir Fieser Necessitator
Anmeldungsdatum: 12.06.2005 Beiträge: 833
Wohnort: Hamburg
|
(#1373291) Verfasst am: 06.10.2009, 19:49 Titel: |
|
|
Wolf hat folgendes geschrieben: |
Zitat: |
Zitat: |
Desweiteren kann ich paint nicht in action performed aufrufen(Ganz bewusst nicht repaint.) Liegt evtl daran das ich nicht genau weiß was ich in die Klammern der Paintmethode schreiben soll.
Bekomme folgende Fehlermeldung vom compiler: Code: |
invalid method declaration; return type required
actionPerformed(action e){
|
|
Hm, das sieht eher so aus als hättest du bei actionPerformed den Rückgabetyp nicht angegeben:
| Wie mache ich das?
Ich will das neu gezeichnet wird, aber nicht mit repaint, sondern mit paint, da ein paar alte Dinge gelöscht werden sollten. |
Poste mal den Code (+5 Zeilen außenrum) wo der Compiler meckert.
_________________ Dieser Post enthält die unumstößliche, objektive Wahrheit.
|
|
Nach oben |
|
 |
Wolf registrierter User
Anmeldungsdatum: 23.08.2004 Beiträge: 16610
Wohnort: Zuhause
|
(#1373354) Verfasst am: 06.10.2009, 21:18 Titel: |
|
|
Code: | ActionListener al2=new ActionListener(){
actionPerformed(action e){
paint();
}
}; |
_________________ Trish:(
|
|
Nach oben |
|
 |
gollrich superheftig general
Anmeldungsdatum: 06.12.2007 Beiträge: 1098
Wohnort: Mannheim
|
(#1373360) Verfasst am: 06.10.2009, 21:23 Titel: |
|
|
... vlt hilft es ja ...
grüße gollrich
Code: | import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Klasse extends JPanel {
private static final long serialVersionUID = 1L;
private static final Logger LOGGER = Logger.getLogger("Klassen Logger");
private final static String STOP_LABEL = "Stop";
private JButton stopper = new JButton(STOP_LABEL);
private boolean running = false;
public Klasse() {
this.add(stopper);
MyButtonListener buttonListener = new MyButtonListener();
stopper.addActionListener(buttonListener);
}
public void stop() {
if(running){
LOGGER.info("stop");
running = false;
}
}
public void run() {
LOGGER.info("run");
running = true;
while (running) {
// Do something...
LOGGER.info("blub");
}
}
public static void main(String[] args) {
Klasse meineKlasse = new Klasse();
JFrame jframe = new JFrame();
jframe.add(meineKlasse);
jframe.setTitle("Title");
jframe.setSize(200, 150);
jframe.setVisible(true);
meineKlasse.run();
System.exit(0);
}
class MyButtonListener implements ActionListener {
MyButtonListener() {
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals(STOP_LABEL)) {
LOGGER.info("actionPerformed");
stop();
}
}
}
}
|
|
|
Nach oben |
|
 |
Ragmaanir Fieser Necessitator
Anmeldungsdatum: 12.06.2005 Beiträge: 833
Wohnort: Hamburg
|
(#1373368) Verfasst am: 06.10.2009, 21:30 Titel: |
|
|
Wolf hat folgendes geschrieben: | Code: | ActionListener al2=new ActionListener(){
actionPerformed(action e){
paint();
}
}; | |
Vor actionPerformed fehlt: "public void"
Also:
Code: | ActionListener al2=new ActionListener(){
public void actionPerformed(action e){
paint();
}
}; |
_________________ Dieser Post enthält die unumstößliche, objektive Wahrheit.
|
|
Nach oben |
|
 |
Wolf registrierter User
Anmeldungsdatum: 23.08.2004 Beiträge: 16610
Wohnort: Zuhause
|
(#1373382) Verfasst am: 06.10.2009, 21:40 Titel: |
|
|
Danke.
Bei paint fehlt noch der richtige Parameter.
In der ursprünglichen Methode steht paint(Graphics g). Diese Methode wird auf mir mysteriöse Weise automatisch aufgerufen. (Vlt von JFrame?).
Ich habe aber keine Ahnung was ich jetzt reinschreiben muss, nichts scheint zu funktionieren.
_________________ Trish:(
|
|
Nach oben |
|
 |
Ragmaanir Fieser Necessitator
Anmeldungsdatum: 12.06.2005 Beiträge: 833
Wohnort: Hamburg
|
(#1373387) Verfasst am: 06.10.2009, 21:44 Titel: |
|
|
Wolf hat folgendes geschrieben: | Danke.
Bei paint fehlt noch der richtige Parameter.
In der ursprünglichen Methode steht paint(Graphics g). Diese Methode wird auf mir mysteriöse Weise automatisch aufgerufen. (Vlt von JFrame?).
Ich habe aber keine Ahnung was ich jetzt reinschreiben muss, nichts scheint zu funktionieren. |
Ja, ich meine paint wird intern aufgerufen. Paint kann man auch überschreiben. Versuch es eventuell mal mit invalidate(). Wenn ich mich recht erinnere sagt das der GUI quasi: Bitte neuzeichnen. Dann wird paint getriggert. Java und Java GUIs sind bei mir aber schon etwas her so dass ich die API nicht mehr ganz im Kopf habe.
_________________ Dieser Post enthält die unumstößliche, objektive Wahrheit.
|
|
Nach oben |
|
 |
Wolf registrierter User
Anmeldungsdatum: 23.08.2004 Beiträge: 16610
Wohnort: Zuhause
|
(#1373412) Verfasst am: 06.10.2009, 22:08 Titel: |
|
|
Ragmaanir hat folgendes geschrieben: | Versuch es eventuell mal mit invalidate().
| Hat leider keinen Effekt. Ändere ich manuell die Größe des Fensters, wird meines Wissens ja erneut auf Paint zugegriffen, dann habe ich jedenfalls den gewünschten Effekt.
_________________ Trish:(
|
|
Nach oben |
|
 |
Wolf registrierter User
Anmeldungsdatum: 23.08.2004 Beiträge: 16610
Wohnort: Zuhause
|
(#1373426) Verfasst am: 06.10.2009, 22:25 Titel: |
|
|
Wolf hat folgendes geschrieben: | Ragmaanir hat folgendes geschrieben: | Versuch es eventuell mal mit invalidate().
| Hat leider keinen Effekt. Ändere ich manuell die Größe des Fensters, wird meines Wissens ja erneut auf Paint zugegriffen, dann habe ich jedenfalls den gewünschten Effekt. |
Ich hab jetzt eine Möglichkeit gefunden auf paint zuzugreifen. Allerdings hat es quasi den selben Effekt wie repaint, vergangenes wird nicht gelöscht. Ich würde gerne das alles löschen und neu zeichnen.
_________________ Trish:(
|
|
Nach oben |
|
 |
Ragmaanir Fieser Necessitator
Anmeldungsdatum: 12.06.2005 Beiträge: 833
Wohnort: Hamburg
|
(#1373464) Verfasst am: 07.10.2009, 00:35 Titel: |
|
|
Wolf hat folgendes geschrieben: | Wolf hat folgendes geschrieben: | Ragmaanir hat folgendes geschrieben: | Versuch es eventuell mal mit invalidate().
| Hat leider keinen Effekt. Ändere ich manuell die Größe des Fensters, wird meines Wissens ja erneut auf Paint zugegriffen, dann habe ich jedenfalls den gewünschten Effekt. |
Ich hab jetzt eine Möglichkeit gefunden auf paint zuzugreifen. Allerdings hat es quasi den selben Effekt wie repaint, vergangenes wird nicht gelöscht. Ich würde gerne das alles löschen und neu zeichnen. |
Hm, was genau zeichnest du da eigentlich? Zeichnest du "per Hand"? Also hast du die paint methode überschrieben oder so? Ich weiß leider nicht wie man das neuzeichnen triggert . Wenn du per Hand zeichnest könntest du auf dem Graphics Object fillRect bzw clearRect aufrufen um den gesamten Zeichenbereich des Panels mit der Hintergrundfarbe zu füllen.
_________________ Dieser Post enthält die unumstößliche, objektive Wahrheit.
|
|
Nach oben |
|
 |
Wolf registrierter User
Anmeldungsdatum: 23.08.2004 Beiträge: 16610
Wohnort: Zuhause
|
(#1373618) Verfasst am: 07.10.2009, 13:25 Titel: |
|
|
Ragmaanir hat folgendes geschrieben: | Hm, was genau zeichnest du da eigentlich? Zeichnest du "per Hand"? | Wenn ich dich richtig verstehe. Nein. Es wird nach gewissen Regeln und etwas Zufall gezeichnet. Zitat: |
Also hast du die paint methode überschrieben oder so? Ich weiß leider nicht wie man das neuzeichnen triggert . Wenn du per Hand zeichnest könntest du auf dem Graphics Object fillRect bzw clearRect aufrufen um den gesamten Zeichenbereich des Panels mit der Hintergrundfarbe zu füllen. |
Ich könnte mit ner Schleife sicher den ganzen Bereich so löschen. Ist aber vermutlich sehr ineffizent.
Oder ich mache ein Riesen- Rechteck. Mal testen.
Hmm. Das funktioniert fast. Wenn run() nicht läuft(ruft ständig repaint auf) funktionierts nicht.
Desweiteren stürzt bei jedem Versuch run() über einen Button aufzurufen ab. run() greift auf ein paar Methoden zu. Sollten die in den Konstruktor?
Edit: Das Bildschirm löschen, habe ich jetzt in paint drinnen und funktioniert gut. Nur erzeugt clearRect() einen weißen Hintergrund und nicht den standart-Hintergrund(so blaugrau).
Das run() nicht über einen Button aufgerufen werden kann nervt echt.
_________________ Trish:(
|
|
Nach oben |
|
 |
Ragmaanir Fieser Necessitator
Anmeldungsdatum: 12.06.2005 Beiträge: 833
Wohnort: Hamburg
|
(#1373653) Verfasst am: 07.10.2009, 14:32 Titel: |
|
|
Wolf hat folgendes geschrieben: | Ragmaanir hat folgendes geschrieben: | Hm, was genau zeichnest du da eigentlich? Zeichnest du "per Hand"? | Wenn ich dich richtig verstehe. Nein. Es wird nach gewissen Regeln und etwas Zufall gezeichnet. Zitat: |
Also hast du die paint methode überschrieben oder so? Ich weiß leider nicht wie man das neuzeichnen triggert . Wenn du per Hand zeichnest könntest du auf dem Graphics Object fillRect bzw clearRect aufrufen um den gesamten Zeichenbereich des Panels mit der Hintergrundfarbe zu füllen. |
Ich könnte mit ner Schleife sicher den ganzen Bereich so löschen. Ist aber vermutlich sehr ineffizent.
Oder ich mache ein Riesen- Rechteck. Mal testen.
|
Nimm clearRect und übergib den gesamten Panel-Bereich, dann sollte das gesamte Panel mit der Hintergrundfarbe überschrieben werden.
Zitat: |
Hmm. Das funktioniert fast. Wenn run() nicht läuft(ruft ständig repaint auf) funktionierts nicht.
Desweiteren stürzt bei jedem Versuch run() über einen Button aufzurufen ab. run() greift auf ein paar Methoden zu. Sollten die in den Konstruktor?
|
Post mal code (besser zu viel als zu wenig: run, constructor, actionlistener, ...). Wahrscheinlich ist irgendwo eine endlosrekursion versteckt.
Edit: Benutzt du Graphics oder Graphics2D zum Zeichnen? Bei Graphics2D kannst du mit setBackground die Hintegrundfarbe setzen.
_________________ Dieser Post enthält die unumstößliche, objektive Wahrheit.
|
|
Nach oben |
|
 |
Wolf registrierter User
Anmeldungsdatum: 23.08.2004 Beiträge: 16610
Wohnort: Zuhause
|
(#1373668) Verfasst am: 07.10.2009, 14:41 Titel: |
|
|
Ragmaanir hat folgendes geschrieben: | Wolf hat folgendes geschrieben: | Ragmaanir hat folgendes geschrieben: | Hm, was genau zeichnest du da eigentlich? Zeichnest du "per Hand"? | Wenn ich dich richtig verstehe. Nein. Es wird nach gewissen Regeln und etwas Zufall gezeichnet. Zitat: |
Also hast du die paint methode überschrieben oder so? Ich weiß leider nicht wie man das neuzeichnen triggert . Wenn du per Hand zeichnest könntest du auf dem Graphics Object fillRect bzw clearRect aufrufen um den gesamten Zeichenbereich des Panels mit der Hintergrundfarbe zu füllen. |
Ich könnte mit ner Schleife sicher den ganzen Bereich so löschen. Ist aber vermutlich sehr ineffizent.
Oder ich mache ein Riesen- Rechteck. Mal testen.
|
Nimm clearRect und übergib den gesamten Panel-Bereich, dann sollte das gesamte Panel mit der Hintergrundfarbe überschrieben werden. | Habe ich anders gelöst Zitat: |
Zitat: |
Hmm. Das funktioniert fast. Wenn run() nicht läuft(ruft ständig repaint auf) funktionierts nicht.
Desweiteren stürzt bei jedem Versuch run() über einen Button aufzurufen ab. run() greift auf ein paar Methoden zu. Sollten die in den Konstruktor?
|
Post mal code (besser zu viel als zu wenig: run, constructor, actionlistener, ...). Wahrscheinlich ist irgendwo eine endlosrekursion versteckt | Du bekommst eine PM.
_________________ Trish:(
|
|
Nach oben |
|
 |
Ragmaanir Fieser Necessitator
Anmeldungsdatum: 12.06.2005 Beiträge: 833
Wohnort: Hamburg
|
(#1373769) Verfasst am: 07.10.2009, 16:13 Titel: |
|
|
Ok, also der Fehler ist, dass du in der run-methode eine Endlosschleife hast. Am Ender der static void main ist das nicht schlimm, aber wenn du eine Endlosschleife in einem ActionListener aufrufst, dann wird die Kontrolle nicht mehr an die GUI zurückgegeben. Eigentlich sollten ActionListener nur kurze Aktionen enthalten. Wenn ein längerer Prozess ablaufen soll, so kann man das über einen separaten Thread lösen.
Hier ein Beispiel (sollte direkt funktioniere, tuts bei mir jedenfalls):
Code: |
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
public class GuiTest {
private JButton startButton = new JButton("start");
private JButton stopButton = new JButton("stop");
private JFrame frame = new JFrame();
private Thread simulator = null;
private boolean running = false;
public GuiTest(){
buildUI();
}
protected void buildUI()
{
startButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//while(true); // <-- diese Anweisung würde die GUI einfrieren
startButton.setEnabled(false);
startSimulation();
}
});
stopButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
running = false;
}
});
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(startButton);
frame.getContentPane().add(stopButton);
frame.setSize( 200, 100);
}
public void show(){
frame.setVisible( true );
}
protected void startSimulation(){
if(running) return;
running = true;
simulator = new Thread(){
public void run(){
stopButton.setEnabled(true);
while(running){
System.out.println("calculation"); // do calculations
try{sleep(1000);}catch(Exception e){}
}
startButton.setEnabled(true);
stopButton.setEnabled(false);
}
};
simulator.start();
}
public static void main (String args[]) {
GuiTest gui_test = new GuiTest();
gui_test.show();
}
}
|
buildUI: Registriere ActionListener bei den Buttons, füge Buttons zum Frame hinzu, setze größe vom Frame, etc
startSimulation:
Hier wird ein neuer Thread erzeugt.
Code: |
Thread t = new Thread(){
public void run(){ [...] }
}
|
erzeugt eine anonyme Klasse (eine Klasse die keinen Namen hat, weil sie sowieso nur einmal verwendet wird. Man spart sich damit das Anlegen einer extra Klasse die sowieso nur ein 3-Zeiler ist. Außerdem kann man member-variablen und methoden der einschließenden Klasse referenzieren). Das ist ungefähr das gleiche wie dies:
Code: |
class MyThreadWithAName extends Thread{
public void run(){ [...] }
}
[...]
Thread t = new MyThreadWithAName();
|
(Dasselbe prinzip habe ich oben bei den ActionListenern verwendet: Anstelle für jeden ActionListener eine eigene Klasse anzulegen, wird einfach eine Anonyme Klasse erzeugt)
Mit t.start(); wird der Thread gestartet, so dass er paralell zum GUI Thread läuft. Die Kontrolle wird dann, nachdem der Thread erzeugt wurde, wieder an die GUI zurückgegeben, so dass die GUI weiter Nachrichten (Button-Clicks, resize, repaint, etc) verarbeiten kann. Deswegen funktioniert dann der stop-Button auch. Wenn der stop-Button gedrückt wird, wird running auf false gesetzt. Der Thread der im Hintegrund läuft und deine simulation/berechnung macht, bemerkt, dass running jetzt false ist und beendet sich (indem die run-method das Ende erreicht).
_________________ Dieser Post enthält die unumstößliche, objektive Wahrheit.
|
|
Nach oben |
|
 |
Wolf registrierter User
Anmeldungsdatum: 23.08.2004 Beiträge: 16610
Wohnort: Zuhause
|
(#1373872) Verfasst am: 07.10.2009, 18:30 Titel: |
|
|
Danke hat mir sehr geholfen.
So jetzt muss ich erstmal für Ordnung sorgen.
_________________ Trish:(
|
|
Nach oben |
|
 |
|