Erstellen Sie das Quadrat, Rechteck, Dreieck von Java in jframe [closed]

Lesezeit: 8 Minuten

Erstellen Sie das Quadrat Rechteck Dreieck von Java in jframe
Sasapp

Ich habe ein Problem mit Java Wie ich verstanden habe komme ich nicht zum Zeichnen geometrischer Figuren in Java, der Code und das Folgende kannst du mir helfen?

Dies ist der Code:

public class Gioco {


    public static void main (String args [])
    {
        PaintRect();

    }

    public static void PaintRect() {

        g.drawRect(100,100,300,300);
        g.drawLine(100,100,100,100);
        g.setBackground(Color.BLACK);
        System.out.println("Trasut");
        credits.setText("Kitebbiv");
        credits.setBackground(null);
        credits.setEditable(false);
        credits.setFocusable(false);
        credits.setBounds(0,0,100,100);
        credits.setForeground(Color.BLACK);
        panel.add(credits);
        g.getPaint();
    }

Wie kann ich eine erstellen JFrame das Dreieck, Quadrat und Rechteck? korrigiere meinen code danke

  • Weniger Code posten. Versuchen Sie, eine Figur zu zeichnen, dann kann jemand helfen. Dieser Ausschnitt ist zu lang

    – effektiv

    30. Januar 2017 um 17:28 Uhr

  • korrigiere meinen code danke, das ist eine Menge Code. Gehen Sie ein Problem nach dem anderen durch. Zeichnen Sie das Rechteck, sobald das funktioniert, versuchen Sie, das Quadrat zu zeichnen, wenn Sie fertig sind, zeichnen Sie das Dreieck. Wenn Sie bei einem hängen bleiben, posten Sie ein reproduzierbares Minimalbeispiel für diesen Teil. Aber ich werde Ihren Code tatsächlich korrigieren: 1) Nicht verwenden null-layout Verwenden Sie stattdessen a Layout-Manager da Swing so konzipiert wurde, dass es mit verschiedenen Betriebssystemen, PLAFs, Bildschirmgrößen und Auflösungen funktioniert und auch nicht anruft setLocation()sehen Null-Layout ist böse

    – Frakcool

    30. Januar 2017 um 17:32 Uhr


  • … und die Antworten in dieser Frage. 2) Nicht anrufen frame.setSize() stattdessen verwenden pack(); Wenn Sie einen Layout-Manager verwenden, 3) erstellen Sie eine Instanz von Graphics2D So funktioniert es nicht, bitte sehen Sie sich das Tutorial an Kundenspezifische Bemalung in Swing. 4) Sie nehmen zu viel static Sehen Sie sich diese Frage an, um zu erfahren, warum Sie es in diesem Fall nicht verwenden sollten.

    – Frakcool

    30. Januar 2017 um 17:38 Uhr

  • Bitte nehmen Sie auch an der Tour teil, da Sie sie anscheinend noch nicht durchgegangen sind, und lesen Sie auch How to Ask. Wenn Sie fertig sind, kommen Sie zurück und bearbeiten Sie Ihre Frage, um Ihre hinzuzufügen Kurzes, in sich geschlossenes, richtiges Beispiel das zeigt Ihr Problem und folgt den obigen Empfehlungen.

    – Frakcool

    30. Januar 2017 um 17:41 Uhr

  • 1) “Entschuldigung für diesen Code” Bitte bearbeiten Sie Ihre Frage und posten Sie Ihren Code dort, nicht in den Kommentaren. 2) Tipp, füge @efekctive oder wen auch immer du in einem Kommentar benachrichtigen möchtest hinzu (The @ ist wichtig)

    – Frakcool

    30. Januar 2017 um 19:30 Uhr

Erstellen Sie das Quadrat Rechteck Dreieck von Java in jframe
Frakcool

Bevor ich überhaupt anfange, meine Antwort zu schreiben, muss ich Sie ermutigen, sorgfältig zu lesen: So erstellen Sie ein gültiges minimales, vollständiges und überprüfbares Beispiel und a Kurzes, in sich geschlossenes, richtiges Beispiel.


  1. Aus Ihrem (jetzt gelöschten) Code geht hervor, dass Sie den nicht durchlaufen haben Swing-Tutorial zur benutzerdefinierten Bemalung oder Sie haben gar nicht darauf geachtet, diese Zeile wird Ihnen Probleme bereiten

    static Graphics2D g = new Graphics2D() 
    
  2. Der übermäßige Gebrauch von static Modifikator wird dir schaden, static ist kein methodenübergreifendes Zauberwort, um Ihre Variablen überall in Ihrem Programm zugänglich zu machen, Sie sollten stattdessen eine Instanz Ihres Programms erstellen und die Methoden von dort aufrufen (sie sind nicht statisch), siehe Warum werden statische Variablen als böse angesehen? , und Sie sollten wirklich zurückgehen und das Wesentliche lernen bevor Sie Ihr Lernen mit einer GUI noch komplexer machen und noch mehr mit Swing Custom Painting.

  3. Du nutzt setBounds() Methode, die darauf hindeutet (und ich kann in Ihrem gelöschten Code bestätigen), dass Sie a verwenden null-layout:

    panel.setLayout(null);
    

    Sie sollten wirklich in Betracht ziehen, die zu überprüfen Layout-Manager

  4. Sie verwenden eine veraltete Methode JFrame#show() stattdessen sollten Sie verwenden JFrame#setVisible() Methode.

  5. Sie stellen die Größe Ihrer manuell ein JFramesollten Sie stattdessen einen Layout-Manager verwenden und die Methode aufrufen JFrame#pack() Dadurch wird die bevorzugte Größe für Sie berechnet JFrame oder überschreiben Sie die Ihrer Komponente getPreferredSize().

  6. Auf Ihrem gelöschten Code hatten Sie a MouseListener angehängt an a JButtonstattdessen müssen Sie eine verwenden ActionListenersehen So verwenden Sie Aktionen dies zu lernen.

  7. Sie platzieren Ihr Programm nicht auf dem Event-Dispatch-Thread (EDT) Dies könnte Ihr Programm zum Einfrieren bringen, da Swing nicht Thread-sicher ist. Sie können dies korrigieren, indem Sie Ihre schreiben main Methode wie folgt:

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                //Your constructor here
            }
        });
    }
    
  8. Du solltest höflicher sein: “korrigiere meinen Code danke” klingt wie ein befehl, hätte ich so gesagt kannst du mir helfen? das klingt wie eine Bitte / Petition an jemanden, der dir zur Hand geht, weil er es kann, nicht weil er dir helfen muss, alle oben genannten Punkte deinen Code zu korrigieren.


Nachdem alles oben Gesagte gesagt wurde (und was Sie sorgfältig lesen sollten), können wir mit dem Codierungsteil fortfahren:

Um ein Rechteck zu zeichnen, müssen wir etwas über ein Rechteck lernen:

Um ein Quadrat zu zeichnen, müssen wir Folgendes wissen:

Du musst sagen… “Aber die Methode, die Sie zum Zeichnen des Quadrats verwenden, ist dieselbe wie beim Rechteck!”naja… ja, das sind wir, der Unterschied liegt darin, dass wir an einem vorbeikommen width und height gleiche Größe für das Quadrat und unterschiedliche Größe für das Rechteck.

Um ein Dreieck zu zeichnen, müssen Sie Folgendes wissen:

  • Ein Dreieck hat 3 Seiten, sie können gleich oder unterschiedlich groß sein
  • Wir haben keine Methode dazu drawTriangle in Swing, aber wir haben drawPolygon(xPoints, yPoints, nPoints) draw(Shape) des Graphics2D Methode, die ein Polygon von zeichnen wird nPoints (3 in diesem Fall), wobei die Koordinaten von jedem Array-Element von genommen werden xPoints für die X Koordinaten u yPoints für die Y Koordinaten und wo Shape wäre ein Beispiel für Polygon

Nun, wenn wir all das zusammenfügen, sollten wir diesen ganzen Code in einer überschriebenen Methode von uns haben JPanel namens paintComponent() wie im Tutorial gezeigt (siehe Punkt #1). Es sollte so aussehen:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g); //ALWAYS call this method first!
    g.drawRect(10, 10, 50, 50); //Draws square
    g.drawRect(10, 75, 100, 50); //Draws rectangle
    g.drawPolygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3); //Draws triangle
}

Aber wir müssen auch eine andere Methode überschreiben getPreferredSize() auf unserer JPanel(siehe: Sollte ich die Verwendung von setPreferred|Maximum|MinimumSize in Swing vermeiden? der allgemeine Konsens sagt ja), andernfalls unsere JFrame wird kleiner sein als wir wollen, also sollte es so aussehen:

@Override
public Dimension getPreferredSize() {
    return new Dimension(300, 300);
}

Vergessen Sie nicht anzurufen @Override in diesen Methoden!

Mit nur diesen Methoden haben wir unser Programm zum Zeichnen der Formen abgeschlossen, aber ich weiß, dass Sie die obigen Methoden an einer Stelle schreiben werden, die nicht funktioniert oder Ihnen Kompilierungsfehler verursacht, wenn ich nicht den gesamten Code poste. Der gesamte Code (der tatsächlich ein MCVE oder SSCCE ist (siehe den allerersten Absatz in dieser Antwort, um zu sehen, was beides bedeutet)), der die folgende Ausgabe erzeugt, lautet also:

Geben Sie hier die Bildbeschreibung ein

import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ShapesDrawing {

    private JFrame frame;
    private JPanel pane;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new ShapesDrawing().createAndShowGui();
            }
        });
    }

    public void createAndShowGui() {
        frame = new JFrame(getClass().getSimpleName());
        pane = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g); //ALWAYS call this method first!
                g.drawRect(10, 10, 50, 50); //Draws square
                g.drawRect(10, 75, 100, 50); //Draws rectangle
                g.drawPolygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3); //Draws triangle
                g.dispose();
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        };

        frame.add(pane);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Ich hoffe wirklich, dass Sie jeden Link lesen, den ich hier gepostet habe, denn es lohnt sich

Und wenn Sie die Formen füllen müssen, dann rufen Sie an fillRect und fillPolygon anstatt drawRect und drawPolygon:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g); //ALWAYS call this method first!
    g.drawRect(10, 10, 50, 50); //Draws square
    g.fillRect(150, 10, 50, 50); //Fills a square
    g.drawRect(10, 75, 100, 50); //Draws rectangle
    g.fillRect(150, 70, 100, 50); //Fills a square
    g.drawPolygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3); //Draws triangle
    g.fillPolygon(new int[] {185, 150, 215}, new int[] {150, 200, 200}, 3); //Fills triangle
    g.dispose();
}

Geben Sie hier die Bildbeschreibung ein


Bearbeiten

Gemäß dem Kommentar von @MadProgrammer:

Könnten wir vermeiden, zu verwenden draw/fillPolygon zugunsten der Verwendung der aktualisierten Shapes-API … bietet viel mehr Funktionalität und ist im Allgemeinen einfacher zu verwenden 😛

Hier ist das aktualisierte paintComponent Methode mit der Shapes-API:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g); //ALWAYS call this method first!

    Graphics2D g2d = (Graphics2D) g;
    g2d.draw(new Rectangle2D.Double(10, 10, 50, 50));
    g2d.fill(new Rectangle2D.Double(150, 10, 50, 50));

    g2d.draw(new Rectangle2D.Double(10, 75, 100, 50));
    g2d.fill(new Rectangle2D.Double(150, 75, 100, 50));

    g2d.draw(new Polygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3));
    g2d.fill(new Polygon(new int[] {185, 150, 215}, new int[] {150, 200, 200}, 3));

    g2d.dispose();
    g.dispose();
}

Was die folgende Ausgabe erzeugt:

Geben Sie hier die Bildbeschreibung ein

  • Könnten wir vermeiden, zu verwenden draw/fillPolygon zugunsten der Verwendung der aktualisierten Shapes-API … bietet viel mehr Funktionalität und ist im Allgemeinen einfacher zu verwenden 😛

    – Verrückter Programmierer

    30. Januar 2017 um 20:48 Uhr

  • Frakcool Vielen Dank, dass Sie mir die Zeit genommen und mir erklärt haben, wie man die verschiedenen geometrischen Formen erstellt

    – Sasapp

    30. Januar 2017 um 22:01 Uhr


  • @MadProgrammer siehe Bearbeiten 🙂 und danke für den Tipp, ich werde von nun an die Shapes-API verwenden: D

    – Frakcool

    30. Januar 2017 um 22:02 Uhr

  • @Sasapp kein Problem, nur sicher sein akzeptiere die Antwort

    – Frakcool

    30. Januar 2017 um 22:03 Uhr

994480cookie-checkErstellen Sie das Quadrat, Rechteck, Dreieck von Java in jframe [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy