Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
folgende Problemstellung:
ich habe ein JNumberField (lässt sich auch mit Textfield etc umtauschen falls nötig) und muss dort halt mehrere Zahlen eingeben können, das problem liegt darin, dass ich es nicht hinkriege durch ENTER die Zahlen in ein Array zu schreiben sondern nur durch einen Button, deshalb würde ich gerne eine lange Zahl eingeben können und diese durch Sonderzeichen (z.b. ";") trennen.
Wenn jemand mein Problem versteht hoffe ich auf schnelle Antwort
Ich benutze JavaEditor zum Programmieren und da gibt es halt ein JNumberField welches man nutzen kann, aber wie gesagt kann ich dieses gerne austauschen.
Ich bin mir ziemlich sicher, dass Enter die schönere Lösung wäre nur leider bin ich daran verzweifelt das einzubauen, für Tipps & Links wäre ich sehr dankbar.
Ich übernehme diesen Code jetzt einfach mal und mache anstatt mein Numberfield jetzt ein JTextField rein, ist glaub ich allgemein besser verständlich.
Aber kann mir irgendjemand erklären WARUM
Code:
if(e.getSource().equals(myJNumberField)) {
den Tastendruck Enter abfängt? Wäre schon ganz praktisch zu wissen.
und jetzt gerade habe ich ein Problem mit dem speichern im Array entdeckt...
Java:
int n;
int[] a = new int[n]; //Array mit Daten
public void zahleneingabe_ActionPerformed(ActionEvent evt) {
if(evt.getSource().equals(zahleneingabe)){
n++;
a.getInt(zahleneingabe,n);
}
}
Wenn ich dabei auf kompilieren gehe wird mir immer folgender Fehler ausgespuckt:
Quicksort.java:109:11: cannot find symbol
symbol : method getInt(javax.swing.JTextField,int)
location: class int[]
a.getInt(zahleneingabe,n);
^
1 error
Und das obwohl laut API-Docs es für Arrays doch eigtl solch einen befehl gibt.
Nein für Arrays gibt es diese Methode nicht, verlink mal bitte diese API docs in der das angeblich steht, die würd ich gerne sehen:lol:. Auf Arrays kannst du gar keine Methode anwenden.
Der gewollte Link, wahrscheinlich auch ein Verständnissfehler, ich bin nicht so gelernt im API-docs lesen. Array (Java Platform SE 6)
Die Sache mit den [] Klammern weiß ich bereits, da wird der Index angegeben etc. nur wie setze ich dann ein, dass der Inhalt des JTextFields eingeschrieben wird?
Code:
a[n] = zahleneingabe.getText();
Würde mir jetzt Spontan einfallen aber das funktioniert ja nur bei String.
Die Idee mit dem String in Int umschreiben is gut und gleich durchgeführt!
Nur funktioniert die Enter funktion nicht.
Zum Test habe ich ans Ende noch geschrieben das mein JTextField gesäubert werden muss um zu sehen falls er es annimmt.
Java:
public void zahleneingabe_ActionPerformed(ActionEvent evt) {
if(evt.getSource().equals(zahleneingabe)){
String zwischen;
int t = 0;
zwischen = zahleneingabe.getText();
t = Integer.parseInt (zwischen);
n++;
a[n] = t;
zahleneingabe.setText("");
}
}
Also der Compiler gibt mir immerhin keine Errors
Falls es hilft kriege ich beim druck auf Enter auch noch ne ganze Stange an Errormeldungen:
Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException: 22
at Quicksort.zahleneingabe_ActionPerformed(Quicksort.java:118)
at Quicksort$2.actionPerformed(Quicksort.java:64)
at javax.swing.JTextField.fireActionPerformed(JTextField.java:492)
at javax.swing.JTextField.postActionEvent(JTextField.java:705)
at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:820)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1639)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2851)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2886)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2814)
at java.awt.Component.processEvent(Component.java:6066)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4652)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4482)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
at java.awt.Component.dispatchEventImpl(Component.java:4524)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4482)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644)
at java.awt.EventQueue.access$000(EventQueue.java:85)
at java.awt.EventQueue$1.run(EventQueue.java:603)
at java.awt.EventQueue$1.run(EventQueue.java:601)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:617)
at java.awt.EventQueue$2.run(EventQueue.java:615)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:614)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Wenn ich mich nicht total vertue muss doch zum Zeitpunkt der Arrayinitialisierung bereits die Größe feststehen (n braucht also bereits einen Wert != null). Und da man vor der Usereingabe meistens nicht weiß wie viele Werte kommen werden (und wenn ich den TO richtig verstanden habe steht hier auch vorher nicht fest wie viele Werte kommen werden) ist ein Array wohl nicht das Richtige.
Ich würde da eher zu ArrayList tendieren. Die kann man nämlich immer weiter vergrößern.
Grüße,
Andy
P.S.: Kann auch sein, dass ich nur BS geschrieben habe da ich mich gerade nach langer Abstinenz wieder in Java rein arbeite.
Nunja ich dachte das man ein Array nachträglich erhöhen & initialisieren kann Tutorial / Java Grundlagen / Arrays hatte mir da die Idee dazu gegeben.
Auf Arraylist kann ich natürlich umsteigen aber mit denen hatte ich schonmal zu tun und ich erinnere mich dunkel an eine schlimme quälerei weshalb ich nur mit einer Array arbeiten wollte.
Finde ArrayList eigentlich ganz praktisch. Und mehr als folgende Befehle wirst Du für Dein Problem wahrscheinlich nicht brauchen.
Java:
// Importiert den nötigen Kram
import java.util.ArrayList;
// Erstellt eine neue ArrayList mit dem Namen liste und der Größe 3. Sie soll den Datentyp int speichern können. Wobei das wohl optional ist.
private ArrayList<int> liste = new ArrayList<int>(3);
// Pappt ein weiteres Element mit dem Wert 5 an die Liste
liste.add(5);
// Speichert den Wert des 3 (Auch bei ArrayLists beginnt der Index bei 0). Elements in test.
int test = liste.get(2);
// Sorgt dafür, dass genügend Platz für 5 Elemente vorhanden ist
liste.ensureCapacity(5);
Ich habe jetzt soweit alles umgebaut das ich mit Arraylist anstatt Array arbeiten kann doch haben sich wie erwartet Probleme aufgetan.
Ich sage mal was mein Oberthema war, nämlich Quicksort!
und darin muss ich ein paar Vergleiche u.Ä. anstellen doch er spuckt mir da nur Errors aus.
Java:
Quicksort.java:71:10: size has private access in java.util.ArrayList
n = a.size;
^
Quicksort.java:76:16: incompatible types
found : java.lang.Object
required: int
int t = a.get(i);
^
Quicksort.java:77:8: unexpected type
required: variable
found : value
a.get(i) = a.get(j);
^
Quicksort.java:78:8: unexpected type
required: variable
found : value
a.get(j) = t;
^
Quicksort.java:85:16: incompatible types
found : java.lang.Object
required: int
pivot = a.get((low+high)/2);
^
Quicksort.java:88:20: operator < cannot be applied to java.lang.Object,int
while(a.get(i) < pivot) i++;
^
Quicksort.java:89:20: operator < cannot be applied to java.lang.Object,int
while(a.get(j) < pivot) j--;
^
Quicksort.java:90:17: operator >= cannot be applied to java.lang.Object,java.lang.Object
if(a.get(i) >= a.get(j)){
^
Quicksort.java:108:15: unexpected type
required: variable
found : value
a.get(n) = t;
^
9 errors
Das waren die Errors, jetzt kommt der Code wo die Fehler hauptsächlich auftreten:
Java:
public void tauschen(){ // Methode zum Werte austauschen
int t = a.get(i);
a.get(i) = a.get(j);
a.get(j) = t;
}
public void quicksort(int low,int high){ // Methode zum Sortieren der Daten
i = low;
j = high;
pivot = a.get((low+high)/2);
while(i<=j){
while(a.get(i) < pivot) i++;
while(a.get(j) < pivot) j--;
if(a.get(i) >= a.get(j)){
tauschen();
i++;
j--;
}
}
}
[c]a.get(i)=a.get(j);[/c]
nein. Mit a.get(int) bekommst du einen wert/ein Objekt zurück. Du kannst darüber keinen Eintrag in der Liste manipulieren. Schau dir mal set an.
zu deinem zweiten Fehler:
du hast wohl die ArrayList so initalisiert:
Java:
ArrayList liste=new ArrayList(); // damit lässt sich die Exception reproduzieren
Ich bedanke mich Tomate Salat somit wäre das Vertauschen schonmal erledigt =)
Nur bleibt das Problem mit dem Vergleichen immernoch offen ohne einen Vergleich läuft die gesamte Sortierung nicht.
@Crian: Einen Link oder Beispiel für vernünftiges Einrücken liefern wäre auch hilfreich. Und ein KSKB kann ich in diesem Stadium nur sehr schwer liefern.
Mit was für einem Editor arbeitest du? Die gängigsten (Eclipse, NetBeans, ...) haben Formatter eingebaut, die alles gemäss deinen Wünschen formatieren.
Es kann sein, dass es gemäß irgendetwas formatiert wird weshalb ich mich auch über eine beschwerrde wundere.
Immerhin jage ich den Code nicht ohne Abstände und ganz ohne Einrücken hier rein, im vergleich zu sowas ist es doch lesbar -.-
public class Quicksort extends Applet {
// Anfang Attribute
//Graphische Attribute
private JTextField zahleneingabe = new JTextField();
private Checkbox kleiner_als = new Checkbox();
private Label infotext = new Label();
private JButton sort = new JButton();
// Ende Graphische Attribute
// Variablen
int pivot; //Trennelement
int i; //Linker Punkt
int j; //Rechter Punkt
int n; //Länge des Arrays
ArrayList a = new ArrayList(); //Array mit Daten
// Ende Variablen
// Ende Attribute
public void init() {
Panel cp = new Panel(null);
cp.setBounds(0, 0, 306, 458);
add(cp);
// Anfang Komponenten
infotext.setBounds(0, 144, 280, 32);
infotext.setText("Standartoption: von groß nach klein sortieren");
infotext.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
cp.add(infotext);
sort.setBounds(88, 104, 75, 25);
sort.setText("Sortieren");
sort.setMargin(new Insets(2, 2, 2, 2));
sort.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
sort_ActionPerformed(evt);
}
});
cp.add(sort);
zahleneingabe.setBounds(0, 32, 289, 24);
zahleneingabe.setText("");
zahleneingabe.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
zahleneingabe_ActionPerformed(evt);
}
});
cp.add(zahleneingabe);
// Ende Komponenten
}
// Anfang Methoden
//Buttonmethode
public void sort_ActionPerformed(ActionEvent evt) {
// TODO hier Quelltext einfügen
n = a.size;
quicksort(0,n-1);
}
//Selbstgebaute/Interne Methoden
public void tauschen(){ // Methode zum Werte austauschen
a.set(i,j);
}
public void quicksort(int low,int high){ // Methode zum Sortieren der Daten
i = low;
j = high;
pivot = a.get((low+high)/2);
while(i<=j){
while(a.get(i) < pivot) i++;
while(a.get(j) < pivot) j--;
if(a.get(i) >= a.get(j)){
tauschen();
i++;
j--;
}
}
}
public void zahleneingabe_ActionPerformed(ActionEvent evt) {
if(evt.getSource().equals(zahleneingabe)){
String zwischen;
int t = 0;
zwischen = zahleneingabe.getText();
try {
t = Integer.parseInt (zwischen);
} catch (Exception E){
//es war keine Zahl
}
n++;
a.get(n) = t;
zahleneingabe.setText("");
}
}
// Ende Methoden
}
[/code]
Wie gewünscht, hoffentlich ist der Code nicht ZU schrecklich....
Erst einmal: http://www.java-forum.org/bilder-gui-damit-zusammenhaengt/4650-awt-swing-mischen.html
---
[java=29] ArrayList a = new ArrayList(); //Array mit Daten[/code]
Ich habe doch schon geschrieben, dass das "falsch" ist, schreibe hier:
[java=29] ArrayList<Integer> a = new ArrayList<Integer>(); //Array mit Daten[/code]
dann sollte es mit dem Vergleichen funktionieren (außer ich habe was auf die schnelle übersehen)
Anmerkung:
[java=29] ArrayList a = new ArrayList();[/code]
hier steht eigent.:
[java=29] ArrayList<Object> a = new ArrayList<Object>();[/code]
dieses [c]Object[/c] definiert, welche Typen in der Liste gespeichert werden sollen/dürfen. Deswegen muss in deinem Fall hier [c]Integer[/c] stehen. Dann bekommst du über die get-Methode auch wirklich Integer zurück (welche du ja erwartest)
guuut, das waren ja jetzt sehr viele gut gemeinte Ratschläge
@Tomate Salat:
Das eine neue ArrayList automatisch Object nimmt wusste ich nicht, ich habe es mit <int> probiert es hat nicht geklappt und ich hab geglaubt es würde sowieso automatisch Integer benutzt werden.
die lowerCamelCase schreibweise habe ich mir eigtl bereits angewohnt wo x_y steht ist das vom Editor selbst so gemacht worden aber ich werde in Zukunft immer überprüfen und alles an Variablen/Methoden als lCC schreiben.
Und um deinem Vorschlag folge zu leisten habe ich alle selbst eingefügten AWT Objekte mit dem gleichen Swing ausgetauscht!
@faetzminator: wo ist der Unterschied zwischen [c]Arraylist<Integer>[/c] und [c]List<Integer>[/c]?
@ Dit: Ich bin mir schon ziemlich sicher das es vorgefertigte Sortiermöglichkeiten für das ganze gibt aber ich muss Quicksort selbst basteln und keine automatische Sortierung nutzen
PS: Wurde von niemandem Empfohlen bin der einzige Java-Liebhaber in meinem Freundeskreis, ich fand halt das Netbeans(womit ich sonst immer arbeite) ein bisschen groß dafür ist und wollte so viel wie möglich selbst schreiben.
Und jetzt will ich euch nochmal mit 2 Errors nerven welche mir mal wieder ausgegeben wurden:
Quicksort.java:68:10: cannot find symbol
symbol : variable size
location: interface java.util.List<java.lang.Integer>
n = a.size;
^
Quicksort.java:103:15: unexpected type
required: variable
found : value
a.get(n) = t;
^
2 errors
Der zweite fehler ist, dass du get statt add genommen hast. mit a.get(i) wird ein wert ausgelesen und mit a.add(Element) wird der Wert am Ende der Liste geschrieben.
Beim anderen Fehler: Versuch es mal mit runden Klammern "()" hinter size.
ich würde dir dringend Eclipse empfehlen, in Eclipse kannst du dein Programm nicht mal starten, wenn du so was wie
Java:
int n = liste.size;
im Code stehen hast. Jede Vernünftige IDE sollte den Benutzer sofort auf solche Fehler aufmerksam machen. Eclipse liefert noch kurze "Erklärung" was du an jene Stelle falsch machst.
Der zweite fehler ist, dass du get statt add genommen hast. mit a.get(i) wird ein wert ausgelesen und mit a.add(Element) wird der Wert am Ende der Liste geschrieben.
Beim anderen Fehler: Versuch es mal mit runden Klammern "()" hinter size.
Also das mit den () Klammern war wirklich ein dummer Fehler von mir, aber kann ja auch passieren.
Ich habe jetzt .get mit .add ausgetauscht kriege aber immernoch ein compile error raus:
Quicksort.java:103:15: unexpected type
required: variable
found : value
a.add(n) = t;
^
1 error
Kann mir nicht zufällig jemand erklären wie man sowas liest oder ob es eine Seite gibt wo alle Errors drin stehen?
@ Dit_: Ich kann mal schauen, habe mir i.-wann mal Eclipse runtergeladen aber nie besonders viel damit gearbeitet.
Ich schreibe bewusst arbeite. Du sollst nicht nur drüberlesen, sondern mach die Beispiele wirklich nach und lerne diese zu verstehen.
Und nutze Eclipse. Afaik ist Java Editor tod (kann sein das ich den verwechsle aber ich bin mir eigentl. ziemlich sicher). Alternativ zu Eclipse könntest du Netbeans verwenden. Bei beiden hast du schnellen Einblick in die relevanten Teile der Java-Api (die IDE sucht dir diese raus und zeigt dir diese als "tooltip" an). Solange solltest du dir unbedingt die aktuelle Java-Api offenhalten und die Methoden-Beschreibungen durchlesen, dann findest du z.B. auch selbst ganz schnell raus, wieso:
Java:
a.add(n)=t;
nicht nur nicht funktioniert, sondern wieso es auch keinen Sinn ergibt, es so zu verwenden. Wie es richtig geht, erklärt dir der Link der am Anfang des Postes steht.
Gut, ich habe mich jetzt innerhalb der 1-2 Tagen wo ich nichts geantwortet habe durch den Listenteil in deinem Link durchgeschlagen, ich bedanke mich vielmals dafür da mir das (merkwürdigerweise) sehr geholfen hat einen Link zum durchlesen zu haben anstatt ne erklärung der ganzen geschichte.
Ich bin mir zwar noch nicht sicher ob ich den Fehler bei
Code:
a.add(n) = t;[/c] gefunden habe, aber ich habe ein Idee wie ich es anders machen könnte!
[code=Java]
a.add(n, t);
Na wie ist das?
An Stelle n soll der Wert von t übernommen werden, somit wäre das eigtl Ziel erreicht oder gibt es noch einen Fehler den ich übersehen habe?
Inserts the specified element at the specified position in this list (optional operation). Shifts the element currently at that position (if any) and any subsequent elements to the right (adds one to their indices).
wie der Name schon vermuten lässt: [c]add[/c] fügt etwas hinzu, aber ersetzt nichts. Wenn du einen Wert an einer definierten Stelle ändern willst, musst du set benutzen:
Replaces the element at the specified position in this list with the specified element (optional operation).
Nicht 1 mal kann ich was richtig machen -.-''
Naja, danke nochmal.
Ich will zwar nicht schon wieder nerven aber... das Hauptproblem ist eigtl noch offen:
Jeder hat mir vorgeschlagen per Enter verknüpft mit dem JTextfield meine ganzen Befehle durchgehen zu lassen aber dies funktioniert immernoch nicht so recht.
Ich habe SuFu & Google auseinandergerissen und habe mir 3 möglichkeiten gebaut:
Java:
zahleneingabe.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
zahleneingabe.setText("");
}
});
zahleneingabe.addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_ENTER) {
zahleneingabe.setText("");
}}
});
public void zahleneingabeActionPerformed(ActionEvent evt) {
if(evt.getSource().equals(zahleneingabe)){
zahleneingabe.setText("");
}
}
Weder Compile errors, noch wenn das Programm läuft irgendwas, und beim Debuger passiert auch nichts, als ob Enter einfach nicht erkannt wird.
Ich danke für das Codebeispiel, damit habe ich meinen Fehler nämlich gleich gefunden.
Es ist schon ziemlich doof wenn man alle Methoden richtig schreibt und keine Errors hat ABER die Methoden nicht in den Hauptteil des Java Programms reinpackt!!
Kein wunder das der Code theorethisch funktioniert.