InternalFrame und Koordinatsystem

koddy013

Mitglied
Hallo,

ich wollte ein Grafik in eine Internal Frame erstellen. Dadurch habe ich mit JInternalFrame gearbeitet.
Dadurch kommt das Ergebnis nicht wie ich gewollt habe.
Das InternalFrame wird angezeigt, aber der Grafik ist irgendwie steht über der InternalFrame. Also ich kann der InternalFrame weder verändern oder verschliessen.
Wenn ich die Zeile "linePanel = new LinePanel(new Point(coordinats[0], coordinats[1]), new Point(coordinats[2], coordinats[3]));" wegmachen, dann kommt die InternalFrame, wie ich gewollt habe, aber es gibt kein Funktion/Grafik, wo ich zeichnen will.

Weisst ihr, wie kann ich diese Befehl verbessern?
Soll ich ein Panel in der InternalFrame machen für die Grafik?

Hier ist die Code, die ich nach meine Meinung nicht so sicher richtig ist:
Java:
            int[] coordinats = new int[4];
            coordinats[0] = (int) Double.parseDouble(inputx1.getText());
            coordinats[1] = (int) Double.parseDouble(inputy1.getText());
            coordinats[2] = (int) Double.parseDouble(inputx2.getText());
            coordinats[3] = (int) Double.parseDouble(inputy2.getText());

            JInternalFrame linePanel = new JInternalFrame("grafik", true, true, true);
            linePanel = new LinePanel(new Point(coordinats[0], coordinats[1]), new Point(coordinats[2], coordinats[3]));

            linePanel.setBounds(0, 0, jDesktopPane1.getWidth(), jDesktopPane1.getHeight());
            jDesktopPane1.add(linePanel);
            linePanel.setVisible(true);
            linePanel.repaint();

und hier ist für die Klasse LinePanel

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.AffineTransform;
import java.awt.print.Printable;
import javax.swing.BorderFactory;
import javax.swing.JInternalFrame;

public class LinePanel extends JInternalFrame
{
    public JInternalFrame jInternalFrame1 = new JInternalFrame();

    static int openFrameCount = 0;
    static final int xOffset = 10, yOffset = 10;

    private static final double xMin = -100;
    private static final double xMax = 100;
    private static final double yMin = -50;
    private static final double yMax = 50;

    private static final double xMinDetail = -5;
    private static final double xMaxDetail = 5;

    private Point startCoordinats;
    private Point endCoordinats;


    public LinePanel(Point startCoordinats, Point endCoordinats)
    {
        this.startCoordinats = startCoordinats;
        this.endCoordinats = endCoordinats;
    }

    @Override
    public void paint(Graphics g)
    {
        super.paint(g);
        Graphics2D g2d = (Graphics2D)g;

        zeicheKoordinatenSystem(g);
        for(double x = xMin; x < xMax; x += 0.01 ){
            g.setColor(Color.GREEN);
            g.drawLine(berechneXPixel(x), berechneYPixel(f(x)), berechneXPixel(x),  berechneYPixel(f(x)));
            g.setColor(Color.RED);
            g.drawLine(berechneDetailXPixel(x), berechneYPixel(f(x)), berechneDetailXPixel(x),  berechneYPixel(f(x)));


        g2d.translate(getWidth()/2.0, getHeight()/2.0);                        //verschieben die 0 in der Mitte
        g2d.scale(1, -1);                                                               //y-Richtung nach oben

        g2d.drawLine(startCoordinats.x, startCoordinats.y, endCoordinats.x, endCoordinats.y);     //gerade Linie aus 2 Punkten zeichnen
    
        }
    }
    
    private void zeicheKoordinatenSystem(Graphics g) {
        zeichneXAchse(g);
        zeichneYAchse(g);
    }

    private void zeichneXAchse(Graphics g) {
//Beschriftung der X-Achse
        g.setColor(Color.BLUE);
        g.drawLine(berechneXPixel(xMin),berechneYPixel(0) , berechneXPixel(xMax), berechneYPixel(0));
        for(double i = xMin; i < xMax; i += (xMax - xMin) / 20)
        {
            g.drawLine(berechneXPixel(i),berechneYPixel(1) , berechneXPixel(i), berechneYPixel(-1));
            g.drawString("" + i, berechneXPixel(i), berechneYPixel(-5));
        }

        int startx = berechneXPixel(xMin);
        int endx = berechneXPixel(xMax);
        int starty = berechneYPixel(0);
        int endy = berechneYPixel(0);
        g.setColor(Color.BLACK);                    //Farbe der Achse
        g.drawLine(startx, starty, endx, endy);
    }

    private void zeichneYAchse(Graphics g) {
//Beschriftung der Y-Achse
        g.setColor(Color.BLUE);
        g.drawLine(berechneXPixel(0), berechneYPixel(yMin), berechneXPixel(0), berechneYPixel(yMax));
        for(double i = yMin; i < yMax; i += (yMax - yMin) / 10)
        {
            g.drawLine(berechneXPixel(0.5), berechneYPixel(i), berechneXPixel(-0.5), berechneYPixel(i));
            g.drawString("" + i, berechneXPixel(-10), berechneYPixel(i));
        }

        int startx = berechneXPixel(0);
        int endx = berechneXPixel(0);
        int starty = berechneYPixel(yMin);
        int endy = berechneYPixel(yMax);
        g.setColor(Color.BLACK);                    //Farbe der Achse
        g.drawLine(startx, starty, endx, endy);
    }

    private int berechneXPixel(double x) {
        double pixelBreite = ((xMax - xMin) / (double)getWidth());
        return (int) ((x - xMin) / pixelBreite );
    }

    private int berechneDetailXPixel(double x) {
        double pixelBreite = ((xMaxDetail - xMinDetail) / (double)getWidth());
        return (int) ((x - xMinDetail) / pixelBreite );
    }

    private int berechneYPixel(double y) {
        double pixelBreite = ((yMax - yMin) / (double)getHeight());
        return getHeight() - ((int) ((y - yMin) / pixelBreite));
    }

    private double f(double x) {
            return 0;
    }

    public LinePanel()
    {
        super("Grafik" +(++openFrameCount),
                true,       //resizeable
                true,       //closable
                true,       //maximizable
                true);      //iconifiable

        //Set the window's location.
        jInternalFrame1.setLocation(xOffset*openFrameCount, yOffset*openFrameCount);

        jInternalFrame1.setPreferredSize(new Dimension(200, 100));
        jInternalFrame1.setBorder(BorderFactory.createLoweredBevelBorder());

        jInternalFrame1.setDefaultCloseOperation( EXIT_ON_CLOSE );

    }

}

Mein 2.Problem ist jetzt mit der Beschriftung der Koordinatensystem.
Wenn ich ein Linie von (0,0) zu (100,100) zeichne, dann kommt die Zeichnung, aber der Beschriftung der Koordinatensystem ist bei (40,25).
Kann jemand mir helfen, wo ich verändern soll?

Ich bedanke mich im voraus für jede Hilfe.

Viele Grüße,
 
Zuletzt bearbeitet:
Ich hätte mal ein paar Verbesserungsvorschläge zu deinen Klassen.
In der Klasse LinePanel ist die Zeile
Java:
public JInternalFrame jInternalFrame1 = new JInternalFrame();
vollkommen sinnlos, weil die Klasse selbst schon aus einem JInternalFrame besteht.
Diese Zeile kannst du weglassen und statt
Java:
jInternalFrame1.setLocation(...);
usw. einfach das schreiben:
Java:
setLocation(...);


Diesen Teil im Code verstehe ich nicht:
Java:
...
        for(double x = xMin; x < xMax; x += 0.01 ){
            g.setColor(Color.GREEN);
            g.drawLine(berechneXPixel(x), berechneYPixel(f(x)), berechneXPixel(x),  berechneYPixel(f(x)));
            g.setColor(Color.RED);
            g.drawLine(berechneDetailXPixel(x), berechneYPixel(f(x)), berechneDetailXPixel(x),  berechneYPixel(f(x)));

        g2d.translate(getWidth()/2.0, getHeight()/2.0);                        //verschieben die 0 in der Mitte
        g2d.scale(1, -1);                                                               //y-Richtung nach oben

        g2d.drawLine(startCoordinats.x, startCoordinats.y, endCoordinats.x, endCoordinats.y);     //gerade Linie aus 2 Punkten zeichnen
    }
Für jedes x zwischen xMin und xMax zeichnest du eine grüne und eine rote "Linie", die aber letztendlich nur einen Punkt darstellt. Macht das Sinn? Verwende
Zusätzlich verschiebst du jedes Mal die Zeichenfläche und drehst sie jedes Mal um. Hast du nach der for-Schleife eine geschweifte Klammer vergessen?

Du solltest auch folgendes schreiben:
Java:
public LinePanel(Point startCoordinats, Point endCoordinats)
{
    super(); //Wichtig
...
Sonst kann es sein, dass kein JInternalFrame angezeigt wird.


Das hier ist übrigens nicht sehr geschickt:
Java:
private double f(double x) {
    return 0;
}
Du solltest wenigstens z.B. x+1 zurückgeben, damit man die Funktion sieht.


Dieser Teil der Hauptklasse ist nicht sinnvoll:
Java:
JInternalFrame linePanel = new JInternalFrame("grafik", true, true, true);
linePanel = new LinePanel(new Point(coordinats[0], coordinats[1]), new Point(coordinats[2], coordinats[3]));
Du solltest die obere Zeile weglassen, weil diese sowieso nichts bewirkt.


Ich hoffe, dir geholfen zu haben. Probier einfach mal, deine Klassen so zu ändern und zeige dann nochmal deinen aktuellen Stand. ;)
 
Hallo,

danke @Jellysheep für die Erklärung.
Also ich habe die LinePanel-Klasse verändert.
Hier ist der Code der Klasse:

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;

public class LinePanel extends JInternalFrame
{
    public JInternalFrame jInternalFrame1;
    public JPanel graphPanel = new JPanel();

    static int openFrameCount = 0;
    static final int xOffset = 20, yOffset = 20;

    private static final double xMin = -100;
    private static final double xMax = 100;
    private static final double yMin = -50;
    private static final double yMax = 50;

    private Point startCoordinats;
    private Point endCoordinats;

    public LinePanel(Point startCoordinats, Point endCoordinats)
    {
        super("Grafik" +(++openFrameCount),
                true,       //resizeable
                true,       //closable
                true,       //maximizable
                true);      //iconifiable

        this.startCoordinats = startCoordinats;
        this.endCoordinats = endCoordinats;

        //Set the window's location.
        setLocation(xOffset*openFrameCount, yOffset*openFrameCount);

        setDefaultCloseOperation( DISPOSE_ON_CLOSE );
        pack();
    }

    @Override
    public void paint(Graphics g)
    {
        super.paint(g);
        Graphics2D g2d = (Graphics2D)g;

        zeicheKoordinatenSystem(g);
        g2d.translate(getWidth()/2.0, getHeight()/2.0);                        //verschieben die 0 in der Mitte
        g2d.scale(1, -1);                                                               //y-Richtung nach oben
        g2d.setColor(Color.RED);
        g2d.drawLine(startCoordinats.x, startCoordinats.y, endCoordinats.x, endCoordinats.y);     //gerade Linie aus 2 Punkten zeichnen  
    }
    
    private void zeicheKoordinatenSystem(Graphics g) {
        zeichneXAchse(g);
        zeichneYAchse(g);
    }

    private void zeichneXAchse(Graphics g) {
        //Beschriftung der X-Achse
        g.setColor(Color.BLUE);
        g.drawLine(berechneXPixel(xMin),berechneYPixel(0) , berechneXPixel(xMax), berechneYPixel(0));
        for(double i = xMin; i < xMax; i += (xMax - xMin) / 20)
        {
            g.drawLine(berechneXPixel(i),berechneYPixel(1) , berechneXPixel(i), berechneYPixel(-1));
            g.drawString("" + i, berechneXPixel(i), berechneYPixel(-5));
        }

        int startx = berechneXPixel(xMin);
        int endx = berechneXPixel(xMax);
        int starty = berechneYPixel(0);
        int endy = berechneYPixel(0);
        g.setColor(Color.BLACK);                    //Farbe der Achse
        g.drawLine(startx, starty, endx, endy);
    }

    private void zeichneYAchse(Graphics g) {
        //Beschriftung der Y-Achse
        g.setColor(Color.BLUE);
        g.drawLine(berechneXPixel(0), berechneYPixel(yMin), berechneXPixel(0), berechneYPixel(yMax));
        for(double i = yMin; i < yMax; i += (yMax - yMin) / 10)
        {
            g.drawLine(berechneXPixel(0.5), berechneYPixel(i), berechneXPixel(-0.5), berechneYPixel(i));
            g.drawString("" + i, berechneXPixel(-10), berechneYPixel(i));
        }

        int startx = berechneXPixel(0);
        int endx = berechneXPixel(0);
        int starty = berechneYPixel(yMin);
        int endy = berechneYPixel(yMax);
        g.setColor(Color.BLACK);                    //Farbe der Achse
        g.drawLine(startx, starty, endx, endy);
    }

    private int berechneXPixel(double x) {
        double pixelBreite = ((xMax - xMin) / (double)getWidth());
        return (int) ((x - xMin) / pixelBreite );
    }

    private int berechneYPixel(double y) {
        double pixelBreite = ((yMax - yMin) / (double)getHeight());
        return getHeight() - ((int) ((y - yMin) / pixelBreite));
    }
}

Jetzt läuft die Grafik in der InternalFrame.
Aber trotzdem habe ich noch Probleme und zwar folgendes:
1. Der Grafik läuft bis zum Rand der InternalFrame (also bis in der obere Teil, wo der Name, Minimize, Maximize, und Abschiessen-Symbole liegt). Ich wollte nur bis in der interne Panel der InternalFrame.
Was muss ich noch verändern, damit es so läuft?

2. Die Beschriftung der Koordinatensystem stimmt nicht mit der reale Zeichen.
z.B. wenn ich die Linie von (0,0) bis (100,100) zeichen will, dann wird es in Beschriftung nur bis (40,25) gezeichnet. Also ich glaube ich habe Fehler in der Beschriftung gemacht, aber ich weiss nicht mehr, wo ich verändern soll.
Könnt ihr mir bitte helfen?

Ich bedanke mich noch mal im voraus.

Liebe Grüße,
 
So, ich hab deine Klasse noch entaw verändert, u.a. die berechneX/YPixel Methoden entfernt.
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Point;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
 
public class LinePanel extends JInternalFrame
{
    public JInternalFrame jInternalFrame1;
    public JPanel graphPanel = new JPanel();
 
    static int openFrameCount = 0;
    static final int xOffset = 20, yOffset = 20;
 
    private static final double xMin = -100;
    private static final double xMax = 100;
    private static final double yMin = -100;
    private static final double yMax = 100;
 
    private Point startCoordinats;
    private Point endCoordinats;
 
    public LinePanel(Point startCoordinats, Point endCoordinats)
    {
        super("Grafik" +(++openFrameCount),
                true,       //resizeable
                true,       //closable
                true,       //maximizable
                true);      //iconifiable
 
        this.startCoordinats = startCoordinats;
        this.endCoordinats = endCoordinats;
 
        //Set the window's location.
        setLocation(xOffset*openFrameCount, yOffset*openFrameCount);
 
        setDefaultCloseOperation( DISPOSE_ON_CLOSE );
        pack();
    }
 
    @Override
    public void paint(Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;
        super.paint(g2d);
        Insets ins = getInsets();
        int titlebarHeight = 22;
        g2d.clipRect(ins.left, ins.top+titlebarHeight, getWidth()-ins.left-ins.right, getHeight()-ins.top-ins.bottom-titlebarHeight);
        g2d.translate(ins.left, ins.top+titlebarHeight);
        g2d.scale(((double)getWidth()-ins.left-ins.right)/(xMax-xMin), ((double)getHeight()-ins.top-ins.bottom-titlebarHeight)/(yMax-yMin));
        g2d.translate((xMax-xMin)/2.0, (yMax-yMin)/2.0);   //verschieben die 0 in der Mitte
        zeicheKoordinatenSystem(g2d);                     
        g2d.scale(1, -1);                                                               //y-Richtung nach oben
        g2d.setColor(Color.RED);
        g2d.drawLine(startCoordinats.x, startCoordinats.y, endCoordinats.x, endCoordinats.y);     //gerade Linie aus 2 Punkten zeichnen 
        g2d.scale(1, -1);                  
        g2d.translate(-(xMax-xMin)/2.0, -(yMax-yMin)/2.0);   //verschieben die 0 in der Mitte
        g2d.scale((xMax-xMin)/((double)getWidth()-ins.left-ins.right), (yMax-yMin)/((double)getHeight()-ins.top-ins.bottom-titlebarHeight));
        //g2d.drawLine(startCoordinats.x, startCoordinats.y, endCoordinats.x, endCoordinats.y);     //gerade Linie aus 2 Punkten zeichnen 
    }
   
    private void zeicheKoordinatenSystem(Graphics g) {
        zeichneXAchse(g);
        zeichneYAchse(g);
    }
 
    private void zeichneXAchse(Graphics g) {
        //Beschriftung der X-Achse
        g.setColor(Color.BLUE);
        //g.drawLine((int)xMin,0 , (int)xMax, 0);
        ((Graphics2D)g).scale(0.5, 0.5);
        for(double i = 20; i < xMax; i += 20)
        {
            g.drawLine((int)i*2,2 , (int)i*2, -2);
            g.drawString("" + (int)i, ((int)i-2)*2, -5*2);
        }
        for(double i = -20; i > xMin; i -= 20)
        {
            g.drawLine((int)i*2,2 , (int)i*2, -2);
            g.drawString("" + (int)i, ((int)i-5)*2, 10*2);
        }
        ((Graphics2D)g).scale(2, 2);
 
        int startx = (int) xMin;
        int endx = (int) xMax;
        int starty = 0;
        int endy = 0;
        g.setColor(Color.BLACK);                    //Farbe der Achse
        g.drawLine(startx, starty, endx, endy);
    }
 
    private void zeichneYAchse(Graphics g) {
        //Beschriftung der Y-Achse
        g.setColor(Color.BLUE);
        //g.drawLine(0, (int)yMin, 0, (int)yMax);
        ((Graphics2D)g).scale(0.5, 0.5);
        for(double i = 20; i < yMax; i += 20)
        {
            g.drawLine(2, (int)i*2, -2, (int)i*2);
            g.drawString("" + -(int)i, -30, ((int)i+2)*2);
        }
        for(double i = -20; i > yMin; i -= 20)
        {
            g.drawLine(2, (int)i*2, -2, (int)i*2);
            g.drawString("" + -(int)i, 5, ((int)i+2)*2);
        }        
        ((Graphics2D)g).scale(2, 2);
 
        int startx = 0;
        int endx = 0;
        int starty = (int)yMin;
        int endy = (int)yMax;
        g.setColor(Color.BLACK);                    //Farbe der Achse
        g.drawLine(startx, starty, endx, endy);
    }
}

Das Ergebnis sieht dann ungefähr so aus:
Grafik1.png

Ich hoffe, dass es deinen Vorstellungen entspricht, du kannst es ja noch ändern. ;)

P.S.: Kommst du eigentlich aus Deutschland? (Die Bezeichnung "Minimize, Maximize, und Abschiessen-Symbole" ist etwas ungewöhnlich.)
 
Danke für deine Hilfe.
Das entspricht was ich will.

Ich weiss vorher die Methode getInsets() ja nicht. Aber jetzt weiss ich neuere Methode ;)

p.s. ich wohne z.Z. in Deutschland, aber ich komme nicht aus Deutschland. Deswegen weiss ich nicht alle details auf Deutsch :)

LG,
 

Neue Beiträge

Zurück