Koordinatensystem Einheitenlinien

Alex2013

Bekanntes Mitglied
Hallo Leute,

ich habe mit meinem Programm ein kleines Problem. Heute Mittag wurde das Koordinatensystem auf einem anderen Computer noch richtig dargestellt. Jetzt zu Hause wird die Grafik nicht mehr richtig generiert. Kann mir evtl. jemand sagen woran das liegt?
Ich habe bereits überprüft, ob mir in der Console an möglichen kritischen Stellen Fehler ausgegeben werden. Dem ist aber nicht so. Das Programm wird sauber compiliert.

Hier der Code:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Koordinatensystem extends JFrame {
  
   SetzeKoordinaten sk;
   private static final long serialVersionUID = 1L;
   JPanel zeichnenbrett = new JPanel();
   JPanel eingabebrett= new JPanel();
   JTextField eingX=new JTextField(10),eingY=new JTextField(10);
   JLabel xEingabe=new JLabel("x Koordinate: ",JLabel.RIGHT),yEingabe=new JLabel("y Koordinate: ",JLabel.RIGHT);
   int x,y,xN,yN;
   Container c1,c2;
  
   Dimension d=Toolkit.getDefaultToolkit().getScreenSize().getSize();
   int h=(int)d.height-(d.height/4);int w=(int)d.width-(d.width/4);
   int w2=getWidth();int h2=300;
   Integer[] xKo = new Integer[8];
   Integer[] yKo = new Integer[8];
  
   public Koordinatensystem() {
     setSize(w,h);
     setLocationRelativeTo(null);
     setLayout(new BorderLayout());
     add(zeichnenbrett,BorderLayout.CENTER);
     add(eingabebrett,BorderLayout.SOUTH);
     eingabebrett.setBackground(Color.BLACK);
     eingabebrett.add(eingX);
     eingabebrett.add(eingY);
     eingabebrett.setSize(w2, h2);
     setVisible(true);
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     setResizable(false);
   }
  
   public void paint(Graphics g) {
     super.paintComponents(g);
     //Mit und ohne die Graphics Zeile gibt es keinen Unterschied. Daher ist sie jetzt nicht auskommentiert
     Graphics2D g2 = (Graphics2D) g;

     g.drawLine(0, zeichnenbrett.getHeight() / 2, zeichnenbrett.getWidth(), zeichnenbrett.getHeight() / 2);
     g.drawLine(zeichnenbrett.getWidth() / 2, 0, zeichnenbrett.getWidth() / 2, zeichnenbrett.getHeight());
    
     // x linien
     String[] line = new String[getWidth()];
    
     // y linien
     String[] line2 = new String[getHeight()];
    
    
     for (int i = 0; i < line.length; i++) {
       g.drawLine((zeichnenbrett.getWidth() / 2) - 5, y += 10, (zeichnenbrett.getWidth() / 2) + 5, y);
     }
    
     for (int j = 0; j < line2.length; j++) {
       g.drawLine(x += 10, (zeichnenbrett.getHeight() / 2) - 5, x, (zeichnenbrett.getHeight() / 2) + 5);
     }
    
////     String x=""+sk.xKo.toString();String y=""+sk.yKo.toString(); //int xKo,yKo;
////     String xN=""+sk.getxKoN();String yN=""+sk.getyKoN();
//    
//     g.drawLine(x,y,xN,yN);

   }
  
//   public void wandleKomponenten(int x1,int xN,int y1,int yN,SetzeKoordinaten sk)
//   {System.out.println("x6");
//     x1=sk.getEingX();y1=sk.getEingY();xN=sk.getxKoN();yN=sk.getyKoN();
//     System.out.println("x7");
//   }
  
  
  
   public static void main(String args[]) {
     new Koordinatensystem();
   }
}

[/Java]

Für Tipps wäre ich dankbar :)
 
Zuletzt bearbeitet von einem Moderator:

HarleyDavidson

Bekanntes Mitglied
Kannst du ein Screenshot schicken, wie es denn richtig aussehen soll?
Bei mir sieht es so aus:

2015-08-03 13_26_36-.jpg

Außerdem hab ich die Zeile
SetzeKoordinaten sk;
entfernt. Ist diese Klasse zur Ausführung wichtig?

Beschreib mal ein bisschen, was man damit machen kann, dann kann ich auch besser testen.
 

Alex2013

Bekanntes Mitglied
Also im Prinzip leider nicht. Da es bei mir ja falsch dargestellt wird bzw. so wie bei dir. Es sollten auch noch die einzelnen Einheitenstriche der x und y Achse angezeigt werden. Dies passiert aber nicht bzw. ist einmal kurz sichtbar und wird anschließend von einer anderen Schicht "überzeichnet".
Zunächst wollte ich per Textfeld einige Variablen setzen können, welche anschließend mit einem Strich verbunden werden. Hinterher wollte ich auch noch einen Zoom oder sonstige Funktionen einbauen. Aber es sollte ja auch erstmal grundlegend funktionieren ;-)

Zum Ausführen an sich ist die Klasse, die du gelöscht hast nicht wichtig. Aber hiermit sollen ja die Variablen entgegengenommen und gespeichert werden, damit diese anschließend gespeichert werden etc.
 

HarleyDavidson

Bekanntes Mitglied
Ich habe die Lösung für die fehlerhafte Darstellung gefunden.
Hier die Erklärung:
Beim ersten Mal zeichnen des Koordinatensystems ist sind Variablen x und y jeweils 0.
Dann wird das Fenster neu gezeichnet wegen hinzufügen des JPanels "eingabebrett".
Dann sind die beiden Variablen x und y aber nicht mehr null, somit werden die Skalenstriche völlig falsch außerhalb des Koordinatensystems gezeichnet.
Die Lösung ist hier, direkt bei Aufruf der Methode "paint" (also oberhalb der Zeile "super.paintComponent(g);") zu schreiben :
Java:
x = 0;
y = 0;
Dann wird das Fenster richtig dargestellt.

Nun zum Programmierstil:
Mit jeder neuen Funktion wird dein Code furchtbar unübersichtlich. Ich empfehle dir hier eine zweite Klasse "ZeichenbrettPanel" zu schreiben, die JPanel erweitert. Dann kannst du die "paint" Methode dorthin auslagern. So hast du den Code für das Darstellen des Koordinatensystems immer schön separat und übersichtlich.

Ich hoffe, ich konnte dir hier helfen. Viel Erfolg!
 

Alex2013

Bekanntes Mitglied
Ja, danke! :)
Das hat mir schon viel weiter geholfen! :)
Jetzt muss ich es nur noch hinbekommen, dass die Linien der Y Achse nicht zu tief gehen und dass, wenn Koordinaten eingegeben werden, diese auch gezeichnet werden.

Ich habe mal einen Screenshot hochgeladen, wie die untere Hälfte aktuell aussieht.

Mache ich evtl. beim setzen der Koordinaten etwas falsch?
Hier mal der betreffende Code:

Java:
public void setKoordinaten(boolean Stat,int eingX,int eingY,int xKoN,int yKoN,int xAlt,int yAlt,Graphics g)
  {
     Koordinatensystem ko=null;
    
     if(Stat==true)
     {
       this.eingX=xAlt;
       this.eingY=yAlt;
       this.xKoN=Integer.parseInt(ko.eingX.getText());
       this.yKoN=Integer.parseInt(ko.eingY.getText());
       for(int i=1;i<xKo.length;i++)
       {
         for(int j=1;j<yKo.length;j++)
         {
           xKo[i]=this.eingX;
           yKo[j]=this.eingY;
           Stat=true;
         }
         
       }g.drawLine(xAlt, yAlt, xKoN, yKoN);
       
     }
     else
     {
       xKo[0]=this.eingX;
       yKo[0]=this.eingY;
       
       if((ko.eingX.getText()!=null)&&(ko.eingY!=null))
       {
         ko.eingX.setText("");
         ko.eingY.setText("");
       }
       Stat=false;
     }
     
  }
   
   public Integer[] getKoordinaten(int i)
   {
     if(i==1)
     {
        return xKo;
     }
     else
     {
       return yKo;
     }
   }

Vorher hatte ich den Code bei der setKoordinaten Methode bei der If Verzweigung jeweils bei dem anderen Part drin. Dies brachte aber auch keinen Unterschied. Die Koordinaten sind mit gettern und settern ausgestattet.

Was sagst du dazu?
Kann man das anders lösen oder ist das schon der richtige Weg?
 

Anhänge

  • Koordinatensystem.png
    Koordinatensystem.png
    18,1 KB · Aufrufe: 119
Zuletzt bearbeitet von einem Moderator:

Alex2013

Bekanntes Mitglied
Mit diesem Ansatz kam ich bisher leider auch nicht weiter:

Java:
public SetzeKoordinaten(int xKoN,int yKoN,Integer yKo[],Integer xKo[])
{
     //initialisierung
     this.xKoN=xKoN;
     this.yKoN=yKoN;
     System.out.println("x1_5");
    
     //gesetzt
     xKo[0]=xKoN;
     yKo[0]=yKoN;
     System.out.println("x1_6");
    
     JOptionPane.showMessageDialog(null, "Daten gesetzt","Meldung",JOptionPane.INFORMATION_MESSAGE);
}
  
   public void altNeu(int xAlt,int yAlt,int xKoN,int yKoN,Integer yKo[],Integer xKo[])
   {
     this.xKo=xKo;
     this.yKo=yKo;
     this.xKoN=xKoN;
     this.yKoN=yKoN;
     this.xAlt=xAlt;
     this.yAlt=yAlt;
     System.out.println("x1_7");
    
     xKo[1]=xKoN;
     yKo[1]=yKoN;
     System.out.println("x1_8");
    
     xAlt=xKoN;
     yAlt=yKoN;
     System.out.println("x1_9");
    
   }

Hätte hierzu noch jemand einen Tipp oder sogar eine Lösung?
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Oben