2017-11-21 4 views
1

ich diese Methoden dieses sehr einfachen Programms geschrieben (Ich versuche, herauszufinden, wie JFrame funktioniert):Hält Druck weißes Fenster

import java.util.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.*; 

import javax.imageio.*; 
import javax.swing.*; 

public class Display extends JFrame { 
    private int larg = 512; 
    private int lung = 512; 

    public Display() { 
     setSize(larg, lung); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

    public void draw(Graphics gr) { 
     Color color = new Color(100, 200, 0); 
     gr.setColor(color); 
     gr.fillRect(0, 0, larg, lung); 
    } 

    public static void main(String[] args) { 
     new Display(); 
    } 
} 

aber sie halten ein weißes Fenster Druck und nicht mit einem (100, 200 , 0) Fenster, warum ist das?

+0

[MCVE] oder es nicht happent –

+0

Das Programm ist sehr einfach, ich lerne, wie JFrame zu verwenden, ... Wenn Sie es wünschen, poste ich den ganzen Code – dulindraxe

+0

Es ist einfach, aber irgendwie ist es falsch, und ich bin mir nicht sicher, wie ich es sagen soll. Was nennt "draw (...)" übrigens? Wird es irgendwo innerhalb einer Malmethode aufgerufen? –

Antwort

3

OK, Sie erstellen Ihre eigene Malmethode, zeichnen und gehen davon aus, dass sie irgendwie magisch aufgerufen wird. Dies wird nicht passieren und Swing-Grafiken funktionieren nicht. Google und gehen Sie durch die Tutorials, aber wenn Sie das tun, werden Sie sehen, dass Sie eine echte Malmethode überschreiben müssen, eine in der übergeordneten Komponente (paint für JFrame, paintComponent für JPanel zum Beispiel), und Sie müssen machen sicher, dass Sie die Methode korrekt überschreiben, in der Regel mit der @Override Annotation oder es wird nicht funktionieren.

Die Tutorials sagen Ihnen auch, dass Sie nicht direkt im JFrame zeichnen, sondern in der paintComponent-Überschreibung einer JPanel.

Moral der Geschichte: Vermeide es zu erraten, wie die Programmierung funktioniert, aber gehe stattdessen zu den primären Quellen, hier zu den Tutorials, um zu sehen, wie es richtig gemacht wird.

Zum Beispiel:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics;  
import javax.swing.*; 

@SuppressWarnings("serial") 
public class MyDraw extends JPanel { 

    private static final Color RECT_COLOR = new Color(100, 200, 0); 
    private int larg; 
    private int lung; 

    public MyDraw(int larg, int lung) { 
     this.larg = larg; 
     this.lung = lung; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(RECT_COLOR); 
     g.fillRect(0, 0, larg, lung); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(larg, lung); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("MyDraw"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     int larg = 512; 
     int lung = 512; 
     frame.getContentPane().add(new MyDraw(larg, lung)); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

Schwingen-Malerei-Tutorials: Lesson: Performing Custom Painting

+0

okay, danke auch für den Tipp! – dulindraxe

+1

@dulindraxe: siehe bearbeiten und [link] (https://docs.oracle.com/javase/tutorial/uiswing/painting/index.html) –

+0

danke noch einmal, ich wusste nicht, dass es dazu erforderlich ist – dulindraxe