Kommandozeilenparameter in andere Methode

tatra-bennl

Mitglied
Hallo,

ich habe folgende Frage:

ich habe in der main-Methode eine Variable N definiert, die als Kommandozeilenparameter übergeben wird.

int N = Integer.parseInt(args[0]);

Nun möchte ich dieses "N" in einer anderen Methode weiter verwenden.

Es geht darum, ein regelmäßiges N-Eck zu zeichnen, wobei die Anzahl der Ecken als Kommandozeilenparameter übergeben wird.

Danke im Voraus!
 
Hallo Gucky, danke für den Hinweis. Ich habe mich mit der Vererbung auseinandergesetzt. In diesem Fall zeigt mir Eclipse aber an, dass ich "args" nur in der Main-Methode verwenden kann.

Ich schreibe int N = Integer.parseInt(args[0]); in die Main-Methode und bekomme das N einfach nicht in die nächste Methode.

Hier der Code:
Java:
public static void main(String[] args)
 {
  // [...]

  int N = Integer.parseInt(args[0]);
  
  
 }
 public class Subklasse extends polygon_regelmaessig {
	 
 // ???? Das ist bestimmt nicht richtig...

 protected void Zeichnen ( Graphics g )
 {
  
  VertexDrawer.drawVertex( g, getWidth() / 2, getHeight() / 2, 60, N, false );
 }
}

[...] weiterer Code
 
Tut mir leid. So gerne ich dir das zeigen und erklären würde...da musst du selber drauf kommen.
Guck dir noch einmal die Grundlagen von Methodenaufrufen an. Du wirst die Erleuchtung schon noch erlangen.
 
Tut mir leid. So gerne ich dir das zeigen und erklären würde...da musst du selber drauf kommen.
Guck dir noch einmal die Grundlagen von Methodenaufrufen an. Du wirst die Erleuchtung schon noch erlangen.
Ach', was soll's:
Java:
public static void main(String[] args)
 {
  // [...]

  int N = Integer.parseInt(args[0]);
  new Subklasse().Zeichnen( g, N );
  
 }
 public class Subklasse extends polygon_regelmaessig {
     
 // ???? Das ist bestimmt nicht richtig...

 protected void Zeichnen ( Graphics g, int N )
 {
  
  VertexDrawer.drawVertex( g, getWidth() / 2, getHeight() / 2, 60, N, false );
 }
}

[...] weiterer Code

Jetzt musst du dir nur noch überlegen, wie du an dein "Graphics g" kommst?
 
Wollte gerade nen Tipp geben, aber Androbin war schneller.

Daher nur eine (wichtige) Formalität:

Variablen werden in Java klein geschrieben, auch ein "N" -> "n". 😉
 
Vielen Dank!

So hatte ich es ganz am Anfang, jedoch ohne Subklasse. Das war also der Fehler...

Aber noch eine Frage:
hebe nun alles so gemacht und jetzt sagt Eclipse, dass die Methode "Zeichnen" nicht als statische Methode erklärt werden kann, was ja auch klar ist. Allerdings ergeben sich auch Fehlermeldungen, wenn ich sie als nicht statisch definiere. Wie kann ich das noch in den Griff bekommen?

Java:
import java.awt.*;
import javax.swing.*;

public class polygon_regelmaessig extends JPanel
{

 public static void main(String[] args )
 {
  JFrame f = new JFrame();
  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  f.add(new polygon_regelmaessig());
  f.setSize( 200, 200 );
  f.setVisible( true );
  int N = Integer.parseInt(args[0]);
  
  
 }

 public class Subklasse extends polygon_regelmaessig {
 
 protected void paintComponent(Graphics g, int N)
 {
  
  VertexDrawer.Zeichnen (g, getWidth() / 2, getHeight() / 2, 60, N);
 }
}

class VertexDrawer
{
public static void Zeichnen (Graphics g, int x, int y, int r, int n)
 {
  Polygon p = new Polygon();

  for (int i=0; i<n; i++)
   p.addPoint((int) (x + r * Math.cos(i * 2 * Math.PI / n )),
              (int) (y + r * Math.sin(i * 2 * Math.PI / n )));

  
   g.drawPolygon( p );
 }
}}
 
Vielen Dank!

So hatte ich es ganz am Anfang, jedoch ohne Subklasse. Das war also der Fehler...

Aber noch eine Frage:
hebe nun alles so gemacht und jetzt sagt Eclipse, dass die Methode "Zeichnen" nicht als statische Methode erklärt werden kann, was ja auch klar ist. Allerdings ergeben sich auch Fehlermeldungen, wenn ich sie als nicht statisch definiere. Wie kann ich das noch in den Griff bekommen?

...
Die genauen Fehlermeldungen zu kennen, wäre hilfreich!
 
Zuletzt bearbeitet:
hebe nun alles so gemacht und jetzt sagt Eclipse, dass die Methode "Zeichnen" nicht als statische Methode erklärt werden kann, was ja auch klar ist. Allerdings ergeben sich auch Fehlermeldungen, wenn ich sie als nicht statisch definiere. Wie kann ich das noch in den Griff bekommen?
Versuch erstmal zu verstehen was static macht, bevor du es in dein Programm kopierst. Die Klassen Subklasse und VertexDrawer sind innere Klassen. Wenn du eine Methode in der inneren Klasse static machen willst, muss auch die innere Klasse selbst static sein. Aber bevor du jetzt alle Klassen static machst solltest du dir wirklich die Grundlagen aneignen. Du brauchst nicht für jede neue Methode eine eigene Klasse. Ich hab mal die nicht benötigten Klassen weggelöscht, dann sollte der Aufruf zumindest funktionieren.

Java:
import java.awt.*;
import javax.swing.*;

public class polygon_regelmaessig extends JPanel
{

 public static void main(String[] args )
 {
  JFrame f = new JFrame();
  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  f.add(new polygon_regelmaessig());
  f.setSize( 200, 200 );
  f.setVisible( true );
  int N = Integer.parseInt(args[0]);
  
  
 }

 protected void paintComponent(Graphics g, int N)
 {
  
  zeichnen (g, getWidth() / 2, getHeight() / 2, 60, N);
 }

public static void zeichnen (Graphics g, int x, int y, int r, int n)
 {
  Polygon p = new Polygon();

  for (int i=0; i<n; i++)
   p.addPoint((int) (x + r * Math.cos(i * 2 * Math.PI / n )),
              (int) (y + r * Math.sin(i * 2 * Math.PI / n )));

  
   g.drawPolygon( p );
 }
}
 
Zuletzt bearbeitet:
Hallo dmessn28,

Dankeschön, jetzt klappt es, d.h. es werden keine Fehler angezeigt. Allerdings habe ich mit mehreren Werten als Kommandozeilenargument versucht; es wird allerdings nichts ausgegeben. (siehe Screenshot) So ähnlich hatte ich den Code schon vor dem Eröffnen des Threads, d.h. ohne Subklassen.

Es wird mir an der Zeile int N = Integer.parseInt(args[0]); folgender Hinweis angezeigt:
"The value of the local variable N is not used"

Diese Meldung hatte ich bereits ganz am Anfang, als ich den Parameter N aus der main-Methode in die andere Methode (jetzt "paintComponent") übernommen habe.
Dann habe ich mich wie mir empfohlen wurde noch weiter belesen und informiert und bin auf diese Geschichte mit den Subklassen gestoßen.

Meine Frage am Anfang war deshalb eigentlich nur: wie mache ich dem Programm klar, dass er in dieser paintComponent-Methode das int N aus der main-Methode verwenden soll? Anscheinend kapiert das Programm ja momentan noch nicht, dass beide "N"s dieselben sind...

Ohne Titel.jpg
 
Dann musst du eine Klassenvariable verwenden.
Also eine Methode setN(int n) in subklasse erstellen, die den Wert setzt und zeichne aufruft.

paintComponent ist eine Methode, die von Swing bereitgestellt wird. Sie sollte nicht verändert werden (z.B. durch abweichende Parameterzahlen).



Ich möchte dir ein Buch/Tutorial sehr ans Herz legen, damit du dir die Grundlagen aneignen kannst. Programmieren ist weder wie eine Spielekonsole (einlegen läuft) noch wie ein PC (ich brauche nicht alles und das, was ich brauche ist selbsterklärend) sondern dabei brauchst du das Gesamtpaket mitsamt sämtlicher sprachlichen Besonderheiten, Syntax, Grammatik, Semantik etc. Und das lernt man nicht durch ausprobieren, sondern durch Bücher/Tutorials.
 
Zuletzt bearbeitet:
Hallo dmessn28,
Meine Frage am Anfang war deshalb eigentlich nur: wie mache ich dem Programm klar, dass er in dieser paintComponent-Methode das int N aus der main-Methode verwenden soll? Anscheinend kapiert das Programm ja momentan noch nicht, dass beide "N"s dieselben sind...
Hast du denn wirklich überhaupt gar keine Ahnung vom Programmieren?
(Tschuldigung, nicht böse gemeint! Ich hatte heute einfach einen schlechten Tag...)

Aber woher soll Java denn wissen, das beide Variablen dasselbe sein sollen?
Ja, beide Variablen haben den gleichen Variablennamen, allerdings sind sie beide lokal,
d. h. sie existieren beide nur innerhalb der Methode, in der sie deklariert wurden!

Du kannst dir also entweder eine globale Variable anlegen (außerhalb der Methoden),
oder du übergibst sie der anderen Methode als Argument/Parameter!
 

Neue Themen


Zurück
Oben