JPanel mit Graphics2D Objekten mit JScrollpane

Markus_667

Aktives Mitglied
Hallo Zusammen,

ich bin schon am verzweifeln und hoffe Ihr könnt mir helfen.
Habs auch schon an anderer Stelle Probiert aber eventuell ist das ja eher ein Problem für die Gaming Area.
Also ich zeichne ein JFrame dem übergebe ich ein JScrollPane und das JScrollpane bekommt ein JPanel übergeben.
Darin Zeichne ich mit der Maus Kreise und Vierecke (paintComponent mit g2d.draw(rect) usw.) die ich dann mit der Maus mit Linien vernetze und verschieben kann. Das klappt alles prima.
Nun möchte ich das Panel aber scrollbar machen, weil wenn ich die Vierecke (Recktangle2D) mit der Maus anfasse und aus dem JFrame Rand hinaus ziehen sind sie verschwunden und werden erst wieder dargestellt wenn ich das Fenster bis dahin aufziehe.

Die Scrollbalken sind da, aber ohne Funktion.
Wenn ich nun mit einer Schleife mehre JTextfield Objekte nacheinander zeichnen lasse (nur zum testen) bekommen die Scrollbalken auch eine Funktion.
Nur mit den Graphics Objekten will das nicht funktionieren.
Die unterschiedlichen Größenangaben waren auch nur zum testen so gewählt.

Im Prinzip versuche ich so etwas ähnliches wie der folgende Link darstellt zu programmieren.
http://www.pneditor.org/

Meine Zeichenarea schaut folgend aus.
(das ganze Programm ist zu groß um es komplett zu posten)
Was mache ich falsch ?

Vielen Dank schon mal...

Java:
public class ZeichenArea {
    public JScrollPane scrollPn;
    JFrame frame;
    GrafikObjekte grafikObj;
    Optionen optionenPanel;

    public ZeichenArea(Optionen optionenPanel) {
        grafikObj = new GrafikObjekte();
        grafikObj.setSize(1200,900);
        scrollPn = new JScrollPane(grafikObj,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        AktionHandler aktion_handler = new AktionHandler(grafikObj, optionenPanel, scrollPn);
        grafikObj.addMouseListener(aktion_handler);
        grafikObj.addMouseMotionListener(aktion_handler);
           
        frame = new JFrame("Zeichenbrett");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(new Dimension(800,800));
        frame.setLocationRelativeTo(null);
    

        frame.addKeyListener(aktion_handler);
        //frame.add(scrollPn);
        frame.getContentPane().add(scrollPn,BorderLayout.CENTER);
        frame.setVisible(true);
    }

    public JFrame getFrame() {
        return frame;
    }

    public void setFrame(JFrame frame) {
        this.frame = frame;
    }
}
 

JuKu

Top Contributor
Ich glaube das Problem ist, dass JScrollPane nicht weiß, wie groß das grafikObj ist.
Evtl. musst du irgendwo eine Größe festsetzen.
 

Markus_667

Aktives Mitglied
Aber ich habe doch der ScrollPane das graphObj übergeben, sollte es dann nicht wissen wie groß es ist und wenn es sich ändert ?
Werde es auf jeden Fall morgen probieren... Danke
 

truesoul

Top Contributor
Hallo.

Warum eröffnest du denn ein Thema, der das gleiche Problem wie in diesen Thread beschreibt?

Mal ein Beispiel:

Java:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.ScrollPane;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ScrollPanelExample {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ScrollPanelExample();
            }
        });
    }

    ScrollPanelExample() {
        init();
    }

    void init() {
        JFrame frame = new JFrame();
        // Größe des Frames setzen
        frame.setPreferredSize(new Dimension(960, 960));

        MyPanel panel = new MyPanel();

        // ScrollPane braucht keine Größe
        ScrollPane scrollPane = new ScrollPane();
        // ScrollPane nimmt das Panel auf
        scrollPane.add(panel);

        frame.setContentPane(scrollPane);
        frame.pack();
        frame.setVisible(true);
    }

    class MyPanel extends JPanel {

        public MyPanel() {

            Toolkit tool = Toolkit.getDefaultToolkit();
            // Größe setzen anhand des Bildschirmauflösung
            setPreferredSize(tool.getScreenSize());
        }

        @Override
        protected void paintComponent(Graphics g) {
            g.drawRect(100, 150, 20, 20);
            g.drawRect(400, 350, 20, 20);
            g.drawRect(600, 600, 20, 20);
            g.drawRect(100, 600, 20, 20);
            g.drawRect(1200, 800, 20, 20);

        }
    }
}

Grüße
 

Markus_667

Aktives Mitglied
Sorry für den doppelten Post :( aber ich hab ziemlichen Zeitdruck und wollte damit nur einen größeren Personenkreis ansprechen.
Dein Beispiel hat zwar aktive Scrollbalken aber nicht aufgrund des Rechtecks welches du bei (1200, 800) platzierst.
Ich arbeite mit Laptop und Monitor, das Fenster nimmt die ScreenSize des Laptops beim öffnen.
Wenn ich es dann auf meinen Monitor ziehe, der deutlich größer ist, wird die ScreenSize nicht erneut ausgelesen.
Dadurch kann ich es an der unteren Ecke so weit ziehen bis die Scrollbalken verschwunden sind.
Platziere ich dann ein Objekt noch weiter "draußen" (also außerhalb der WQHD) ist das Panel auch nicht mehr Scrollbar. Füge ich aber wieder TextFelder hinzu, die über WQHD hinaus ragen, bleibt das Panel Scrollbar.
Das ScrollPanel orientiert sich daher leider nicht an den Rechtecken sondern nur an den anderen Objekten wie JTextfield.

Das ist aber glaube ich ein Ansatz den ich verwende wenn nichts mehr hilft.

Von daher vielen Dank dafür, es hat auch sehr geholfen das Ganze etwas näher zu verstehen.
Ich Teste mal noch die Antwort in dem zweiten Thread von thet1983 mit Hoffnung auf Erfolg :(
 

JuKu

Top Contributor
Das ScrollPanel orientiert sich daher leider nicht an den Rechtecken sondern nur an den anderen Objekten wie JTextfield.

Richtig!
Was du in der paintComponent() Methode zeichnest, ist der JScrollPane völlig egal.
Es kommt auf die Größe der inneren Objekte drauf an. Und diese hast du bisher weder gesetzt noch überschrieben.
 

truesoul

Top Contributor
Hi.

Also ein erweitertes Beispiel:

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.ScrollPane;
import java.awt.Shape;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ScrollPanelExample {

    private List<Shape> shapes = new ArrayList<>();
    private final int FRAME_WIDTH = 960;
    private final int FRAME_HEIGHT = 960;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ScrollPanelExample();
            }
        });
    }

    ScrollPanelExample() {
        createShapes();
        init();
    }

    void createShapes() {
        for (int i = 0; i < 10; i++) {
            shapes.add(getRectangle(new Random().nextInt(3840) + 1, new Random().nextInt(2160) + 1));
        }
    }

    void init() {
        JFrame frame = new JFrame();
        // Größe des Frames setzen
        frame.setPreferredSize(new Dimension(FRAME_WIDTH, FRAME_HEIGHT));

        MyPanel panel = new MyPanel();

        // ScrollPane braucht keine Größe
        ScrollPane scrollPane = new ScrollPane();
        // ScrollPane nimmt das Panel auf
        scrollPane.add(panel);

        frame.setContentPane(scrollPane);
        frame.pack();
        frame.setVisible(true);
    }

    class MyPanel extends JPanel {

        public MyPanel() {
            setPreferredSize(getDimension());
        }

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;

            g2.setColor(Color.BLACK);
            for (Shape shape : shapes) {
                g2.fill(shape);
            }
        }
    }

    public static Shape getRectangle(int x, int y) {
        return new Rectangle2D.Double(x, y, 20, 20);
    }

    int getMaxWidth() {
        int width = FRAME_WIDTH;

        for (Shape shape : shapes) {
            if (shape.getBounds2D().getX() > width) {
                width = (int) shape.getBounds2D().getX();
            }
        }

        return width;
    }

    int getMaxHeight() {
        int height = FRAME_HEIGHT;
        for (Shape shape : shapes) {
            if (shape.getBounds2D().getY() > height) {
                height = (int) shape.getBounds2D().getY();
            }
        }
        return height;
    }

    Dimension getDimension() {
        return new Dimension(getMaxWidth(), getMaxHeight());
    }

}

Was du dann noch brauchst ist:
  1. MouseListener und MouseMotionListener und das Verschieben zu registrieren und darauf zu reagieren
  2. Ändern der Position für Shape's
  3. Prüfung ob auf der Position ein Shape gibt und evtl. zurück geben
  4. Verschieben von Shape's
  5. Ändern der Dimension von ScrollPane
  6. Neu Zeichnen
  7. Prüfung ob Shape am Rand "aneckt"
Hoffe damit kannst du arbeiten. Du solltest dir natürlich überlegen, wie du das alles dann verwenden kannst.

Grüße
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
R JPanel wird erst im Fullscreen angezeigt Spiele- und Multimedia-Programmierung 1
P selectedItem aus einem Methodenerstellten JPanel auslesen. Spiele- und Multimedia-Programmierung 5
K JPanel wechseln & Neu starten - SnakeSpiel Spiele- und Multimedia-Programmierung 2
A paintComponent in JPanel in JFrame Spiele- und Multimedia-Programmierung 7
N JPanel Inhalt aktualisiert nach Thread.sleep nicht Spiele- und Multimedia-Programmierung 2
S Thread und jpanel-paintcomponent kombinierbar?? Spiele- und Multimedia-Programmierung 14
E Animiertes JPanel dynamisch wechseln Spiele- und Multimedia-Programmierung 3
W Panel/JPAnel createImage() Exception Spiele- und Multimedia-Programmierung 2
R Probleme mit JPanel!KeyListener geht nicht Spiele- und Multimedia-Programmierung 6
T Problem bei LinkedList / JPanel Spiele- und Multimedia-Programmierung 4
C 2D Sprites an die JPanel Größe (Auflösung) anpassen/skalieren Spiele- und Multimedia-Programmierung 3
F Vektorgrafik in JPanel Spiele- und Multimedia-Programmierung 5
E Active Rendering im FSEM auf ein JPanel? Spiele- und Multimedia-Programmierung 4
L 2D-Spiele ruckeln auf JPanel Spiele- und Multimedia-Programmierung 7
A Mehrere geometrische Objekte in JPanel zeichnen Spiele- und Multimedia-Programmierung 4
X JPanel dynamisch (Koordinatensystem)? Spiele- und Multimedia-Programmierung 30
M Jpanel Graphik speichern Spiele- und Multimedia-Programmierung 6
DamienX Canvas vs JPanel Spiele- und Multimedia-Programmierung 15
S Problem mit JPanel bzw p a i n t Spiele- und Multimedia-Programmierung 6
K stringWidth bei Graphics von JPanel und Printer unterschiedl Spiele- und Multimedia-Programmierung 4
R SimpleUniverse in JPanel Spiele- und Multimedia-Programmierung 4
M 1. Menüleiste wird doppelt gezeichnet 2. awt auf ein jpanel Spiele- und Multimedia-Programmierung 4
M Jpanel mit Keylistener Spiele- und Multimedia-Programmierung 6
D 2D Graphic Objekte in ein JPanel einfügen Spiele- und Multimedia-Programmierung 2
H Screenshot einer Graphics2D Anwendung erstellen Spiele- und Multimedia-Programmierung 6
S Graphics2D Oval vs. Rect -Performance Spiele- und Multimedia-Programmierung 17
X Polygon in Graphics2D löschen Spiele- und Multimedia-Programmierung 4
S Graphics.drawString (Graphics2D.drawString) Y-Problem Spiele- und Multimedia-Programmierung 4
A Graphics2D. repaint() Spiele- und Multimedia-Programmierung 12
M Graphics2D problem Spiele- und Multimedia-Programmierung 5
V Graphics oder Graphics2D Zeichenfunktion gesucht? Spiele- und Multimedia-Programmierung 4
H Größenänderung von Graphics2D Strings bzw Fonts Spiele- und Multimedia-Programmierung 2
G Paint mit Graphics2D? Spiele- und Multimedia-Programmierung 8
B JAVA Graphics2D Problem das mich in den Wahnsinn treibt Spiele- und Multimedia-Programmierung 3
B Keine Graphics2D Klasse unter J# .Net??? Spiele- und Multimedia-Programmierung 6
BraunBerry Rotation von Objekten um ein Raumschiff Spiele- und Multimedia-Programmierung 6
R Verschieben von Objekten langsam Spiele- und Multimedia-Programmierung 0
S [lwjgl] Renderbug bei mehreren Objekten Spiele- und Multimedia-Programmierung 2
F Kollisionsabfrage bei schnellen Objekten Spiele- und Multimedia-Programmierung 2
M Collisions mit festen Objekten Spiele- und Multimedia-Programmierung 8
P "Tiefe" in Objekten - LWJGL Spiele- und Multimedia-Programmierung 12
W Java3D: Farbe von Objekten stimmt nicht mit übergebenem RGB-Wert überein Spiele- und Multimedia-Programmierung 9
M [Java3D] Animation von mehreren Objekten Spiele- und Multimedia-Programmierung 7
StrikeTom Schwerkraft mit festen objekten darstellen Spiele- und Multimedia-Programmierung 27
B Kollisionserkennung bei gezeichneten Objekten Spiele- und Multimedia-Programmierung 2
L Platzieren von Objekten auf TileMap Spiele- und Multimedia-Programmierung 6
P Culling von Image-Objekten Spiele- und Multimedia-Programmierung 3
B 1)JButtons zeichnen 2)Kolisionsabfrage von zwei Objekten Spiele- und Multimedia-Programmierung 9
D Array aus Objekten Spiele- und Multimedia-Programmierung 2
V Koordinaten von Objekten? Spiele- und Multimedia-Programmierung 8
J Kollision von Objekten Spiele- und Multimedia-Programmierung 7
J Simulation mit vielen Objekten: Datenbank? Spiele- und Multimedia-Programmierung 6
F Bewegung/Kollision von Objekten auf Tastendruck Spiele- und Multimedia-Programmierung 6
G Bewegen von Objekten Spiele- und Multimedia-Programmierung 4
B Hilfe gesucht!! (bewegen von grafischen Objekten) Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben