Schon wieder ein Problem mit paintComponent().

Status
Nicht offen für weitere Antworten.
B

BrooKy

Gast
Hallo nochmal,

mein Zeichenprog ist fast fertig, allerdings hab ich noch 2 kleine Probleme:
1. Beim Minimieren des Fensters verschwindet alles bisher gezeichnete
2. Beim Aufruf der paintComponent-Methode wird irgendein komischer Murks mitgezeichnet, der Teile aus dem Menu von der linken Seite mitmalt.

Das erste Problem ist eigentlich weniger wild, aber Nummer 2 ist ziemlich blöde. Ich fürchte, ich hab den Graphics-Krams noch nicht so ganz durchblickt...

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Paint extends JFrame {
	Container c;
	Linie l = new Linie();
	JPanel menu;
	JComboBox penc;
	JComboBox bgc;
	String[] auswahl = {"Schwarz", "Weiss", "Blau", "Gelb", "Grün", "Rot"};
	Color[] colors = {Color.BLACK, Color.WHITE, Color.BLUE, Color.YELLOW, Color.GREEN, Color.RED};

	/**
	 * Erzeugt 2 JComboBoxes für die Auswahl der Farben, ein JPanel mit einem Menu und fügt
	 * alle Komponenten ein  
	 */
	public Paint(){		
		c = getContentPane();
		c.setLayout(new BorderLayout());
	
		bgc = new JComboBox(auswahl);
		bgc.addActionListener(new BgListener());
		penc = new JComboBox(auswahl);
		penc.addActionListener(new PenListener());
		
		menu = new JPanel();
		menu.setLayout(new GridLayout(25,1));
		menu.add(new JLabel(" Hintergrund:"));
		menu.add(bgc);
		menu.add(new JLabel(" Stift:"));
		menu.add(penc);
		
		c.add(menu, BorderLayout.WEST);
		c.add(l, BorderLayout.CENTER);	
	}
	
	/**
	 * Veranlasst die Änderung der Hintergrundfarbe
	 */
	class BgListener implements ActionListener {
		public void actionPerformed (ActionEvent e) {
			l.setBackground(colors[bgc.getSelectedIndex()]);
		}
	}
	
	/**
	 * Veranlasst die Änderung der Stiftfarbe
	 */
	class PenListener implements ActionListener {
		public void actionPerformed (ActionEvent e) {
			l.setPenColor(colors[penc.getSelectedIndex()]);
		}
	}
	
	/** 
	 * Erzeugt ein neues Fenster
	 * @param args
	 */
	public static void main(String[] args) {
		Paint fenster = new Paint();
		fenster.setSize(800,600);
		fenster.setTitle("Tolles Java-Paint");
		fenster.setVisible(true);
		fenster.setResizable(false);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
	}
}

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Linie extends JPanel {

	private int xAlt, yAlt, xNeu, yNeu;
	private boolean paintBG = true;
	private Color penColor = Color.BLACK;
	
	public Linie () {
		super.setBackground(Color.BLACK);
		addMouseListener(new MHandler());         
		addMouseMotionListener(new MMHandler()); 
	}
	
	/** 
	 * Überschriebene paintComponent-Methode, die zunächst gegebenenfalls den Hintergrund
	 * und dann die neue Linie zeichnet. 
	 */
	public void paintComponent (Graphics g) {
		if (paintBG) {
			super.paintComponent(g);
			paintBG = false;
		}
		g.setColor(penColor);                    
		g.drawLine(xAlt, yAlt, xNeu, yNeu);            
		xAlt = xNeu; 
		yAlt = yNeu; 
	}	
	/**
	 * Ändert die Farbe des Hintergrundes
	 * @param c Neue Farbe des Hintergrundes
	 */
	public void setBackground (Color c) {
		super.setBackground(c);
		paintBG = true;
		repaint();
	}
	/**
	 * Ändert die Farbe des Linie
	 * @param c Neue Farbe der Linie
	 */
	public void setPenColor (Color c) {
		penColor = c;
	}
	
	/** 
	 * Speichert bei Tastendruck die aktuelle Maus-Position
	 */
	class MHandler extends MouseAdapter {
	    public void mousePressed (MouseEvent e) {
			xAlt = e.getX();                            
			yAlt = e.getY();                            
		}
	}

	/**
	 * Speichert die Maus-Position bei Loslassen der Taste und veranlasst das Zeichnen der Linie
	 */
	class MMHandler extends MouseMotionAdapter {
		public void mouseDragged (MouseEvent e) {
			xNeu = e.getX(); 
			yNeu = e.getY();           
			repaint();
		}
	}
}
 

André Uhres

Top Contributor
Code:
/*
 * Paint.java
 */
//package paint;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Paint extends JFrame {
    Container c;
    Linie l = new Linie();
    JPanel menu;
    JComboBox penc;
    JComboBox bgc;
    String[] auswahl = {"Schwarz", "Weiss", "Blau", "Gelb", "Grün", "Rot"};
    Color[] colors = {Color.BLACK, Color.WHITE, Color.BLUE, Color.YELLOW, Color.GREEN, Color.RED};
    /**
     * Erzeugt 2 JComboBoxes für die Auswahl der Farben, ein JPanel mit einem Menu und fügt
     * alle Komponenten ein
     */
    public Paint(){
        c = getContentPane();
        c.setLayout(new BorderLayout());
        bgc = new JComboBox(auswahl);
        bgc.addActionListener(new BgListener());
        penc = new JComboBox(auswahl);
        penc.addActionListener(new PenListener());
        menu = new JPanel();
        menu.setLayout(new GridLayout(25,1));
        menu.add(new JLabel(" Hintergrund:"));
        menu.add(bgc);
        menu.add(new JLabel(" Stift:"));
        menu.add(penc);
        c.add(menu, BorderLayout.WEST);
        c.add(l, BorderLayout.CENTER);
    }
    /**
     * Veranlasst die Änderung der Hintergrundfarbe
     */
    class BgListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            l.doSetBackground(colors[bgc.getSelectedIndex()]);
        }
    }
    /**
     * Veranlasst die Änderung der Stiftfarbe
     */
    class PenListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            l.setPenColor(colors[penc.getSelectedIndex()]);
        }
    }
    /**
     * Erzeugt ein neues Fenster
     */
    public static void main(String[] args) {
        Paint fenster = new Paint();
        fenster.setSize(800,600);
        fenster.setTitle("Tolles Java-Paint");
        fenster.setVisible(true);
        fenster.setResizable(false);
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
Code:
/*
 * Linie.java
 */
//package paint;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class Linie extends JPanel {
    private int xAlt, yAlt, xNeu, yNeu;
    private Color penColor = Color.BLACK;
    private Color bgColor = Color.BLACK;
    private Image image;
    private Graphics2D g2d;
    public Linie() {
        setBackground(bgColor);
        addMouseListener(new MHandler());
        addMouseMotionListener(new MMHandler());
    }
    public void doPaint() {
        g2d.setColor(penColor);
        g2d.drawLine(xAlt, yAlt, xNeu, yNeu);
        xAlt = xNeu;
        yAlt = yNeu;
        repaint();
    }
    /**
     * Überschriebene paintComponent-Methode, die zunächst gegebenenfalls den Hintergrund
     * und dann die neue Linie zeichnet.
     */
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (image == null) {
            image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
            g2d = (Graphics2D)image.getGraphics();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            // Make background transparent:
            Color transparent = new Color(0, 0, 0, 0);
            g2d.setColor(transparent);
            g2d.setComposite(AlphaComposite.Src);
            g2d.fillRect(0, 0, getWidth(), getHeight());
            //set pen color:
            g2d.setColor(penColor);
        }
        Rectangle r = g.getClipBounds();
        g.drawImage(image, r.x, r.y, r.width+r.x, r.height+r.y,
                r.x, r.y, r.width+r.x, r.height+r.y,  null);
    }
    /**
     * Ändert die Farbe des Hintergrundes
     */
    public void doSetBackground(Color c) {
        setBackground(c);
        repaint();
    }
    /**
     * Ändert die Farbe des Linie
     */
    public void setPenColor(Color c) {
        penColor = c;
    }
    /**
     * Speichert bei Tastendruck die aktuelle Maus-Position
     */
    class MHandler extends MouseAdapter {
        public void mousePressed(MouseEvent e) {
            xAlt = e.getX();
            yAlt = e.getY();
        }
    }
    /**
     * Speichert die Maus-Position bei Loslassen der Taste und veranlasst das Zeichnen der Linie
     */
    class MMHandler extends MouseMotionAdapter {
        public void mouseDragged(MouseEvent e) {
            xNeu = e.getX();
            yNeu = e.getY();
            doPaint();
        }
    }
}
 

André Uhres

Top Contributor
Ich hab "Linie" noch mal angepasst:
jetzt bleibt die Zeichung im Vordergund erhalten wenn du einen anderen Hintergrund wählst.
Ich hab dazu den Bildhintergrund transparent gemacht damit der Hintergrund vom JPanel durchscheinen kann.
Viel Spaß,
André
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Und schon wieder die Linien (Problem beim überzeichnen) AWT, Swing, JavaFX & SWT 4
M Java anwendung VOR vollbildspielen (schon wieder...) AWT, Swing, JavaFX & SWT 5
C Schon wieder JTable AWT, Swing, JavaFX & SWT 7
S ProgressBar newRunnable (schon wieder!) AWT, Swing, JavaFX & SWT 9
P schon wieder schlange AWT, Swing, JavaFX & SWT 8
K Und schon wieder JInternalFrame AWT, Swing, JavaFX & SWT 2
dzim JetBrains Compose - hat das schon jemand probiert? AWT, Swing, JavaFX & SWT 3
B Swing Locale wechseln, nachdem UIManager schon initialisiert ist AWT, Swing, JavaFX & SWT 5
Binary.Coder Netbeans GUI zu Eclipse (schon gegooglet und einiges ausprobiert). AWT, Swing, JavaFX & SWT 4
N JComboBox schon zum Teil aufgeklappt AWT, Swing, JavaFX & SWT 7
J Swing - ich sehe keine Linie, andere schon AWT, Swing, JavaFX & SWT 6
GilbertGrape JTable mit Combobox-Editierung schon nach einem Klick AWT, Swing, JavaFX & SWT 7
oliver1974 Wer hat QT Jambi schon probiert? AWT, Swing, JavaFX & SWT 5
M Ist Swing schon fertig? AWT, Swing, JavaFX & SWT 3
F SkinLF - GTK Icons werden nicht genutz - KDE schon - why? AWT, Swing, JavaFX & SWT 8
D Prüfen, ob Fenster bereits schon geöffnet ist AWT, Swing, JavaFX & SWT 1
richis-fragen Wie kann man den RowSorter dazu bringen die ursprünglich liste wieder anzuzeigen. AWT, Swing, JavaFX & SWT 28
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
J JOptionPane ruft sich selbst immer wieder neu auf AWT, Swing, JavaFX & SWT 3
R JOptionPane schließt sich nicht wieder AWT, Swing, JavaFX & SWT 2
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
T SWT Mysql Tabelle zeigt immer nur den ersten Wert immer wieder an AWT, Swing, JavaFX & SWT 3
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
F Swing Java Swing Array in Datei und wieder raus AWT, Swing, JavaFX & SWT 7
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
P jframe setVisible(false) wieder sichtbar machen? AWT, Swing, JavaFX & SWT 4
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
A jformattedtextfield unsichtbar und wieder sichtbar machen AWT, Swing, JavaFX & SWT 13
J Swing Fenster lässt sich nach Schließung nicht wieder öffnen AWT, Swing, JavaFX & SWT 4
O JTable zeigt die alte Daten wieder AWT, Swing, JavaFX & SWT 23
A AWT Nach dem generieren von bildern verschwinden diese wieder AWT, Swing, JavaFX & SWT 9
J Mal wieder Probleme mit paintComponent AWT, Swing, JavaFX & SWT 3
C SWT CTabItem wieder sichtbar machen AWT, Swing, JavaFX & SWT 3
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
R Komponente wieder entfernen AWT, Swing, JavaFX & SWT 13
E wieder einmal JTable AWT, Swing, JavaFX & SWT 5
A Fokus wieder in ein JTextField setzen AWT, Swing, JavaFX & SWT 4
L Buttons aus Arrayliste erstellt wie komm ich nun wieder an das Oobjekt aus der arrayliste ran AWT, Swing, JavaFX & SWT 3
Z Swing Buttons wieder entfernen vom Bildschirm AWT, Swing, JavaFX & SWT 5
O Swing JButton werden richtig gewechselt aber die Maus macht die alten wieder Sichtbar?? AWT, Swing, JavaFX & SWT 5
N gezeichnete Graphiken speichern und wieder anzeigen AWT, Swing, JavaFX & SWT 8
hdi SWT Operation auf GUI-Komponente kommt mal wieder nicht an... AWT, Swing, JavaFX & SWT 9
Ollek Swing JPnales nach bestimmtenVorgang wieder anzeigen AWT, Swing, JavaFX & SWT 4
P Swing Hintergrundfarbe auslesen und wieder setzen AWT, Swing, JavaFX & SWT 4
M AWT Zurücksetzbutton, wieder auf das original Bild AWT, Swing, JavaFX & SWT 3
M Fenster nach minimierung zum tray wieder öffnen AWT, Swing, JavaFX & SWT 3
E Swing Wieder ein Bild einfügen AWT, Swing, JavaFX & SWT 2
Luy Per TAB-Taste aus TextArea wieder raus? AWT, Swing, JavaFX & SWT 5
D Swing JMenu wieder schließen lassen AWT, Swing, JavaFX & SWT 7
F JFileChooser mal wieder AWT, Swing, JavaFX & SWT 2
B Wie kann ich ein event wieder beseitigen AWT, Swing, JavaFX & SWT 2
hdi Swing mal wieder EDT -> nichts passiert AWT, Swing, JavaFX & SWT 20
S Feintuning, mal wieder Threading + swing ... AWT, Swing, JavaFX & SWT 8
P JTable...mal wieder AWT, Swing, JavaFX & SWT 7
S JDialog startet immer wieder neu AWT, Swing, JavaFX & SWT 2
A Wie werde ich beim JTable die Selection wieder los? AWT, Swing, JavaFX & SWT 6
PAX Iconified JFrame per Code wieder anzeigen lassen (deiconify) AWT, Swing, JavaFX & SWT 2
T Mal wieder Swing GUI AWT, Swing, JavaFX & SWT 7
hdi repaint() mag mal wieder nicht. AWT, Swing, JavaFX & SWT 9
T JCheckBox deselektieren (Haken wieder entfernen) - wie? AWT, Swing, JavaFX & SWT 5
M ich will die alten "alte JButtons"wieder haben AWT, Swing, JavaFX & SWT 6
G Ein jTextField im laufe das Programmes immer wieder updaten AWT, Swing, JavaFX & SWT 2
G wieder mal das leidige thema listener AWT, Swing, JavaFX & SWT 3
G Drag and Drop mal wieder? AWT, Swing, JavaFX & SWT 2
C JTable. Mal wieder AWT, Swing, JavaFX & SWT 10
T Ich komme mal wieder nicht mit Swing und Image klar. AWT, Swing, JavaFX & SWT 5
G SWT Toolbar: Toolitem entfernen und wieder hinzufügen AWT, Swing, JavaFX & SWT 16
M wieder einmal JScrollPane und JList AWT, Swing, JavaFX & SWT 4
S getSize gibt keine Größe wieder AWT, Swing, JavaFX & SWT 4
T Linien zeichnen und wieder löschen AWT, Swing, JavaFX & SWT 9
V mal wieder das gute alte gridbaglayout AWT, Swing, JavaFX & SWT 4
W JTabele Aktualisieren - Wieder einmal AWT, Swing, JavaFX & SWT 4
S JScrollPane mal wieder AWT, Swing, JavaFX & SWT 2
R JLabel Icon wieder entfernen AWT, Swing, JavaFX & SWT 4
A Wieder einmal Event-Dispatch-Thread AWT, Swing, JavaFX & SWT 5
R Mal wieder JTable AWT, Swing, JavaFX & SWT 11
I JProgressBar String anzeigen, danach wieder normale Ansicht AWT, Swing, JavaFX & SWT 3
G mal wieder table. AWT, Swing, JavaFX & SWT 3
X wieder mal ein prob mit dnd AWT, Swing, JavaFX & SWT 14
Luma Alle Fenster verstecken und wieder sichtbar machen? AWT, Swing, JavaFX & SWT 6
S JFrame minimieren und wieder herstellen AWT, Swing, JavaFX & SWT 2
J Spalte in JTable aus- und wieder einblenden AWT, Swing, JavaFX & SWT 10
R Anonymen CaretListener wieder entfernen AWT, Swing, JavaFX & SWT 4
G JTabbedPane: Tabs verschwinden lassen und wieder anzeigen AWT, Swing, JavaFX & SWT 3
G TableModel von JTable wieder entfernen AWT, Swing, JavaFX & SWT 10
juppi JFrame will nicht wieder verschwinden AWT, Swing, JavaFX & SWT 2
S Wieder eine Frage zu javax.swing.text AWT, Swing, JavaFX & SWT 2
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
S Layout - Problem AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
Umb3rus JavaFX Problem mit PropertyValueFactory: can not read from unreadable property AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben