Swing paintComponent problem

Status
Nicht offen für weitere Antworten.

Tankpope

Neues Mitglied
Hallo,
ich bin grade ein bissel am Verzweifeln und finde meinen Fehler nicht. Warscheinlich sehe ich den Wald vor lauter Bäumen nicht.

Ich schreibe grade ein Programm bei dem bei einem Mausklick ein Kreuz auf ein JPanel gezeichnet werden soll.

Hierzu habe ich mir die Klasse DrawPoint geschrieben. Der im Konstuktor der Punkt für den Kreuz Mittelpunkt übergeben wird.

Java:
import java.awt.Graphics;
import java.awt.Point;
import javax.swing.JComponent;


public class drawPoint extends JComponent{

	private int X,Y;
	
	public drawPoint(Point p)
	{
        this.setBounds(p.x-5, p.y-5, 10, 10);
        this.setLocation(p);
        X = p.x;
        Y = p.y;
	}
	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawLine(X-5, Y, X+5, Y);
		g.drawLine(X, Y-5, X, Y+5);
	}
	
}

Aufgerufen wird das ganze in einer Klasse die nur die Anwendungsmethoden enthält.

Zeichenbrett ist hierbei vom Typ JPanel
GUI ist vom Typ JFrame

Java:
	@Override
	public void mouseReleased(MouseEvent e) 
       {
		drawPoint dp = new drawPoint(e.getPoint());
		GUI.Zeichenbrett.add(dp);
		GUI.Zeichenbrett.repaint();
	}

Das Problem bei dem Ganzen ist das bei einem Mausklick die paintComponent Methode aufgerufen wir aber leider kein Kreuz gezeichnet wird. Setze ich die Backgoundcolor von dp wird an der Stelle wie es sein sollte ein Farbiges Rechteck in den angegebenen bounds gezeichnet, also legt er den drawpoint auf jeden fall an, paintComponent wird auch aufgerufen. Woran könnte es noch liegen das er meine drawLine anweisungen in paintComponent nicht ausführt.

schon mal thx
Michael
 

hdi

Top Contributor
Das Problem ist, dass X und Y die Koordinaten im Koordinatensystem des Frames sind, aber das Graphics-Objekt, das in die paintComponent hineingereicht wird, malt immer innerhalb der eigenen Komponente, und jegliche Koordinaten beziehen sich auf das Koordinaten-System der Komponente.

zB du klickst bei (100,100). Dann platzierst du zwar im Frame an dieser Stelle die Komponente, aber beim Zeichnen malst du in der Komponente an der Stelle (100,100). Aber das Ding ist nur 10x10 Pixel groß.

Klar, was ich meine?
Entweder man nutzt X und Y in der paintComponent, in dem man direkt in ein großes Panel mit allen Kreuzen reinmalt (d.h. dein Kreuz weiss nicht selber wo es ist), oder man erzeugt für jedes Kreuz eine eigenständige Komponente. Du hast jetzt beides gemacht, und das funktioniert halt nicht weil du 2 verschiedene Koordinatensysteme vermischt ;)

Java:
 @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int h = getHeight(); 
        int w = getWidth(); 
        int centerx = w/2;
        int centery = h/2;
        g.drawLine(0, centery, w, centery);
        g.drawLine(centerx, 0, centerx, h);
    }

...und das dann dieses kleine Koordinatensystem im Fenster wiederum an der richtigen Stelle platziert ist, dafür hast du ja per setBounds mit X und Y gesorgt.

PS: Ein repaint() ist nicht nötig nach dem adden. Wobei beim null-Layout bin ich mir nicht sicher. Aber versuch's mal ohne.

PPS: Du verdrehst die Namenskonventionen von Klassen und Variablen.
Variablen schreibt man in camelCase, und Klassen in CamelCase, du hast es weitestgehend genau andersherum gemacht.
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Ein kleines Beispiel:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DrawingDemo extends JFrame {
    private final JPanel panel;
    public DrawingDemo() {
        super("Drawing Demo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        panel = new JPanel(null);
        panel.setBackground(Color.WHITE);
        add(panel);
        panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(final MouseEvent e) {
                Point location = e.getPoint();
                createPoint(location);
            }
        });
    }
    public void createPoint(final Point location) {
        DrawPoint drawPoint = new DrawPoint(location);
        panel.add(drawPoint, 0);
        drawPoint.setForeground(Color.LIGHT_GRAY);
        drawPoint.requestFocusInWindow();
    }
    public static void main(final String[] args) {
        Runnable gui = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                new DrawingDemo().setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
class DrawPoint extends JComponent {
    private final JPopupMenu popup;
    private final int SIZE = 10;
    private final Point location;
    public DrawPoint(final Point location) {
        this.location = location;
        setBounds(location.x - SIZE / 2, location.y - SIZE / 2, SIZE + 1, SIZE + 1);
        setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        ToolTipManager.sharedInstance().registerComponent(this);
        popup = new JPopupMenu();
        popup.add(new JMenuItem("Test 1"));
        popup.add(new JMenuItem("Test 2"));
        setComponentPopupMenu(popup);
        addFocusListener(new FocusListener() {
            public void focusGained(final FocusEvent e) {
                repaint();
            }
            public void focusLost(final FocusEvent e) {
                repaint();
            }
        });
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(final MouseEvent e) {
                getParent().setComponentZOrder(DrawPoint.this, 0);
                requestFocusInWindow();
            }
        });
    }
    @Override
    public String getToolTipText(final MouseEvent event) {
        return location.toString();
    }
    @Override
    protected void paintComponent(final Graphics g) {
        super.paintComponent(g);
        //set color:
        g.setColor(getForeground());
        if(hasFocus()){
            g.setColor(getForeground().darker().darker());
        }
        //paint cross:
        g.drawLine(0, SIZE / 2, SIZE, SIZE / 2);
        g.drawLine(SIZE / 2, 0, SIZE / 2, SIZE);
    }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
P Swing problem mit paintComponent AWT, Swing, JavaFX & SWT 2
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
Z Swing paintcomponent und menbar Problem AWT, Swing, JavaFX & SWT 3
C Performance-Problem beim Überschreiben von paintComponent() AWT, Swing, JavaFX & SWT 2
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
P Game of Life - PaintComponent-Problem / Timer? AWT, Swing, JavaFX & SWT 8
G paintComponent Problem AWT, Swing, JavaFX & SWT 6
L Problem mit paintComponent() under java < 1.6 under Windo AWT, Swing, JavaFX & SWT 3
D performance problem: paintcomponent, alphacomp, bufferedImag AWT, Swing, JavaFX & SWT 10
K Problem repaint()->paintComponent AWT, Swing, JavaFX & SWT 9
B Schon wieder ein Problem mit paintComponent(). AWT, Swing, JavaFX & SWT 2
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
H new Operator in paintComponent - Speicherprobleme vorprogrammiert? AWT, Swing, JavaFX & SWT 2
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
G update, paintComponent AWT, Swing, JavaFX & SWT 1
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
C Objekt an paintComponent weitergeben AWT, Swing, JavaFX & SWT 1
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
D PaintComponent wird nicht aufgerufen AWT, Swing, JavaFX & SWT 3
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I (JPanel) paintComponent mit Zeitverschiebung (Sleep/Wait) AWT, Swing, JavaFX & SWT 1
K Swing paintComponent, JPanel auslagern, ChangeEvents AWT, Swing, JavaFX & SWT 7
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
B AWT paintComponent wird nur 2 mal ausgeführt?! AWT, Swing, JavaFX & SWT 5
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
D paintComponent() mit transparentem Hintergrund. AWT, Swing, JavaFX & SWT 0
G Swing Flackern nach Override von paintComponent() AWT, Swing, JavaFX & SWT 3
M Swing paintComponent in rekusivem JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 2
M DefaultTableModel ruft paintComponent auf ! AWT, Swing, JavaFX & SWT 4
T Swing paintComponent(); AWT, Swing, JavaFX & SWT 24
K Swing JButton paintComponent überschreiben AWT, Swing, JavaFX & SWT 5
Kenan89 2D-Grafik paintComponent quetsch alles in Panel AWT, Swing, JavaFX & SWT 26
B 2D-Grafik paintComponent für rechteckigen Bereich? AWT, Swing, JavaFX & SWT 6
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
K paintComponent nicht aufgerufen AWT, Swing, JavaFX & SWT 2
J Mal wieder Probleme mit paintComponent AWT, Swing, JavaFX & SWT 3
S auf paintComponent() warten AWT, Swing, JavaFX & SWT 34
W JPanel Überschreiben // paintComponent? AWT, Swing, JavaFX & SWT 4
propra Wieso wird paintComponent() beim Start 2 malausgeführt? AWT, Swing, JavaFX & SWT 4
T BufferedImage bei paintComponent AWT, Swing, JavaFX & SWT 6
P JLabel paintComponent AWT, Swing, JavaFX & SWT 3
S Image wird nicht (immer) in paintComponent gezeichnet? AWT, Swing, JavaFX & SWT 6
R 2D-Grafik auf JPanel zeichen - ohne @Override paintComponent AWT, Swing, JavaFX & SWT 6
A Probleme mit paintComponent & BorderFactory AWT, Swing, JavaFX & SWT 2
A paintComponent AWT, Swing, JavaFX & SWT 4
T Rechtecke zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 3
R paintComponent direkt bei actionPerformed aufrufen AWT, Swing, JavaFX & SWT 2
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
K JPanel und paintComponent AWT, Swing, JavaFX & SWT 8
E 2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode? AWT, Swing, JavaFX & SWT 5
C Checkbox in Liste deaktivieren und paintComponent explizit aufrufen AWT, Swing, JavaFX & SWT 12
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
J paintComponent() übergeben AWT, Swing, JavaFX & SWT 4
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
kodela Swing paintComponent() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 19
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
E WARUM wird paintComponent nicht aufgerufen? AWT, Swing, JavaFX & SWT 12
C paintComponent mit Maus verschieben - wie? AWT, Swing, JavaFX & SWT 2
G Swing paintComponent Effizienz? AWT, Swing, JavaFX & SWT 4
R paintComponent Kollision AWT, Swing, JavaFX & SWT 2
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
A Probleme mit paintComponent() AWT, Swing, JavaFX & SWT 2
MrGe getWidth(); getHeight(); außerhalb von paintComponent AWT, Swing, JavaFX & SWT 4
A paintComponent überdeckt ... AWT, Swing, JavaFX & SWT 13
JFeel-x repaint für Aufruf von paintComponent-Klasse ungeeignet? AWT, Swing, JavaFX & SWT 11
F Wer ruft paintComponent() Methode auf? AWT, Swing, JavaFX & SWT 9
@ JPanel: kein paintComponent() trotz repaint() AWT, Swing, JavaFX & SWT 4
T paintComponent() überschreiben: Platz für Border freihalten? AWT, Swing, JavaFX & SWT 6
G paintComponent JPanel im JApplet AWT, Swing, JavaFX & SWT 2
X Speichern in der paintComponent() Methode AWT, Swing, JavaFX & SWT 15
W JLabel + paintComponent AWT, Swing, JavaFX & SWT 2
V Wieviel Logik in paintComponent? AWT, Swing, JavaFX & SWT 7
hdi super.paintComponent(g); soll nicht alles löschen AWT, Swing, JavaFX & SWT 2
G paintComponent() Methode für JPanel in NetBeans überschreibe AWT, Swing, JavaFX & SWT 2
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
N Probleme mit paintComponent und GradientPaint AWT, Swing, JavaFX & SWT 5
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
A Probelme mit großen BufferedImage in paintComponent AWT, Swing, JavaFX & SWT 7
C Bei Skalierung wird paintComponent() nicht aufgerufen,warum? AWT, Swing, JavaFX & SWT 4
G paintComponent wird nicht dargestellt AWT, Swing, JavaFX & SWT 5
T Kuchendiagramm - mit paintComponent nach JButton druck zeich AWT, Swing, JavaFX & SWT 4
R paintComponent wird anscheinend nicht aufgerufen AWT, Swing, JavaFX & SWT 2
T JPanel mit paintComponent methode im JInternalFrame AWT, Swing, JavaFX & SWT 3
M super.paintComponent(g); aufrufen oder nicht? AWT, Swing, JavaFX & SWT 8
M Unterschied zwischen paintComponent() und paint()? AWT, Swing, JavaFX & SWT 4
D JTextArea in der paintComponent () hinzufügen? AWT, Swing, JavaFX & SWT 9
raptorrs J2D paintComponent: Nur ganzzahlige (-int) Werte möglich? AWT, Swing, JavaFX & SWT 3
G Keine Anzeige von Grafik bei externem paintComponent-Aufruf AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben