Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen

stroggi

Mitglied
Hallo zusammen,

Zunächst einmal meine Ausgangssituation:
Ich ahbe ein JLabel, welches ich zur Anzeige eines Bildes verwende. Dieses JLabel ist wiederum in einem JScrollPane eingebettet.
"Über" diesem Bild sollen nun verschiedene Symbole plaziert werden, welche ich mit der Maus verschieben möchte. Derzeit funktioniert das zwar schon, allerdings eher weniger elegant und auch <Ironie> ein klein wenig </Ironie> Ineffizient. Für jedes plazierte Objekt merke ich mir im Grunde wo es (relativ zu dem Bild) gezeichnet werden soll und bei einem repaint des Bildes werden die einzelnen Symbole nachträglich per Graphics auf das JLabel gezeichnet. Die Symbole sind im Übrigen keine statischen Grafiken, sondern können z.B. die Farbe je nach eingestelltem Parameterwert ändern!

Nun habe ich mir gedacht, dass das doch mit Sicherheit auch einfacher geht. Evtl. mit einem (durchsichtigen) JPanel pro Symbol, welches "über" dem JLabel welches das Bild anzeigt palziert wird?

Mein Ziel ist es einfach, dass bei kleinen Änderungen an einem Symbol (Farbwechsel, Positionswechsel oder ähnliches) nicht das gesamte Bild neu gezeichnet, sondern eben nur die Position oder eben das Symbol aktueliesiert werden muss. Leider bin ich hierzu jedoch noch nicht fündig geworden.

Meine Frage wäre nun ob mir hier evtl. jemand dabei helfen kann und wie eine mögliche Lösung aussehen könnte.
 

stroggi

Mitglied
Hmm... was habe ich vorbereitet. Mit dieser Aussage kann ich leider relativ wenig anfangen, aber ich versuche mich mal daran:

Folgendes ist im groben meine Ausgangssituation:
Java:
LinkedList<Device> devices = new LinkedList<>()

JLabel imageLabel = new JLabel() {
        @Override
        public void paint(Graphics g) {
                super.paint(g);
              
                devices.forEach(device -> device.draw((Graphics2D)g));
    }
};

JPanel jImagePanel = new JPanel();
jImagePanel.setLayout(new GridBagLayout());
jImagePanel.add(imageLabel);
      
JScrollPane scrollPane = new JScrollPane(jImagePanel);

Für das Device sieht die Zeichenfunktion dann ähnlich aus wie hier:
Java:
public void draw(Graphics2D g2d) {
        BufferedImageicon = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
      
        updateIcon(icon);
      
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      
        AffineTransform t = new AffineTransform();
        t.translate((double)iconPos.getX() / (double)scrollLevel,(double)iconPos.getY() / (double)scrollLevel);
        t.scale(1.0 / (double)scrollLevel, 1.0 / (double)scrollLevel);
  
        g2d.drawImage(icon, t, null);
}

private void updateIcon(BufferedImage icon) {
        Graphics2D g2d = (Graphics2D)icon.getGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      
        g2d.setColor(new Color(0, 0, 0, 0));
        g2d.fillRect(0, 0, icon.getWidth(), icon.getHeight());
      
        g2d.setColor(Color.BLACK);
        g2d.fillOval(0, 0, 100, 100);
      
        g2d.setColor(this.getColorRGB());
        g2d.fillOval(10, 10, 80, 80);
}

Es wird also jedes Device-Symbol zunächst auf ein separates Image gezeichnet, skaliert und dann auf das Hintergrundbild gezeichnet.
Wenn sich ein Device ändert muss das ganze Bild gezeichnet werden.

Ich suche nun nach einer Möglichkeit das Hintergrundbild statisch zu lassen, die einzelnen Devices auf separate Swing-Objekte zu packen (die idealerweise durchsichtig sein sollten) und nur die Devices neu zeichnen zu lassen, die sich auch tatsächlich geändert haben.

Ich hoffe es wurde dadurch etwas verständlicher.
 

Harry Kane

Top Contributor
Nun habe ich mir gedacht, dass das doch mit Sicherheit auch einfacher geht. Evtl. mit einem (durchsichtigen) JPanel pro Symbol, welches "über" dem JLabel welches das Bild anzeigt palziert wird?
Ich sehe nicht, inwiefern das einfacher sein sollte. Deine Vorgehensweise, grafische Objekte auf einer JComponent direkt in der Methode zu zeichnen, die auch für das Zeichnen der JComponent verantwortlich ist, ist im Prinzip ok. Du solltest allerdings statt der paint- lieber die paintComponent-Methode überschreiben. Und wenn du nur zeichnen möchtest, kannst du auch JComponent erweitern. Dann besteht keine Gefahr, dass du irgendwann bei deinem JLabel einen Text setzt.
Deine Variante zum zeichnen der devices halte ich aber für arg kompliziert:
- Das device bekommt in seiner draw-Methode einen Graphics2D
- Das device erstellt ein BufferedImage mit festgelegter Größe, und übergibt dies an eine andere Methode
- In der anderen Methode wird der Graphics2D des BufferedImage beschafft und auf diesem gezeichnet.
- In der draw-Methode wird das geänderte BufferedIMage skaliert und auf den originalen Graphics2D gezeichnet.
Ich würde beim Erstellen eines Devices direkt das BufferedImage erstellen, darauf zeichnen, das BufferedImage als Instanzvariable im device speichern, und in der draw-Methode das BufferedImage nur noch skalieren und zeichnen.
 

stroggi

Mitglied
Ich würde beim Erstellen eines Devices direkt das BufferedImage erstellen, darauf zeichnen, das BufferedImage als Instanzvariable im device speichern, und in der draw-Methode das BufferedImage nur noch skalieren und zeichnen.
Ja, den Gedanken hatte ich auch bereits und das werde ich demnächst auch so umsetzen.

Allerdings hatte ich gehofft, dass ich mir zumindest für das Verschieben eines Objektes das komplette Neuzeichnen sparen könnte indem ich einfach das Panel (oder was auch immer) verschiebe. Hierzu muss ich dann ja nur die Position (relativ zum Bild) anpassen und nicht das komplette Bild + aller Objekte neu zeichnen lassen. Ich würde mir hierdurch durchaus einiges an Optimierung erhoffen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Swing Mehrere Ausgaben in JTextArea AWT, Swing, JavaFX & SWT 2
H Mehrere Panels auf JFrame AWT, Swing, JavaFX & SWT 8
S Mehrere Tabellen Zellen gleichzeitig färben AWT, Swing, JavaFX & SWT 5
Apfelbaum2005 Swing JFrame mehrere JPanels mit unterschiedlichen Formen hinzufügen AWT, Swing, JavaFX & SWT 1
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
I Scene Builder - mehrere Seiten AWT, Swing, JavaFX & SWT 6
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
schoel27 Mehrere JButtons sollen das gleiche Event auslösen AWT, Swing, JavaFX & SWT 2
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
M mehrere jTextField untereinander AWT, Swing, JavaFX & SWT 1
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
B Swing Sudoku: Laden / Speichern von Zahlen aus/in mehrere JTextFields aus/in eine(r) Textdatei AWT, Swing, JavaFX & SWT 9
M JavaFX JavaFX in mehrere Controller AWT, Swing, JavaFX & SWT 21
R mehrere buttons mit forschleife kreieren und individuell bearbeiten AWT, Swing, JavaFX & SWT 1
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
temi JavaFX Mehrere Views mit Stage.setScene() oder mit Scene.setRoot()? AWT, Swing, JavaFX & SWT 7
P Swing Mehrere JPanels auf ein JFrame hinzufügen? AWT, Swing, JavaFX & SWT 2
T Swing Tetraeder - mehrere Punkte verbinden? - Ansätze gesucht AWT, Swing, JavaFX & SWT 2
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 29
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 0
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
J JavaFX - mehrere Views, Model durchreichen AWT, Swing, JavaFX & SWT 10
it_is_all Swing Mehrere JComboBoxen - wie die versch. Boxen mit ItemStateChange auslesen? AWT, Swing, JavaFX & SWT 3
M Swing Mehrere Textfelder mit ScrollBars - Größe der Felder AWT, Swing, JavaFX & SWT 0
W JavaFX Mehrere Klassen in ein TableView AWT, Swing, JavaFX & SWT 6
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
L JavaFX Mehrere JavaFX Szenen mit einem Menü AWT, Swing, JavaFX & SWT 1
D Java FXML mehrere Fenster AWT, Swing, JavaFX & SWT 4
F JavaFX Mehrere Stages "managen" AWT, Swing, JavaFX & SWT 2
r4w Changelistener auf mehrere Textfelder AWT, Swing, JavaFX & SWT 5
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
S Swing Mehrere Modal-Dialoge übereinander AWT, Swing, JavaFX & SWT 5
T 2D-Grafik JFreeChart mehrere Y-Achsen AWT, Swing, JavaFX & SWT 2
C JavaFX mehrere Kreise nach Eingabeprozess ausgeben AWT, Swing, JavaFX & SWT 2
Thallius Swing Mehrere tausend "Panels" erstellen AWT, Swing, JavaFX & SWT 3
C Java FX Warnmeldung: Mehrere Fonts gehören derselben Familie und Stil AWT, Swing, JavaFX & SWT 2
J Mehrere JInternalFrame; GetValues AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
K JavaFX Mehrere Cell Editors in einem TreeView Item AWT, Swing, JavaFX & SWT 2
KaffeeFan mehrere JTextField durchlaufen AWT, Swing, JavaFX & SWT 4
J Java -8 Action Listener für mehrere Buttons AWT, Swing, JavaFX & SWT 9
T Dynamisch mehrere Checkboxen anlegen AWT, Swing, JavaFX & SWT 2
G JavaFX Menü und mehrere Scenes AWT, Swing, JavaFX & SWT 16
R Swing Mehrere JTextFields mit einem Document Listener AWT, Swing, JavaFX & SWT 2
D Mehrere RadiButtons auswählar AWT, Swing, JavaFX & SWT 3
P Swing JTable mehrere Zeilen markieren AWT, Swing, JavaFX & SWT 1
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
T JavaFX FXMLController für mehrere FXML? AWT, Swing, JavaFX & SWT 7
G mehrere Action-Abfolgen erfassen AWT, Swing, JavaFX & SWT 6
elischa JFrame über mehrere JPanel und Listener AWT, Swing, JavaFX & SWT 17
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
J Mehrere Hyperlinks "stilvoll" darstellen. AWT, Swing, JavaFX & SWT 1
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
S JavaFX Mehrere TreeTableView's synchron scrollen AWT, Swing, JavaFX & SWT 0
U Mehrere Oberflächeninstanzen seperat schließen AWT, Swing, JavaFX & SWT 5
J Rahmen um mehrere GUI Einzelteile AWT, Swing, JavaFX & SWT 2
S Layouts, mehrere Buttons nebeneinander AWT, Swing, JavaFX & SWT 2
M Mehrere Fenster innerhalb einer Application AWT, Swing, JavaFX & SWT 3
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
T [LWJGL] mehrere Displays? AWT, Swing, JavaFX & SWT 19
SexyPenny90 Mehrere Fenster AWT, Swing, JavaFX & SWT 2
M Handling 1 Fenster mehrere Panels AWT, Swing, JavaFX & SWT 2
Y Mehrere JSlider verlinken AWT, Swing, JavaFX & SWT 6
Java-Insel LayoutManager Ein GridBagLayout-Objekt für mehrere Panels? AWT, Swing, JavaFX & SWT 2
O Swing JLabel mehrere Zeilen AWT, Swing, JavaFX & SWT 2
P mehrere Rectangles per JButton AWT, Swing, JavaFX & SWT 9
B JToolBar dynamisch auf mehrere Zeilen erweitern AWT, Swing, JavaFX & SWT 2
Jats Zeichen auf mehrere JPanels AWT, Swing, JavaFX & SWT 7
G Mehrere Probleme mit Java's GUI AWT, Swing, JavaFX & SWT 6
G Mehrere Layoutprobleme AWT, Swing, JavaFX & SWT 2
Kenan89 JTable mehrere ListSelections AWT, Swing, JavaFX & SWT 2
M TextArea über mehrere Zeilen - wie Zeileanzahl abfragen? AWT, Swing, JavaFX & SWT 5
J Swing JDialog blokiert mehrere JFrames - soll aber nur den aufrufenden blockieren AWT, Swing, JavaFX & SWT 4
A mehrere Zeilen in GUi ausgeben AWT, Swing, JavaFX & SWT 2
N Mehrere Tasks nacheinander ausführen AWT, Swing, JavaFX & SWT 7
C SWT Mehrere Bilder in GUI laden AWT, Swing, JavaFX & SWT 5
propra Mehrere Objekte gleichzeitig verschieben AWT, Swing, JavaFX & SWT 7
M 2D-Grafik Mehrere Linien (nacheinander) übereinander Zeichnen AWT, Swing, JavaFX & SWT 6
M Mehrere JPanel nacheinander?! AWT, Swing, JavaFX & SWT 11
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
K SWT Mehrere Einträge ins Clipboard legen AWT, Swing, JavaFX & SWT 2
C Swing Ein JFrame mehrere Ansichten AWT, Swing, JavaFX & SWT 8
C Swing Mehrere JSlider sollen aufeinander reagieren AWT, Swing, JavaFX & SWT 4
GUI-Programmer JFilechooser, mehrere Datein selektieren und Reihenfolge (2) AWT, Swing, JavaFX & SWT 8
S Mehrere JLists - Wie kennzeichnen? AWT, Swing, JavaFX & SWT 2
S Swing MVC Ein JFrame, mehrere JPanels AWT, Swing, JavaFX & SWT 6
J Mehrere JRadioButtons, aber nur 1 darf ausgewählt sein AWT, Swing, JavaFX & SWT 4
L Swing Mehrere Button die selbe Größe AWT, Swing, JavaFX & SWT 4
B AWT mehrere Fenster schließen AWT, Swing, JavaFX & SWT 8
I Wie mehrere JComboBoxen in Abhängigkeit einer anderen Box ändern? AWT, Swing, JavaFX & SWT 8
G mehrere JPanel in ein (vertikales) JScrollPane AWT, Swing, JavaFX & SWT 8
F Swing Mehrere Textfelder in Scrollpane einfügen und dann zum Scrollen bringen? AWT, Swing, JavaFX & SWT 4
GianaSisters Swing jTable - Feldtext soll mehrere Zeilen haben AWT, Swing, JavaFX & SWT 3
K JFileChooser mehrere Dateien markieren ohne STRG AWT, Swing, JavaFX & SWT 4
D Mehrere JTabel in einem Frame positionieren AWT, Swing, JavaFX & SWT 5
N mehrere JComboBoxes AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben