Speichern und Auswahl gezeichneter Objekte

Status
Nicht offen für weitere Antworten.

philthy

Mitglied
Hallo,

ich verfolge die Maus (mit Klick und so) in einem JPanel, speichere die Punkte in Vector-Objekten und übergebe die dann an eine eigene Klasse, die von JComponent erbt und dann die Punkte zeichnet. Soweit alles klar. Eine Linie wird also von einem Vector repräsentiert, der eine Anzahl an Points enthält, die dann auf dem JComponent zu einer Linie verbunden werden.

Bei dem Ansatz ist mir prinzipiell noch nicht so klar, welche Nachteile er hat. Wäre es vielleicht besser, für jede Linie ein neues (MeineKlasse extends JComponent) zu instantiieren und zum JPanel hinzuzufügen? Momentan wird bei einem repaint alles neu gezeichnet, jeder Punkt aus jeden Vektor. Das wird dann bei 1500 Punkten wenn man mal 10 Linien gezeichnet hat, ziemlich viel ...

Ich möchte eine kleine Applikaiton schreiben, die es erlaubt, schnell und einfach Notizen zu nehmen (für Grafiktablett oder Tablet-PC). Da möchte ich nicht schon am Anfang prinzipielle Fehler machen ;)

Grüße
Philipp
 

Wildcard

Top Contributor
Wenn du einen grafischen Editor bastelst, dann in der Regel ausserhalb der JComponet Hierarchie, da selbige recht schwergewichtig ist. Bei vielen Objekten wird das unnötig langsam ausserdem wird selektieren mit unter recht schwierig, da die Bounds der Component nicht mit dem übereinstimmen wie du eine contains(Point) Methode für die selektion implementieren würdest.
Verwende leichtgewichtige Objekte, zB Linie, oder einige der Java Shape Implementierungen. Dann brauchst du noch eine aufgemotzte JComponent die deine eigenen grafischen Objekte aufnehmen kann und ihnen ein Graphics Objekt zum Zeichnen übergibt.
Definiere dir ein Interface mit allem was deine grafischen Objekte können müssen, dann eine abstrakte Klasse die eine Basisimplementierung bereitstellt (bounds, contains, move,...).
Danach machst du konkrete Objekte die die abstrakte Klasse erweitern oder direkt das Interface implementieren.
 

philthy

Mitglied
Hallo Wildcard, danke für die Antwort.

Die Idee mit den Erben von JComponent kam aus deinem Tutorial, darum hab ich mich da gleich mal festgebissen ...

Was genau sollte ich denn jetzt auf ein JPanel kleben, auf dem man zeichen kann? Direkt auf JPanel? Was für einen Container gäbe es denn, der sich als Ansammlung von Farbpixeln sieht und dann entprechend auf Mausaktionen anspringen könnte? Du hast schon recht, JComponent nimmt gleich alles an Raum ein und bei 1500 Punkten hab ich schon Performanceprobleme ...

Verstehe ich dirch richtig:
Code:
class MeineKlasse extends garnix{

// Attribute für Punkte etc.

public void zeichneDich(Graphics2D g){
// alle Punkte zeichnen etc.
g.machWas();
}

}

class MeineDickeKlasse extends JComponent{

MeineKlasse einObjekt; // und so weiter

protected void paintComponent(Graphics g) {
einObjelt.zeichneDich((Graphics2D) g);
}

}

Das contains(Punkt) würde ich dann praktisch von MeineKlasse regeln lassen, die dann auch zeichneGehighlighted() oder so macht.

EDIT

Hab die Sun-Seite über die Shapes gefunden, danke für den Hinweis!

Grüße
Philipp
 

Wildcard

Top Contributor
Die Idee mit den Erben von JComponent kam aus deinem Tutorial, darum hab ich mich da gleich mal festgebissen ...
Für einfach Dinge ist das auch ein pragmatischer Ansatz, aber bei einem grafischen Editor sind JComponents einfach zu sehr Widget, zu schwer.

Was genau sollte ich denn jetzt auf ein JPanel kleben, auf dem man zeichen kann? Direkt auf JPanel? Was für einen Container gäbe es denn, der sich als Ansammlung von Farbpixeln sieht und dann entprechend auf Mausaktionen anspringen könnte? Du hast schon recht, JComponent nimmt gleich alles an Raum ein und bei 1500 Punkten hab ich schon Performanceprobleme ...
Sagen wir mal du hast einen ShapeContainer extends JComponent.
Der hat eine Liste mit deinen Shapes. paintComponent iteriert dann über alle Shapes in der Liste und ruft draw auf ihnen auf.
Die Controllerschicht registriert dann zB einen MouseListener auf dem ShapeContainer. Beispiel für die selektion (pseudocode)
Code:
mouseClicked(MouseEvent e)
{
    for(MyShape shape: shapes)
    {
          if(shape.contains(e.getPoint())
          {
                shape.setFocused(true);
                break;
          }
    }

}
 

philthy

Mitglied
Merci, ich glaub, jetzt hab ich es.

Spiel gerade mit dem GeneralPath etwas rum, muss mal warm werden mit den ganzen Interfaces. Aber der Ansatz ist schon besser als mit selbstgezimmerten Formelementen (Punktmengen).

Ich werde das jetzt so machen: Eine JComponent "besitzt" mehrere Layers (homebrewn) die wiederum mehrere Shapes (Java-API) besitzen.
Das Graphics-Objekt wird durchgereicht zu den einzelnen Layern, die dann die Shapes draufzeichnen dürfen (mit dem passenden Pinselstrich etc.).

Jetzt feht nur noch der Tablet-PC ...
 

Wildcard

Top Contributor
Shape ist definitiv eine gute basis, aber ich würde mir überlegen ein eigenes Interface zu schreiben, oder Shape zu erweitern. Das hängt natürlich auch von den Anforderungen ab. Wenn der Editor/Viewer nicht viel können muss, reicht dir vermutlich Shape.
 

philthy

Mitglied
Ja, die ersten Problemchen tauchen auf ...

z.B. füge ich die Punkte direkt einem GeneralPath an, funktioniert auch wunderbar. Aber schon so triviale Dinge wie "wie viele Punkte hat denn der Pfad?" scheitern. Ich denke, die beste Lösung hier wäre, einen "eigenen" Pfad zu machen, der GeneralPath implementiert, dort die Punkte zu speichern, sie zu vereinfachen (DAS ist nämlich das eigentliche Performance-Prblem glaub ich, die Menge der Punkte), dann den eigentlichen Pfad zu erstellen und zu zeichnen. Ich teste das mal an.

Zum "Können": Ich will seit langen z.B. mal wissen, wie kompliziert es ist, aus einer halbwegs geraden Linie die Zeichenabsicht des Benutzers zu erkennen und eine gerade Linie durch Anfangs- und Endpunkt zu legen. Als Ingenieur macht man ja doch oft Freihandskizzen, "meint" aber schon exakte Kreise (stell ich mir ziemlich tricky vor), gerade Linien (das jetzt weniger: Gerade durch Anfangs- und Endpunkt, die stimmen ja meist, dann die Funktion aufstellen und sehen, wie groß die Abweichung der y-Werte gegenüber der Funktion ist, wenn kleiner als $x: Wird wohl eine Linie sein).

Grüße
Philipp
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Combo Box auswahl in eine Datenbank speichern AWT, Swing, JavaFX & SWT 1
MiMa Speichern von Image als JPG auf Festplatte AWT, Swing, JavaFX & SWT 9
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
officialmaxl JavaFX Textfield getTextfield() in String speichern AWT, Swing, JavaFX & SWT 1
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
B Swing Sudoku: Laden / Speichern von Zahlen aus/in mehrere JTextFields aus/in eine(r) Textdatei AWT, Swing, JavaFX & SWT 9
J Warum kann ich die Spaltennummer in der Konsole anzeigen, diese aber nicht speichern ? AWT, Swing, JavaFX & SWT 6
F Output Stream / File Dateien / Speichern AWT, Swing, JavaFX & SWT 13
D String als Textdatei in ausgewähltem Speicherplatz speichern AWT, Swing, JavaFX & SWT 32
A Swing Datei lässt sich zwar speichern, aber nicht laden (Inhalt im JTextField anzeigen) AWT, Swing, JavaFX & SWT 18
S URLS speichern von Internetseiten AWT, Swing, JavaFX & SWT 3
S Bild neu skalieren - Bild in Bild speichern? AWT, Swing, JavaFX & SWT 6
P Adressbuch Werte speichern AWT, Swing, JavaFX & SWT 21
G Eingabe in JTextField in Array speichern und in JList ausgeben AWT, Swing, JavaFX & SWT 7
G JTextField Eingabe in DB speichern AWT, Swing, JavaFX & SWT 68
B TableView als PDF speichern AWT, Swing, JavaFX & SWT 8
cool_brivk24 libGDX Welt speichern AWT, Swing, JavaFX & SWT 0
R Scene speichern AWT, Swing, JavaFX & SWT 7
D Inhalt von JTextField in MySQL speichern. Wie ? AWT, Swing, JavaFX & SWT 1
J Text in ein Textfeld eingeben und speichern AWT, Swing, JavaFX & SWT 27
S Swing jScrollPane - pro Eintrag der Liste, die jCheckBoxes Speichern die in dem Eintrag aktiviert wurden AWT, Swing, JavaFX & SWT 2
A Swing Wie Daten in der Form speichern? Array oder ArrayList AWT, Swing, JavaFX & SWT 2
I JavaFX formatierter Text in PDF speichern AWT, Swing, JavaFX & SWT 4
GenerationLost JavaFX FileChooser speichern ohne Zieldatei? AWT, Swing, JavaFX & SWT 12
A Swing Gemaltes Bild über saveDialog speichern unter AWT, Swing, JavaFX & SWT 15
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
U Eingabe von TextField in variable speichern AWT, Swing, JavaFX & SWT 2
M Kamerabilder in ein Ordner speichern AWT, Swing, JavaFX & SWT 12
F Gezeichnetes als bild speichern AWT, Swing, JavaFX & SWT 4
I JavaFX Speichern der eingefügten Einträge beim Neustart des Programms AWT, Swing, JavaFX & SWT 2
I Variabeln speichern in Desktop Anwendung AWT, Swing, JavaFX & SWT 2
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
D Objekte einer Oberfläche in eine Datei/Ordner speichern AWT, Swing, JavaFX & SWT 9
S JavaFX Fenstergrösse automatisch Speichern und Laden AWT, Swing, JavaFX & SWT 4
J Swing Fenstereinstellungen speichern AWT, Swing, JavaFX & SWT 2
M ausgewählte Inhalt von ListItem inn ComboBox in der Tabelle speichern AWT, Swing, JavaFX & SWT 0
M Bild Beschreibung mit ImageIO speichern AWT, Swing, JavaFX & SWT 1
C Image laden und Speichern - Image wird auf JPanel nicht angezeigt AWT, Swing, JavaFX & SWT 4
J Swing JTable speichern AWT, Swing, JavaFX & SWT 2
C GUI öfters durchlaufen und hinterher Bild speichern AWT, Swing, JavaFX & SWT 1
S Panelzeichnung speichern AWT, Swing, JavaFX & SWT 2
O JTextfield und JComboBox Wert in SQL Database speichern AWT, Swing, JavaFX & SWT 4
J Bilder als Variable an einem Objekt speichern AWT, Swing, JavaFX & SWT 3
M Bild aus JLabel resizen und speichern AWT, Swing, JavaFX & SWT 0
A Swing Malprogramm Bild speichern? AWT, Swing, JavaFX & SWT 9
G Subimage von BufferedImage speichern AWT, Swing, JavaFX & SWT 4
Y JavaFX Bild speichern und Pfad dazu abspeichern AWT, Swing, JavaFX & SWT 2
D JPanel Graphic2D als BufferedImage Speichern AWT, Swing, JavaFX & SWT 5
A JFileChooser Datei speichern AWT, Swing, JavaFX & SWT 4
B Bildverlust bei Speichern in .jar-Archiv AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Bildteile in ein anderes Bild speichern AWT, Swing, JavaFX & SWT 12
B Datenübergabe zwischen Tabs und Daten speichern AWT, Swing, JavaFX & SWT 2
J JFileChooser - Datei speichern AWT, Swing, JavaFX & SWT 7
J JTree speichern AWT, Swing, JavaFX & SWT 4
kodela Teil eines Panels als Graphik speichern AWT, Swing, JavaFX & SWT 3
T Modell als XML Speichern / Laden AWT, Swing, JavaFX & SWT 9
P TextField beim klicken von JButton speichern AWT, Swing, JavaFX & SWT 17
P Öffnen, Speichern von Dat. über DialogBoxen AWT, Swing, JavaFX & SWT 10
B Zustand eines GUI speichern AWT, Swing, JavaFX & SWT 8
I Dialog zum Speichern? AWT, Swing, JavaFX & SWT 16
M JTable Drucken NullpointerException +JTable speichern AWT, Swing, JavaFX & SWT 6
J Swing JTable-Daten Speichern und bei zeilen-änderung beibehalten. AWT, Swing, JavaFX & SWT 6
M Datei Speichern unter Dialog - SWT AWT, Swing, JavaFX & SWT 3
T SWT:Datei speichern / öffnen AWT, Swing, JavaFX & SWT 6
T speichern funktioniert,aber öffnen nicht AWT, Swing, JavaFX & SWT 2
W Grafik von JFrame korrekt speichern AWT, Swing, JavaFX & SWT 7
M Position eines JLabels speichern? AWT, Swing, JavaFX & SWT 3
P nicht sichtbares JPanel / JFrame als Image speichern AWT, Swing, JavaFX & SWT 3
A BufferedImage nach dem Speichern immer schwarz AWT, Swing, JavaFX & SWT 8
J Speichern, Event, Hintergrund getAppletContext AWT, Swing, JavaFX & SWT 2
S JTable - Sortierung beibhalten / Speichern. AWT, Swing, JavaFX & SWT 3
C Checkbox-zustände in einem JFrame speichern AWT, Swing, JavaFX & SWT 8
R Graphics-Object speichern AWT, Swing, JavaFX & SWT 4
T Image skaliert in Variable speichern AWT, Swing, JavaFX & SWT 6
B Panel als Bild speichern AWT, Swing, JavaFX & SWT 11
Daniel_L Grafik erstellen, drin zeichnen und dann speichern AWT, Swing, JavaFX & SWT 2
K Swing Komponente als Bild speichern AWT, Swing, JavaFX & SWT 11
E Profilsichten speichern und dynamsich erzeugen?! AWT, Swing, JavaFX & SWT 2
N JTable direkt editierenund in Datenbanken speichern AWT, Swing, JavaFX & SWT 5
D Swing JTable in Datei speichern und laden AWT, Swing, JavaFX & SWT 3
R JComboBox Ausgabe in String speichern AWT, Swing, JavaFX & SWT 3
F Wert zu Eintrag in ComboBox speichern?! AWT, Swing, JavaFX & SWT 7
0 Ausschnitt eines JPanels als Bild speichern AWT, Swing, JavaFX & SWT 4
A Programmieren einer Agenda mit einer Liste (als Applet und .txt zum Speichern) AWT, Swing, JavaFX & SWT 7
B JTextPane formatierten Inhalt speichern AWT, Swing, JavaFX & SWT 2
R TextField auslesen & in Objekteigenschaften speichern AWT, Swing, JavaFX & SWT 22
B textdatei speichern AWT, Swing, JavaFX & SWT 9
K Swing JFileChooser zum Speichern - FileFilter AWT, Swing, JavaFX & SWT 2
jgh Speichern von User-GUI-Einstellungen AWT, Swing, JavaFX & SWT 2
B Swing Suche JFileChooser zum Speichern AWT, Swing, JavaFX & SWT 2
N gezeichnete Graphiken speichern und wieder anzeigen AWT, Swing, JavaFX & SWT 8
M AWT Datei auf server speichern und beschreiben AWT, Swing, JavaFX & SWT 7
G Swing Image speichern / 0 Byte AWT, Swing, JavaFX & SWT 7
U Wo eingeloggten Benutzer "speichern" AWT, Swing, JavaFX & SWT 10
J Aus einer JList den Inhalt als Textdatei speichern AWT, Swing, JavaFX & SWT 15
C Bild in einer Datenbank speichern? AWT, Swing, JavaFX & SWT 7
Z JTable: Speichern probleme AWT, Swing, JavaFX & SWT 12
L JPanel als Image speichern AWT, Swing, JavaFX & SWT 3
D SWT String aus Textfeld auslesen und in eine Tabelle speichern AWT, Swing, JavaFX & SWT 5
J Werte aus Combobox speichern AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben