Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Übungsblatt 8, Aufgabe 1
Ich finde ja auch, dass es ein bisschen unübersichtlich wird, für jedes Aufgabenblatt nur einen Thread zu benutzen. Darum fange ich hier mal einen neuen an.
Nun zu meinem Problem:
wenn ich ein Objekt von meiner geschützten Klasse erstellen will, bekomme ich vom Compiler folgende Meldung:
non-static variable this cannot be referenced from a static context
drawCircles kreise = new drawCircles();
Ich stell mich sicher zwar grad nur unglaublich dämlich an, aber ich komm einfach nicht drauf, was ich ändern muss, damit das funktioniert. :>
Über genau dieses Problem habe ich mir auch stundenlang den Kopf zerbrochen. Die Lösung:
[m]private static class drawCircles { … }[/m]
kann mir jemand sagen was “uniform” heißen soll - ist damit eine Normalverteilung gemeint ?
oder dass die Radii alle gleich wahrscheinlich auftreten sollen ?
bzw: sollen die Radii als auch die Positionen uniform verteilt sein?
Vielen Dank, so funktioniert es. Allerdings verwirrt mich das doch etwas, warum man hier bei einer Klasse static dazuschreiben muss.
Klassen sollten doch eigentlich per Definition schon static sein.
Mich auch…
Und weiter geht’s:
non-static method drawOval(int,int,int,int) cannot be referenced from a static context
Graphics.drawOval(50, 50, 50, 50)
Graphics ist eine abstrakte Klasse, aber ihre Methoden nicht statisch? Wie wende ich diese Methoden also an?
private static class MeinMalpanel extends JPanel {
// ...
public void paint(Graphics daMalIchDrauf) {
// ...
daMalIchDrauf.drawOval(50, 50, 50, 50);
// ...
}
}
sagamal wie macht man das das die nummern genau in der mitte vom kreis sind … besser gesagt müssen die unbedingt in der mitte sein oder gehts auch so ungefähr ^^
Naja, ich würde sagen man nimmt sich als x und y-Werte für die Nummern folgendes:
x(Nr) = x(Kreis) + Kreisbreite/2
y(Nr) = y(Kreis) - Kreishöhe/2
wie habt ihr das bei init() mit dem setzten des backgrounds gelöst?
hatte das alles schon fertig aber noch nciht wie in der vorgabe verlangt. nun bekomm ich allerdings mit der neuen methode nur für das starten über console den background hin, jedoch nicht mit appletviewer/html…
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics;
import javax.swing.*;
import java.lang.Math;
public class Circles extends JApplet{
private static class drawCircles extends JPanel {
private int numCircles;
public void paint (Graphics g) {
g.setColor(Color.green);
g.fillRect(0,0,this.getWidth(),this.getHeight());
for (int i=0;i<numCircles;i++){
int x=(int)(Math.random()*(this.getWidth()+1));
int y=(int)(Math.random()*(this.getHeight()+1));
int w=(int)(Math.random()*(this.getWidth()/10+1));
g.setColor(Color.red);
g.fillOval(x,y,w,w);
g.setColor(Color.black);
g.drawOval(x,y,w,w);
g.setFont(new Font("Helvetica",0,12));
g.drawString(Integer.toString(i+1),x+(int)(w/2),y+(int)(w/2));
}
}
public drawCircles(int c) {
numCircles=c;
}
}
public static void main(String[] args) {
int c=100; //Standartwert, wenn kein Eingabeparameter
if (args.length>0) c = Integer.parseInt(args[0]);
JFrame f = new JFrame("Circles");
JPanel p = new drawCircles(c);
f.getContentPane().add(p);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setSize(400,400);
f.setVisible(true);
}
public void init() {
try {
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
createGUI();
}
});
} catch (Exception e) {
System.err.println("createGUI() ist fehlgeschlagen");
}
}
public void createGUI() {
int c=100; //Standartwert, wenn kein Eingabeparameter
String eingabeString = getParameter("CIRCLES");
if (eingabeString != null) c = Integer.parseInt(eingabeString);
JPanel p = new drawCircles(c);
getContentPane().add(p);
}
}
HTML:
<HTML>
<HEAD>
<TITLE> Circles </TITLE>
</HEAD>
<BODY>
<APPLET CODE="Circles.class" WIDTH=400 HEIGHT=400>
<PARAM NAME="CIRCLES" VALUE=10>
</APPLET>
</BODY>
</HTML>
Schau dir mal die Klasse [m]FontMetrics[/m] genauer an, insbesondere in der Gegend von [m]stringWidth[/m] und [m]getDescent[/m]… ![]()
([m]getDescent()[/m] bezieht sich zwar nicht auf die Höhe einer Zahl sondern auf die maximale Ausdehnung (Äquator… :)), aber…)
Braucht man das wirklich so genau?
Ich mein, wenn ich mir mal die UNGENAUEN Angaben der Aufgabenstellungen ansehe – dann dürfen die sich über die Millimeter Abweichung aber nicht beschweren, wenn man es auf die einfache Art und Weise macht.
Zu euren static-Problemen (falls es noch aktuell ist):
Ihr ruft von der main() üblicherweise eure Methoden auf.
Die main() ist static und kann somit nur auf statische Methoden
und Variablen zugreifen (wenn man mal darüber nachdenkt
ist es auch logisch). Eine einfache Lösung des Problems besteht
darin, einfach den Konstruktor der Klasse aufzurufen und dann
mit dieser Referenzierung zu arbeiten.
public class Hello {
public static void main(String[] args) {
Hello h = new Hello();
// h.rufeMethodeAuf(); ...
}
// Konstruktor falls benötigt ...
public Hello() {
// ...
}
// non-static Methode
public void setX(int x) {
// ...
}
}
Das ist schon klar. Aber das Problem war, dass man eine interne Klasse auch als [m]static[/m] deklarieren muss, um von ihr eine Instanz in [m]main()[/m]erstellen zu können.
genau
kann sich das jmd. bisher erkären oder muss ich das einfach schlcuken :motz:
widersrpricht sich ja mit allem was man bisher so von java gefressen hat.
Wenn du schon deinen Code hier reinpostet dann bin ich so frei und geb mal meinen Comment ab ![]()
DU musst bei
int w = ....
beachten, das Math.Random 0 ausgeben kann, mit diener Lösung kann somit ein Radius von 0 erzeugt werden, was an der Aufgabenstellung vorbei wäre ![]()
Tja, ich habe die innere Klasse nicht static.
Mein Cirlces hat eine Methode welche mir den Frame erstellt. In der main mach ich mir also eine Instanz vom Circle…
ja irgendeinen zweck werd ich damit schon verfolgen. und zwar genau den, dass mir vll einer noch nen tipp gibt. vielen dank ![]()