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.
Zahlen mischen und mit einer for-Schleife Summe berechnen
ich hab ein Applet in dem 9 Zahlen stehen, diese sind auf ein GridLayout aufgeteilt. Ich möchte, dass die Zahlen getauscht werden. In meinem Code hab ich aber irgendwo einen Fehler, denn es passiert nichts sobald ich auf den Button klicke.
Ich würde das aber gern mit einer for-Schleife erledigen. Das ist irgendwie professioneller. Dafür benötige ich doch eine Doppelschleife (wie im jetzigen Code möchte ich jeweils nur die 3 horizontalen oder vertikalen Felder summieren), oder?
Nur wie gebe ich das mit dem Array an? Damit er eben nicht alle Felder summiert?
Zahlen in einem GridBagLayout ... aha :? Falls das Labels sind, wo Text drauf ist, musst du nach dem Mischen auch noch für alle Labels
label[x][y].setText(String.valueOf(zahl[x][y]));
aufrufen.
Und das Summieren ... naja ... WIE da jetzt summiert werden soll, kann man nur ansatzweise erraten... *rumrat*
Code:
for (int i=0; i<3; i++)
{
for (int j=0; j<3; j++)
{
summe[i+0] += zahl[i][j];
summe[i+3] += zahl[j][i];
}
}
Zahlen in einem GridBagLayout ... aha icon_confused.gif Falls das Labels sind, wo Text drauf ist, musst du nach dem Mischen auch noch für alle Labels
label[x][y].setText(String.valueOf(zahl[x][y]));
aufrufen.
öhm, das sind 9 Textfelder, in einem 3*3 Block angeordnet. Die Summe soll immer nur in der horizontalen und vertikalen berechnet werden. Also wie z.B in einer Tabelle:
1. Zeile1-Spalte1 + Zeile1-Spalte2 + Zeile1-Spalte3;
oder:
2. Zeile2-Spalte1 + Zeile2-Spalte2 + Zeile2-Spalte3;
oder:
3. Zeile1-Spalte1 + Zeile2-Spalte1 + Zeile3-Spalte1;
usw. Hoffe, das ist jetzt ein bisschen einfacher zu verstehen rüber gekommen.
Ja, das Summieren sollte dan grob stimmen. Aber das mit den TextFields... jetzt legst du ja in jedes TextField den gleichen Text rein. Un das auch noch sehr oft. Du müßtest stattdessen NACH der Schleife
tf00.setText(String.valueOf(zahl[0][0]));
tf01.setText(String.valueOf(zahl[0][1]));
tf02.setText(String.valueOf(zahl[0][2]));
use.
machen. Wenn die TextFields in einem Array liegen würden, könnte man auch DAS mit einer Schleife machen.
Du musst damit rechnen, dass ich da jetzt die nächstliegende Antwort gebe (bzw. Gegenfrage stelle): Kann es sein, dass im zahl-Array nur lauter nullen drinliegen?!
Ich weiß nicht so genau. Eigentlich sollte das doch eine Zufallszahl sein ich hab zwar weiter oben int zaehler = 0; und zahl[j] = zaehler; deklariert, diese befinden sich aber in einer if-Abfrage und haben eigentlich nichts mit dem in meinem vorigen Post genannten Code zu tun. Oder täusch ich mich da?
Da hat sich auch noch gerade ein neues Problem aufgemacht. Ich will Textfelder mit einer for-Schleife erzeugen. Aber mein Code geht nicht. Der Compiler kann den Code nicht initialisieren. Was ist daran falsch?
Code:
import java.awt.*;
import java.applet.*;
public class arraytest extends Applet{
public void init(){
int i;
setLayout(new FlowLayout());
for(i=0; i<=4; i++){
TextField[]tf = new TextField[i];
add(tf[i]);
}
}
}
Ein bißchen probieren, ja, aber auch nachdenken und Tutorials lesen.... Und bei Fragen die Relevanten Teile des Codes posten .. am besten irgendws compilierbares, wo das Problem reproduzierbar auftritt.... und eine konkrete Frage dazu stellen....
Code:
// Marco13 für [url]http://www.java-forum.org/de/viewtopic.php?t=70639&highlight=&sid=8455696f95674c482376952f249db39d[/url]
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SonstWirdDasJaNieWas extends JApplet
{
private JTextField textFields[][];
private int numbers[][];
private JLabel labels[];
private int sums[];
int sizeX = 7;
int sizeY = 5;
public SonstWirdDasJaNieWas()
{
getContentPane().setLayout(new BorderLayout());
JPanel p = new JPanel(new FlowLayout());
JButton b = new JButton("Init");
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
initialize();
}
});
p.add(b);
b = new JButton("Mischen");
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
shuffle();
}
});
p.add(b);
b = new JButton("Berechnen");
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
compute();
}
});
p.add(b);
getContentPane().add(p, BorderLayout.NORTH);
numbers = new int[sizeY][sizeX];
textFields = new JTextField[sizeY][sizeX];
p = new JPanel(new GridLayout(sizeY, sizeX));
for (int i=0; i<sizeY; i++)
{
for (int j=0; j<sizeX; j++)
{
textFields[i][j] = new JTextField();
p.add(textFields[i][j]);
}
}
getContentPane().add(p, BorderLayout.CENTER);
sums = new int[sizeY + sizeX];
labels = new JLabel[sizeY + sizeX];
p = new JPanel(new GridLayout(1, sizeY+sizeX));
for (int i=0; i<sizeY+sizeX; i++)
{
labels[i] = new JLabel(" ");
p.add(labels[i]);
}
getContentPane().add(p, BorderLayout.SOUTH);
}
private void initialize()
{
int counter = 0;
for (int i=0; i<sizeY; i++)
{
for (int j=0; j<sizeX; j++)
{
numbers[i][j] = counter++;
textFields[i][j].setText(String.valueOf(numbers[i][j]));
}
}
}
private void shuffle()
{
int counter = 0;
for (int i=0; i<sizeY; i++)
{
for (int j=0; j<sizeX; j++)
{
int ri = (int)(sizeY*Math.random());
int rj = (int)(sizeX*Math.random());
int temp = numbers[ri][rj];
numbers[ri][rj] = numbers[i][j];
numbers[i][j] = temp;
}
}
for (int i=0; i<sizeY; i++)
{
for (int j=0; j<sizeX; j++)
{
textFields[i][j].setText(String.valueOf(numbers[i][j]));
}
}
}
private void compute()
{
for (int i=0; i<sizeY; i++)
{
for (int j=0; j<sizeX; j++)
{
sums[i] += numbers[i][j];
}
}
for (int i=0; i<sizeX; i++)
{
for (int j=0; j<sizeY; j++)
{
sums[i+sizeY] += numbers[j][i];
}
}
for (int i=0; i<sums.length; i++)
{
labels[i].setText(String.valueOf(sums[i]));
}
}
}
Ähm, ja. Ok, dankeschön. Jetzt werd ich zwar erst mal ne Stunde beschäftigt sein bis ich den Code durchwühlt hab, aber ich muss dich wenigstens nicht mehr belästigen. Und ich kann gucken was ich in Zukunft besser machen kann...
Hmja, war nicht so herablassend gemeint, wie der Name der Klasse vielleicht klingt :wink: sorry. Aber ... wenn du "irgendwas" machst, und dann auf irgendwelchen TextFields lauten nullen stehen, braucht man eben die relevanten Teile des Codes, sonst kann man das nicht beantworten.
Analog zu einer neulich gestellten Frage...
"Ich mache
SomeObject someObject = new SomeObject();
aber wenn ich später
System.out.println(someObject);
mache, gibt er 'null' aus - woran liegt das?"
wo die Antwort dann eben war (und nur sein konnte) : "Zwischendurch wird irgendwann, irgendwo im nicht geposteten code 'someObject' auf 'null' gesetzt" (und so war es dann auch).
Und solche ... "Fehler"... wie
TextField[]tf = new TextField;
add(tf);
sind eben syntatkische Grundlagen, die man nicht durch Fragen in einem Forum lernen kann, sollte oder muss, sondern durch das Lesen von Tutorials....
Aber ansonsten kannst du uns gerne weiter "belästigen" :wink:
BTW: Für ein Magisches Quadrat müssen die Diagonalen auch die gleiche Summe haben....
EDIT: Und NOCH ein Nachtrag: Dieser Event-Mechanismus, den du da verwendest, ist seit... ähm SEIT Java 1.1 veraltet (also schon SEHR lange). Seitdem sollte man das ganze mit ActionListenern machen. Aber das kannst du dir in dem Beispiel oder auf http://java.sun.com/docs/books/tutorial/uiswing/events/actionlistener.html ansehen. Im Code oben ist es jetzt halt unkommentiert, aber wenn noch Fragen sind, sag' bescheid.
Ich fand das ganz und gar nicht herablassend. Besser kann es für mich eigentlich gar nicht laufen. Ein anderer gibt mir die perfekte Lösung - soweit ich das beurteilen kann. Ich hab da dann kein Problem den Code durchzuarbeiten und lern nebenbei sogar was ich besser machen kann.
Bei Tutorials ist das Problem, dass es z.T. ewig dauert bis man die durchgearbeitet hat, bzw. bis man das Richtige gefunden hat. Da bringt ein Forum, vor allem bei kleineren Fehlern manchmal mehr. Aber ich hab hier ja so ein tolles Buch, das gammelte bisher nur so vor sich hin. Wird sich jetzt aber ändern...
BTW: Für ein Magisches Quadrat müssen die Diagonalen auch die gleiche Summe haben....
Dann werd ich dieses Angebot auch dankend annehmen...
Und das mit dem ActionListener kannte ich bisher noch nicht...bin noch ein ziemlicher Noob. Werd ich mir auch mal anschauen. Hab dein Code ja jetzt als Grundlage.
Hm, der Stapel mit Sachen, die ich mir anschauen, soll häuft sich irgendwie zu schnell...
"Zusatzübung" :shock: Hm - wenn das eine Hausaufgabe war, war das mit dem Posten der Lösung wohl nicht so ideal - das mache ich (und eigentlich keiner hier) dann eigentlich nicht. Und BTW: Das Programm ist nicht "perfekt"... eher ziemlich schnell runtergeschrieben (i.a. sollte man die Daten von der GUI trennen usw.).... aber da es nur um 3 Funktionen ging.... egal.