Java Anfänger - Probleme mit paint()

Rey8

Grünschnabel
Hi,
Versuche mich seit einer Woche in Java…die ersten Schritte gingen ganz flott bei mir. Nur jetzt hänge ich schon seit ein paar Tagen. Ich hoffe sehr das mit jemand helfen kann.

Ich möchte aus einer Menübar eines neues Fenster starten und in dem einige Parameter eingeben. Mit diesen Parametern möchte ich etwas zeichnen. Das Menü und das Parameter Fenster hab ich auch schon, die Parameter kann ich auch auslesen.

Das Problem ist folgendes: Ich kann der drawline Funktion nicht beibringen das sie mit den eingegeben Parametern eine Linie zeichnen soll. Wenn ich in meiner Funktion calculate x und y ausgebe, zeigt mir die Console noch den Wert an den ich in der Textbox eingegeben habe, nur in der paint Funktion werden x und y immer wieder null gesetzt! Ich glaub das Problem liegt darin das die Werte zwischen den zwei Frames (neu und test) verloren gehen…bin schon langsam am verzweifeln…
Hier mein gekürzter Code:

Code:
import java.awt.*;
import java.awt.event.*;
import java.awt.Dimension.*;
import java.awt.Color.*;
import java.awt.Canvas.*;

public class gui_ksp extends Frame implements ActionListener, WindowListener
{
	MyCanvas canvas = new MyCanvas();
	input myinput = new input();
	
	TextField field_vr_x = new TextField("");
	TextField field_vr_y = new TextField("");
		
	int vr_x;
	int vr_y;
	
  public static void main(String args[])
  {
	 gui_ksp gui_ksp1 = new gui_ksp();
	 gui_ksp1.setSize(800, 600);
	 gui_ksp1.setLocation(200, 100);
	 gui_ksp1.setTitle("test");
	 gui_ksp1.show();
   }

  //Menü wird hier initialisiert
  public gui_ksp()
  {
     MenuBar hauptMenue = new MenuBar();
     Menu menue1 = new Menu("Datei");
     menue1.add("Neu");
     menue1.add("Beenden");
     menue1.addActionListener(this);
     hauptMenue.add(menue1);
     setMenuBar(hauptMenue);
     addWindowListener(this);
     
     GridBagLayout myGridBag = new GridBagLayout();
     GridBagConstraints myGbConstraints = new GridBagConstraints();
     Font fontHelvBold14 = new Font("Helvetica", Font.BOLD, 14);
     setLayout(myGridBag);
     
     buildConstraints(myGbConstraints, 0, 9, 10, 10, 10,10);
     myGbConstraints.fill = GridBagConstraints.BOTH;
     myGridBag.setConstraints(canvas, myGbConstraints);
     add(canvas);     
   }
  
  void buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy) 
  {
	 gbc.gridx = gx;
	 gbc.gridy = gy;
	 gbc.gridwidth = gw;
	 gbc.gridheight = gh;
	 gbc.weightx = wx;
	 gbc.weighty = wy;
  }
  
  public gui_ksp(int i)
  {
	 Color custom_gray = new Color(212,208,200);
	 GridBagLayout gbl = new GridBagLayout();
	 GridBagConstraints gbc;
	 this.setLayout(gbl);
	 this.setBackground(custom_gray);
	 //addWindowListener(this);
	 
	 //Label x
	 gbc = makegbc(1, 0, 1, 1, 1);
	 gbc.fill = GridBagConstraints.NONE;
	 Label label_x = new Label("x");
	 gbl.setConstraints(label_x, gbc);
	 add(label_x);
	 
	//Label y 
	 gbc = makegbc(2, 0, 1, 1, 1);
	 gbc.fill = GridBagConstraints.NONE;
	 Label label_y = new Label("y");
	 gbl.setConstraints(label_y, gbc);
	 add(label_y);
	
	//Label vr
	 gbc = makegbc(0, 2, 1, 1, 1);
	 gbc.fill = GridBagConstraints.NONE;
	 Label label_vr = new Label("VR");
	 gbl.setConstraints(label_vr, gbc);
	 add(label_vr);
	
	 //Texfeld vr_x
	 gbc = makegbc(1, 2, 1, 1, 1);
	 gbc.weightx = 0;
	 gbc.fill = GridBagConstraints.HORIZONTAL;
	 gbl.setConstraints(field_vr_x, gbc);
	 add(field_vr_x);
	 
	//Texfeld vr_y
	 gbc = makegbc(2, 2, 1, 1, 1);
	 gbc.weightx = 0;
	 gbc.fill = GridBagConstraints.HORIZONTAL;
	 gbl.setConstraints(field_vr_y, gbc);
	 add(field_vr_y);
	 
	 //Ok-Button
	 Button button_ok = new Button("Ok");
	 gbc = makegbc(1, 9, 1, 1, 45);
	 gbc.fill = GridBagConstraints.NONE;
	 gbc.anchor = GridBagConstraints.SOUTHEAST;
	 gbl.setConstraints(button_ok, gbc);
	 add(button_ok);
	 button_ok.addActionListener(this);
	 
	//Abbrechen-Button
	 Button button_abbrechen = new Button("Abbrechen");
	 gbc = makegbc(2, 9, 1, 1, 1);
	 gbc.fill = GridBagConstraints.NONE;
	 gbc.anchor = GridBagConstraints.SOUTHEAST;
	 gbl.setConstraints(button_abbrechen, gbc);
	 add(button_abbrechen);
	 button_abbrechen.addActionListener(this);
	 
	//Passt die Fenstergröße an die Elemente an 
	 pack();
  }
  
  //Parameter für das GridBagConstraints
  private GridBagConstraints makegbc(int x, int y, int width, int height, int padx)
  {
	  GridBagConstraints gbc = new GridBagConstraints();
	  gbc.gridx = x;
	  gbc.gridy = y;
	  gbc.gridwidth = width;
	  gbc.gridheight = height;
	  gbc.insets = new Insets(1, 1, 1, 1);
	  gbc.ipadx = padx;
	  return gbc;
  }

  public void actionPerformed(ActionEvent evt)
  {
     if (evt.getSource() instanceof MenuItem)
    {
       String menuAdd = evt.getActionCommand();
       if (menuAdd == "Beenden") System.exit(0);
       if (menuAdd == "Neu")
       {
    	   gui_ksp gui_ksp2 = new gui_ksp(1);
    	   gui_ksp2.setLocation(300, 300);
    	   gui_ksp2.setTitle("Neu");
    	   gui_ksp2.show();
       }
     }
     if (evt.getSource() instanceof Button)
     {
    	 String buttonAdd = evt.getActionCommand();
    	 if (buttonAdd == "Abbrechen") 
    	 {
    		dia_closing();
    	 }
    	 if (buttonAdd == "Ok")
    	 {    		 
    		 vr_x=Integer.parseInt(field_vr_x.getText());
    		 vr_y=Integer.parseInt(field_vr_y.getText());
    		 
    		 myinput.temp_x = vr_x;
    		 myinput.temp_y = vr_y;
    		 canvas.calculate(myinput);
    		 dia_closing();
    	 }
     }
   }

  public void dia_closing()
  {
	  setVisible(false);
	  dispose();
  }
  
  //Programm Schließen
  public void windowClosing(WindowEvent evt)
  {
     System.exit(0);
  }

}

class MyCanvas extends Canvas 
{
	int x;
	int y;
	
	 public void calculate(input myinput) 
	  {
		  
		  x=myinput.temp_x;
		  y=myinput.temp_y;
		  repaint();
	  }
	
	  public void paint(Graphics g)
	  {	  
	 	 g.setColor(Color.black);
	 	 g.drawLine(x,y,100,100);
	  }

public class input 
{
	int temp_x;
	int temp_y;

}

Vielen Dank für eure Hilfe!
 
Hi

der code ist nicht direkt sauber aber für einen Anfänger gut.

Hier eine funktionierende Version (habe deine kurz abgeändert aber ich würde sie an deiner Stelle noch optimeren)

Code:
import java.awt.*;
import java.awt.event.*;
import java.awt.Dimension.*;
import java.awt.Color.*;
import java.awt.Canvas.*;


public class gui_ksp extends Frame implements ActionListener, WindowListener
{
    MyCanvas canvas = new MyCanvas();
    input myinput = new input();
    gui_ksp oldGui;
    
    TextField field_vr_x = new TextField("");
    TextField field_vr_y = new TextField("");

    int vr_x;
    int vr_y;

    public static void main(String args[])
    {
        gui_ksp gui_ksp1 = new gui_ksp();
        gui_ksp1.setSize(800, 600);
        gui_ksp1.setLocation(200, 100);
        gui_ksp1.setTitle("test");
        gui_ksp1.setVisible(true);
    }

    //Menü wird hier initialisiert
    public gui_ksp()
    {
        MenuBar hauptMenue = new MenuBar();
        Menu menue1 = new Menu("Datei");
        menue1.add("Neu");
        menue1.add("Beenden");
        menue1.addActionListener(this);
        hauptMenue.add(menue1);
        setMenuBar(hauptMenue);
        addWindowListener(this);

        GridBagLayout myGridBag = new GridBagLayout();
        GridBagConstraints myGbConstraints = new GridBagConstraints();
        Font fontHelvBold14 = new Font("Helvetica", Font.BOLD, 14);
        setLayout(myGridBag);

        buildConstraints(myGbConstraints, 0, 9, 10, 10, 10,10);
        myGbConstraints.fill = GridBagConstraints.BOTH;
        myGridBag.setConstraints(canvas, myGbConstraints);
        add(canvas);     
    }

    void buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy) 
    {
        gbc.gridx = gx;
        gbc.gridy = gy;
        gbc.gridwidth = gw;
        gbc.gridheight = gh;
        gbc.weightx = wx;
        gbc.weighty = wy;
    }

    public gui_ksp(gui_ksp oldKsp)
    {
        this.oldGui = oldKsp;
        Color custom_gray = new Color(212,208,200);
        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints gbc;
        this.setLayout(gbl);
        this.setBackground(custom_gray);
        //addWindowListener(this);

        //Label x
        gbc = makegbc(1, 0, 1, 1, 1);
        gbc.fill = GridBagConstraints.NONE;
        Label label_x = new Label("x");
        gbl.setConstraints(label_x, gbc);
        add(label_x);

        //Label y 
        gbc = makegbc(2, 0, 1, 1, 1);
        gbc.fill = GridBagConstraints.NONE;
        Label label_y = new Label("y");
        gbl.setConstraints(label_y, gbc);
        add(label_y);

        //Label vr
        gbc = makegbc(0, 2, 1, 1, 1);
        gbc.fill = GridBagConstraints.NONE;
        Label label_vr = new Label("VR");
        gbl.setConstraints(label_vr, gbc);
        add(label_vr);

        //Texfeld vr_x
        gbc = makegbc(1, 2, 1, 1, 1);
        gbc.weightx = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbl.setConstraints(field_vr_x, gbc);
        add(field_vr_x);

        //Texfeld vr_y
        gbc = makegbc(2, 2, 1, 1, 1);
        gbc.weightx = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbl.setConstraints(field_vr_y, gbc);
        add(field_vr_y);

        //Ok-Button
        Button button_ok = new Button("Ok");
        gbc = makegbc(1, 9, 1, 1, 45);
        gbc.fill = GridBagConstraints.NONE;
        gbc.anchor = GridBagConstraints.SOUTHEAST;
        gbl.setConstraints(button_ok, gbc);
        add(button_ok);
        button_ok.addActionListener(this);

        //Abbrechen-Button
        Button button_abbrechen = new Button("Abbrechen");
        gbc = makegbc(2, 9, 1, 1, 1);
        gbc.fill = GridBagConstraints.NONE;
        gbc.anchor = GridBagConstraints.SOUTHEAST;
        gbl.setConstraints(button_abbrechen, gbc);
        add(button_abbrechen);
        button_abbrechen.addActionListener(this);

        //Passt die Fenstergröße an die Elemente an 
        pack();
    }

    //Parameter für das GridBagConstraints
    private GridBagConstraints makegbc(int x, int y, int width, int height, int padx)
    {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.insets = new Insets(1, 1, 1, 1);
        gbc.ipadx = padx;
        return gbc;
    }

    public void actionPerformed(ActionEvent evt)
    {
        if (evt.getSource() instanceof MenuItem)
        {
            String menuAdd = evt.getActionCommand();
            if (menuAdd == "Beenden") System.exit(0);
            if (menuAdd == "Neu")
            {
                gui_ksp gui = new gui_ksp(this);
                gui.setLocation(300, 300);
                gui.setTitle("Neu");
                gui.setVisible(true);
            }
        }
        if (evt.getSource() instanceof Button)
        {
            String buttonAdd = evt.getActionCommand();
            if (buttonAdd == "Abbrechen") 
            {
                dia_closing();
            }
            if (buttonAdd == "Ok")
            {             
                vr_x=Integer.parseInt(field_vr_x.getText());
                vr_y=Integer.parseInt(field_vr_y.getText());

                myinput.temp_x = vr_x;
                myinput.temp_y = vr_y;
                
                oldGui.canvas.calculate(myinput);
                
                
                
                System.out.println("action");
                dia_closing();
            }
        }
    }

    public void dia_closing()
    {
        setVisible(false);
        dispose();
    }

    //Programm Schließen
    public void windowClosing(WindowEvent evt)
    {
        System.exit(0);
    }

    @Override
    public void windowActivated(WindowEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void windowClosed(WindowEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void windowDeactivated(WindowEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void windowDeiconified(WindowEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void windowIconified(WindowEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void windowOpened(WindowEvent arg0) {
        // TODO Auto-generated method stub

    }

}

class MyCanvas extends Canvas 
{
    int x;
    int y;

    public MyCanvas(){
        super();
    }
    
    public void calculate(input myinput) 
    {

        this.x=myinput.temp_x;
        this.y=myinput.temp_y;
        repaint();
    }



    // Überschreiben der Methode paint() von Canvas
    public void paint(Graphics g)
    {
        g.setColor(Color.black);
        g.drawLine(x, y, 100,100);
     

    } 
}
class input 
{
    int temp_x;
    int temp_y;

}

Dein Hauptprolem war hier:

if (menuAdd == "Neu")
{
gui_ksp gui_ksp2 = new gui_ksp(1);
gui_ksp2.setLocation(300,

Mit "gui_ksp2 = new gui_ksp(1);" ezeugsdt du ein neues Objekt.

und du willst alles in dem neuem Objekt zeichnen aber schließt es gleich wieder. Dadurch sind im alten Objekt alle variablen noch auf 0.

Ich hoffe das hilft ein wenig
 
Hi

der code ist nicht direkt sauber aber für einen Anfänger gut.

Hier eine funktionierende Version (habe deine kurz abgeändert aber ich würde sie an deiner Stelle noch optimeren)

Mit "gui_ksp2 = new gui_ksp(1);" ezeugsdt du ein neues Objekt.

und du willst alles in dem neuem Objekt zeichnen aber schließt es gleich wieder. Dadurch sind im alten Objekt alle variablen noch auf 0.

Ich hoffe das hilft ein wenig

DANKE DIR! Echt super!

Hätte aber noch ein paar Fragen...

Code:
gui_ksp gui = new gui_ksp(this);

public Listing3005(Listing3005 oldKsp)
    {
        this.oldGui = oldKsp;

Den Aufruf versteh ich nicht. Was generiere mit oldKsp? Kann ich dadurch auf das alte Objekt wieder zugreifen? Oder werden dadurch im "alten" Objekt die Variablen aktualisiert?

Code:
public MyCanvas(){
        super();
    }

Ruft die super Methode den Konstruktor gui_ksp() auf und falls ja, wieso brauch ich den Konstruktor wieder?

Was würdest du an meiner Stelle noch verbessern?
Fragen über Fragen...

Nochmals vielen Dank!!
 
Hi

also folgendes:

gui_ksp gui = new gui_ksp(this);

public Listing3005(Listing3005 oldKsp)
{
this.oldGui = oldKsp;

hier übergibst du dein Objekt und weist das Objekt der variablen oldGui zu,
Somit kannst du auf Methoden des alten Objektes zugreifen.

Das hier:

public MyCanvas(){
super();

}
kannst du in deinem Fall löschen.

Ich versuche am Freitag mal deinen code zu optimieren und die eine verbesserte Version zu schicken. Habe leider früher keine Zeit.
 
Zurück