Problem beim Einsatz von ScrollPane (Fenster spielt verrückt

Status
Nicht offen für weitere Antworten.

minos5000

Aktives Mitglied
Hi,

ich stehe vor dem Problem, daß ich in ein JPane zeichnen möchte, welches sich mit anderen Komponenten in einem Frame befindet. Das zeichnen klappt soweit, nur soll, falls ich über das Fenster hinauszeichne eine ScrollBar angezeigt werden. Bis jetzt muß ich das Fenster per Hand vergrößern, um Zeichnungen zu sehen, die über die ursprüngliche Fenstergröße hinausgehen. Das erscheinen der ScrollBars klappt auch (irgendwie) aber mein Problem ist, daß sich das Programm alles andere als so verhält, wie es soll. Beim starten ist außer dem Rahmen nichts zu sehen, sondern die Desktopelemente im Hintergrund, wenn ich anfange zu zeichnen sehe ich zwar die Linien, aber die Hintergrundfarbe spielt verrückt und wechselt von schwarz nach grau usw.

Ich habe verschiedenes im Internet zu dem Thema gelesen und nach meinem aktuellen Wissensstand gehe ich wie folgt vor:

Ein Panel nimmt ein ScrollPane auf, welches wiederum ein JPanel aufnimmt, in dem die Elemente gezeichnet werden. Nachdem ein zu zeichnendes Element hinzugefügt wurde, wird die Dimension des Panels überprüft und angepaßt.

Das Programm selber dient momentan nur dazu, anhand von mousePressed und mouseDragged Linien zu zeichnen. Die Linien werden in eine Liste aufgenommen und nach jeder Aktion mit der Maus an das Pane innerhalb des ScrollPane zum zeichnen übergeben.

Das Panel, das ein ScrollPane aufnimmt und auf Mausereignisse reagiert:
Code:
import java.awt.RenderingHints.Key;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.AffineTransform;
import java.text.AttributedCharacterIterator;
import javax.naming.LinkLoopException;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;

public class DrawComponent extends JPanel implements MouseListener, MouseMotionListener {
    
    private int x1;
    private int x2;
    private int y1;
    private int y2;
    private java.util.List<int[]> lines = new LinkedList<int[]>();
    private DrawingPane drawingPane;
    private JScrollPane scroller;
    
    public DrawComponent() {
        this.setLayout(new BorderLayout());//super(new BorderLayout());
        drawingPane = new DrawingPane();
        drawingPane.addMouseListener(this);
        drawingPane.addMouseMotionListener(this);
        scroller = new JScrollPane(drawingPane);
        scroller.setPreferredSize(this.getSize());
        add(scroller, BorderLayout.CENTER);
    }
    
    public void mouseExited(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseClicked(MouseEvent e) {}

    public void mousePressed(MouseEvent e) {
        x1 = e.getX();
        y1 = e.getY();
        x2 = e.getX();
        y2 = e.getY();
        int[] coords = {x1,y1,x2,y2};  
        lines.add(coords);
    }
    
    public void mouseReleased(MouseEvent e) {}
    
    public void mouseDragged(MouseEvent e) {
        lines.remove(lines.size()-1);
        int[] coords = {x1, y2, e.getX(), e.getY()};
        lines.add(coords);
        drawingPane.drawLines(lines);
        drawingPane.setPreferredSize(drawingPane.getSize());
        drawingPane.revalidate();
        drawingPane.repaint();
    }

    
    public void mouseMoved(MouseEvent e) {
    }
    
    public void removeLast() {}
    
    public void selectComponent() {}
}


Das Panel, das sich innerhalb des ScrollPane befindet und die Elemente zeichnet:
Code:
import javax.swing.JPanel;
import java.awt.*;
import java.util.*;

public class DrawingPane extends JPanel {
    
    private java.util.List<int[]> lines;
    
    public DrawingPane() {
        this.setBackground(new Color(0,0,0,50));

    }
    
    public void drawLines(java.util.List lines) {
        this.lines = lines;
    }
    
    public Dimension getArea() {
        int minX = 0;
        int minY = 0;
        int width = 0;
        int height = 0;
        
        for(Iterator i = lines.iterator(); i.hasNext();) {
            int[] coords = (int[])i.next();
            if(coords[0] > width)
                width = coords[0];
            if(coords[2] > width)
                width = coords[2];
            if(coords[1] > height)
                height = coords[1];
            if(coords[3] > width)
                height = coords[3];
        }
        return new Dimension(width, height);
    }
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        for(Iterator i = lines.iterator(); i.hasNext();) {
            int[] coords = (int[])i.next();
            g.drawLine(coords[0], coords[1], coords[2], coords[3]);
        }
    }
}

Und zuguterletzt der Frame, der zur Anzeige der Komponenten dient:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JScrollPane;

public class Gui extends javax.swing.JFrame {
    
    private Point p;
    private DrawComponent drawComponent;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    
    /** Creates new form Gui */
    public Gui() {
        initComponents();
        this.setSize(800, 600);
        drawComponent = new DrawComponent();
        this.add(drawComponent, java.awt.BorderLayout.CENTER);
    }
    
    private void initComponents() {
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jMenu1.setText("Menu");
        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        pack();
    }
        
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Gui().setVisible(true);
            }
        });
    }

    
}

Ich hoffe, ich habe das ganze ausreichend beschrieben, so daß die Logik des Codes einigermaßen rüberkommen und mir jemand sagen kann, wo der Wurm steckt.


Viele Grüße,
Minos
 

Marco13

Top Contributor
Die Hintergrundfarbe war halbtransparent (alpha-Wert von 50)

Statt getArea wurde getSize aufgerufen (und in getArea war ein kleiner Fehler)

Die Zeichenfläche mußte noch geclear werden
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JScrollPane;
import javax.swing.JPanel;
import java.awt.*;
import java.util.*;
import java.awt.RenderingHints.Key;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.AffineTransform;
import java.text.AttributedCharacterIterator;
import javax.naming.LinkLoopException;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;


public class Gui extends javax.swing.JFrame {

    private Point p;
    private DrawComponent drawComponent;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;

    /** Creates new form Gui */
    public Gui() {
        initComponents();
        this.setSize(800, 600);
        drawComponent = new DrawComponent();
        this.add(drawComponent, java.awt.BorderLayout.CENTER);
    }

    private void initComponents() {
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jMenu1.setText("Menu");
        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        pack();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Gui().setVisible(true);
            }
        });
    }


}

class DrawingPane extends JPanel {

    private java.util.List<int[]> lines;

    public DrawingPane() {
        this.setBackground(new Color(0,0,0,0));

    }

    public void drawLines(java.util.List lines) {
        this.lines = lines;
    }

    public Dimension getArea() {
        int minX = 0;
        int minY = 0;
        int width = 0;
        int height = 0;

        for(Iterator i = lines.iterator(); i.hasNext();) {
            int[] coords = (int[])i.next();
            if(coords[0] > width)
                width = coords[0];
            if(coords[2] > width)
                width = coords[2];
            if(coords[1] > height)
                height = coords[1];
            if(coords[3] > height)
                height = coords[3];
        }
        return new Dimension(width, height);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.setColor(Color.WHITE);
        g.fillRect(0,0,getWidth(),getHeight());
        g.setColor(Color.BLACK);

        if (lines != null)
        {
            for(Iterator i = lines.iterator(); i.hasNext();) {
                int[] coords = (int[])i.next();
                g.drawLine(coords[0], coords[1], coords[2], coords[3]);
            }
        }
    }
}



class DrawComponent extends JPanel implements MouseListener, MouseMotionListener {

    private int x1;
    private int x2;
    private int y1;
    private int y2;
    private java.util.List<int[]> lines = new LinkedList<int[]>();
    private DrawingPane drawingPane;
    private JScrollPane scroller;

    public DrawComponent() {
        this.setLayout(new BorderLayout());//super(new BorderLayout());
        drawingPane = new DrawingPane();
        drawingPane.addMouseListener(this);
        drawingPane.addMouseMotionListener(this);
        scroller = new JScrollPane(drawingPane);
        scroller.setPreferredSize(this.getSize());
        add(scroller, BorderLayout.CENTER);
    }

    public void mouseExited(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseClicked(MouseEvent e) {}

    public void mousePressed(MouseEvent e) {
        x1 = e.getX();
        y1 = e.getY();
        x2 = e.getX();
        y2 = e.getY();
        int[] coords = {x1,y1,x2,y2};
        lines.add(coords);
    }

    public void mouseReleased(MouseEvent e) {}

    public void mouseDragged(MouseEvent e) {
        lines.remove(lines.size()-1);
        int[] coords = {x1, y2, e.getX(), e.getY()};
        lines.add(coords);
        drawingPane.drawLines(lines);
        drawingPane.setPreferredSize(drawingPane.getArea());
        drawingPane.revalidate();
        drawingPane.repaint();
    }


    public void mouseMoved(MouseEvent e) {
    }

    public void removeLast() {}

    public void selectComponent() {}
}
 

minos5000

Aktives Mitglied
getArea() funktioniert jetzt, danke für den Tipp.
Und diese seltsamen Farbspiele sind durch löschen des irrtümlichen Transparenzwertes auch weg.

Und ich bin gerade auch durch Zufall darauf gekommen, woher das andere Problem mit dem Fenster kam. Ich hatte in DrawingPane "lines" nicht initialisiert und es kam eine NullPointerException. Diese verschwand allerdings, sobald ich irgendwas in das Fenster gemalt hatte und so bin ich dann draufgekommen.


Gruß,
Minos
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
N Swing CardLayout: Problem beim Wechsel zwischen den JPanels AWT, Swing, JavaFX & SWT 3
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
S Anordnung von GUI-Komponenten mit LayouManger (Problem beim anzeigen von JTextField) AWT, Swing, JavaFX & SWT 5
A Swing Problem beim Neuerstellen einer Node AWT, Swing, JavaFX & SWT 4
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
B Swing Problem beim ActionListener AWT, Swing, JavaFX & SWT 5
K Swing Problem beim Zeichnen von Kreisen AWT, Swing, JavaFX & SWT 4
K JButton Problem beim Schriftfarbe Ändern AWT, Swing, JavaFX & SWT 2
P Problem beim erstellen eines JPanel in einem JFrame AWT, Swing, JavaFX & SWT 7
R Problem beim Anzeigen von Bildern auf JInternalFrame AWT, Swing, JavaFX & SWT 6
D 2D-Grafik Problem beim Drucken eines Grafik-Objekts AWT, Swing, JavaFX & SWT 2
M Problem beim Eventhandling AWT, Swing, JavaFX & SWT 5
B Problem beim laden von Bild mit getResource() AWT, Swing, JavaFX & SWT 3
T JSpinner in JTable: Problem beim Auslesen, funktioniert erst beim Zellwechsel AWT, Swing, JavaFX & SWT 7
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
C Performance-Problem beim Überschreiben von paintComponent() AWT, Swing, JavaFX & SWT 2
M Problem beim Zeichnen mit Path2D AWT, Swing, JavaFX & SWT 4
F Swing JTable: Problem beim zeile löschen AWT, Swing, JavaFX & SWT 3
G Problem beim setzen des Fokus AWT, Swing, JavaFX & SWT 4
Z Problem beim JTextField AWT, Swing, JavaFX & SWT 5
C Swing Problem beim 2. Öffnen eines JFrames AWT, Swing, JavaFX & SWT 9
1 Java.awt.Robot Problem beim Shift-Druck AWT, Swing, JavaFX & SWT 5
B Swing Problem beim Elemente zu JList hinzufügen AWT, Swing, JavaFX & SWT 5
F Problem beim Positionieren von Icon und Text in Button AWT, Swing, JavaFX & SWT 2
Developer_X Swing Problem beim "rezeichnen" -> Überzeichnen der Komponente AWT, Swing, JavaFX & SWT 8
N SWT Einfaches Problem beim Layout AWT, Swing, JavaFX & SWT 8
N Swing Problem beim Einlesen von Jtable in Array AWT, Swing, JavaFX & SWT 5
W Swing Problem beim Passwort Dialog AWT, Swing, JavaFX & SWT 4
C Problem mit Swing Application Framework - Projekt beim AWT, Swing, JavaFX & SWT 2
F kleines problem beim suchen in einem String AWT, Swing, JavaFX & SWT 15
A Problem beim Setzen von JPanels AWT, Swing, JavaFX & SWT 4
P Problem beim Linien ziehen! AWT, Swing, JavaFX & SWT 12
S Problem beim Anpassen vom GridBagLayout AWT, Swing, JavaFX & SWT 10
H Adressbuch - Problem beim Speichern der Eingabe AWT, Swing, JavaFX & SWT 5
A Problem mit der Seiteneinrichtung beim Drucken AWT, Swing, JavaFX & SWT 7
P Bug in Java? - Problem beim Ändern von Spaltentiteln AWT, Swing, JavaFX & SWT 2
I Layout Problem beim Skalieren AWT, Swing, JavaFX & SWT 3
S Problem beim implementerien von ActionListener AWT, Swing, JavaFX & SWT 4
Y Problem beim Drucken AWT, Swing, JavaFX & SWT 2
A Problem beim Import! AWT, Swing, JavaFX & SWT 2
H Problem beim zeichen eines TimeSeriesChart mit jfreechart AWT, Swing, JavaFX & SWT 5
Z Und schon wieder die Linien (Problem beim überzeichnen) AWT, Swing, JavaFX & SWT 4
W Problem beim neuzeichnen eines Rechteckes (SWT) AWT, Swing, JavaFX & SWT 2
J Problem beim Multi-Threading mit einem JDialog AWT, Swing, JavaFX & SWT 2
J Problem mit Alpha-Wert beim Button AWT, Swing, JavaFX & SWT 3
P Problem beim Zeichnen auf ein BufferedImage AWT, Swing, JavaFX & SWT 4
F Problem mit geänderten AttributSet beim StyledDocument AWT, Swing, JavaFX & SWT 4
B BorderLayout/JSplitPane Problem beim Ausrichten AWT, Swing, JavaFX & SWT 5
C Problem beim Ausführen von Thread per Button AWT, Swing, JavaFX & SWT 2
S Problem beim Image laden AWT, Swing, JavaFX & SWT 4
D Problem beim Erstellen eines GridBagLayouts AWT, Swing, JavaFX & SWT 3
A Problem beim Neuzeichnen AWT, Swing, JavaFX & SWT 2
V Problem beim drucken AWT, Swing, JavaFX & SWT 4
D Problem beim Update von unsichtbaren JComponents mit Timern AWT, Swing, JavaFX & SWT 5
S Problem beim Umbenennen von MP3s AWT, Swing, JavaFX & SWT 10
O Problem beim Umwandeln eines Applets in eine Applikation AWT, Swing, JavaFX & SWT 15
T Problem beim Laden von Bildern AWT, Swing, JavaFX & SWT 14
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
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
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
G Instance OF Problem AWT, Swing, JavaFX & SWT 9
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
M Problem mit dem Anzeigen von Frames im Vordergrund AWT, Swing, JavaFX & SWT 5
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15
JavaTalksToMe JavaFx ExekutorService Problem AWT, Swing, JavaFX & SWT 2
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
B Problem mit JavaFX AWT, Swing, JavaFX & SWT 5
J css Problem AWT, Swing, JavaFX & SWT 5
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2
A Swing Filter-Problem AWT, Swing, JavaFX & SWT 1
temi JavaFX Problem mit IntelliJ und JavaFx 11 unter XUbuntu AWT, Swing, JavaFX & SWT 3
L Java FX Problem mit Ubuntu 18 und JavaFx AWT, Swing, JavaFX & SWT 27
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
B JavaFx Scene Builder Problem AWT, Swing, JavaFX & SWT 2
B [Problem] Java öffnet Word-Datein nicht AWT, Swing, JavaFX & SWT 14
T DataBinding Problem AWT, Swing, JavaFX & SWT 5
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 15
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 0
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
T Swing Problem mit Datum und FormattedTextField AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben