AWT Canvas zeichnet nicht

Diskutiere Canvas zeichnet nicht im AWT, Swing, JavaFX & SWT Forum; Hey, ich möchte auf einem JFrame ein 20 x 20 Raster erzeugen und jede Zelle mit dem selben Bild füllen (Das Bild ist vorhanden, auch im richtigen...

  1. dereki2000
    dereki2000 Neues Mitglied
    Hey, ich möchte auf einem JFrame ein 20 x 20 Raster erzeugen und jede Zelle mit dem selben Bild füllen (Das Bild ist vorhanden, auch im richtigen Verzeichnis). Folgenden Quellcode verwende ich:
    Code (Java):
    public void start1()
        {
            JFrame f1 = new JFrame();
            f1.setSize(500, 500);
            f1.setLocation(20, 20);
            for(int i = 0; i < 20; i++)
            {
                for(int e = 0; e < 20; e++)
                {
                    int i1 = i;
                    int e1 = e;
                 
                    f1.add(new Canvas() {
                        public void paint(Graphics g)
                        {
                            Toolkit t = Toolkit.getDefaultToolkit();
                            Image j = t.getImage("img/leer.png");
                            g.drawImage(j, i1*20, e1*20, this);
                        }
                    });
            }
            }
            f1.setVisible(true);
        }
    Ich bekomme aber nur ein leeres Fenster. Warum?

    Alternativ habe ich folgenden Quellcode:
    Code (Java):

    public void start2()
       {
           JFrame f1 = new JFrame();
           f1.setSize(500, 500);
           f1.setLocation(20, 20);
           JPanel p1 = new JPanel();
           p1.setLayout(new GridBagLayout());
           GridBagConstraints gbc = new GridBagConstraints();
           gbc.weightx = 20;
           gbc.weighty = 20;
           for(int i = 0; i < 20; i++)
           {
               for(int e = 0; e < 20; e++)
               {
                   int i1 = i;
                   int e1 = e;
                   gbc.gridx = i1;
                   gbc.gridy = e1;
                   p1.add(new Canvas() {
                       public void paint(Graphics g)
                       {
                           
                           Toolkit t = Toolkit.getDefaultToolkit();
                           Image j = t.getImage("img/leer.png");
                           g.drawImage(j, 0, 0, this);
                       }
                   },gbc);
               }
           }
           f1.add(p1);
           f1.setVisible(true);
       }
     
    PS: Die notwendigen Bibliotheken habe ich importiert.
     
    Zuletzt bearbeitet: 7. Dez. 2018
  2. Vielleicht hilft dir dieses Training hier weiter.
  3. mihe7
    mihe7 Bekanntes Mitglied
    Canvas ist eine AWT-Komponente; die solltest Du nicht unbedingt in Swing-Anwendungen benutzen. Das aber nur nebenbei.

    Du fügst Deine Komponente 400 mal in das JFrame ein - und zwar immer auf den gleichen "Fleck" (JFrame verwendet standardmäßig ein BorderLayout und add ohne Layout-Parameter fügt ins Zentrum ein).

    Ich weiß nicht, was Du letztlich vorhast: wenn Du wirklich Komponenten haben willst, dann würde ich JLabel verwenden, das kann Bilder anzeigen (Du brauchst paint/paintComponent nicht zu überschreiben). Als Layout würde sich in dem Fall das GridLayout geradezu anbieten. Ich würde das Bild aber nur einmal laden und nicht 400-mal.

    Wenn Du selbst eine Komponente bauen willst, die halt das Bild in einem 20x20-Gitter anzeigt, leite z. B. von JComponent ab, überschreibe getPreferredSize und paintComponent.
     
    dereki2000 gefällt das.
  4. dereki2000
    dereki2000 Neues Mitglied
    Warum muss ich denn getPreferredSize() überschreiben?
     
  5. DerWissende
    DerWissende Bekanntes Mitglied
    mihe7 meint bestimmt getPreferredSize angeben. ;)
     
    dereki2000 gefällt das.
  6. dereki2000
    dereki2000 Neues Mitglied
    Meint ihr vielleicht setPreferredSize()? Das würde mir ja einleuchten, weil ich da ja einen neuen Wert setze. Mit getPreferredSize() lese ich den doch nur aus.
     
  7. DerWissende
    DerWissende Bekanntes Mitglied
    Kann auch sein, ich habe mihe7s Intention noch nich ganz genau verstanden....

    Überschreiben geht auch....

    Genrell: Es gibt (leider) keine Swing Komponente schon fertig dafür....
    Meherere Wege führen nach Rom. Weiterlesen:
    https://stackoverflow.com/questions...s-grid-like-layout-with-column-and-row-labels
    https://stackoverflow.com/questions/34036216/drawing-java-grid-using-swing
    https://stackoverflow.com/questions/36380516/drawing-a-grid-in-a-jframe

    Canvas scheint nicht unbedingt so falsch zu sein wie mihe7s Annahme. ;)
     
  8. dereki2000
    dereki2000 Neues Mitglied
    Naja, es soll am Ende halt keine Tabelle, sondern ein Spielfeld sein, und die Bilder die ich einfüge stellen halt die Elemente dar.

    Aber danke erstmal für die Antworten, hat mir sehr geholfen.:D
     
  9. mihe7
    mihe7 Bekanntes Mitglied
    Müssen tust Du gar nichts. Ich überschreibe getPreferredSize aus zwei Gründen
    1. um die Insets korrekt zu berücksichtigen
    2. ggf. um die Größe richtig berechnen zu können (spielt hier aber eher so gut wie keine Rolle)
     
    DerWissende gefällt das.
  10. Wenn du Java lernen möchtest, empfehlen wir dir dieses Online-Training hier
Passende Stellenanzeigen aus deiner Region:





Die Seite wird geladen...

Canvas zeichnet nicht - Ähnliche Themen

canvas zeichnet nichts
canvas zeichnet nichts im Forum Java Basics - Anfänger-Themen
JavaFX Menubar wird von Canvas überzeichnet
JavaFX Menubar wird von Canvas überzeichnet im Forum AWT, Swing, JavaFX & SWT
Canvas in ScrollPane wird beim scrollen immer neu gezeichnet
Canvas in ScrollPane wird beim scrollen immer neu gezeichnet im Forum AWT, Swing, JavaFX & SWT
Bild wird auf Canvas in Applet nicht gezeichnet
Bild wird auf Canvas in Applet nicht gezeichnet im Forum AWT, Swing, JavaFX & SWT
Canvas: String wird nicht gezeichnet
Canvas: String wird nicht gezeichnet im Forum AWT, Swing, JavaFX & SWT
Thema: Canvas zeichnet nicht