Button auf Bild/ JLayeredPane in Jpanel

Status
Nicht offen für weitere Antworten.
H

Haribald

Gast
Hallo,


ich habe mal wieder eine Frage, bei der ich nicht weiterkomme.
Ich verwende in einer recht verschachtelten Gui ein JPanel, in welchem ein Bild angezeigt wird.
Ich möchte nun im unteren Rand dieses Panels 2 Buttons anzeigen lassen und zwar direkt auf dem Bild.

Lösen wollte ich das ursprünglich mit der JLayeredPane, das Problem ist nur, die funktioniert nicht in einem JPanel, sondern nur in einem JFrame.
Bei einer GlassPane siehts ja ähnlich aus.

Hat jemand eine Idee, wie ich das sonst lösen könnte?


Gruß

Haribald
 

Landei

Top Contributor
Wie zeigst du das Bild an?

Eine Lösungsidee wäre, das Bild mit der paint() Methode des Panels zu malen, also sozusagen als "Hintergrund".

Das Panel würde ich
- entweder auf BorderLayout setzen und im Süden dann ein durchsichtiges Unterpanel (FlowLayout oder GridLayout) mit den beiden Knöppen adden
- oder mit dem GridBagLayout kämpfen, bis die Knöppe da sind wo sie sein sollen
 
H

Haribald

Gast
Hallo Landei,

vielen Dank für die Antwort,
darf ich fragen, wie ich ein durchsichtiges UnterPanel erstelle? Einfach ein Panel mit setOpaque(true)?

Hier mal eine abgewandelte LayeredPane Demo, die die Geschichte verdeutlicht

Code:
import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.*;

public class JLayeredPaneSample {
  public static void main(String args[]) {
	JLayeredPane desktop = new JDesktopPane();
    JFrame f = new JFrame("JDesktopPane Sample");
    JPanel left=new JPanel();
    	left.setBorder(BorderFactory.createTitledBorder("Where is the Layered Pane?"));
    JPanel right=new JPanel();
    	right.setBorder(BorderFactory.createTitledBorder("Right Panel"));
    JSplitPane sP=new JSplitPane();
    	sP.setDividerLocation(150);
    left.setOpaque(true);
    
    
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container content = f.getContentPane();
    
    desktop.setOpaque(false);
    desktop.add(createLayer("Open 1"), JLayeredPane.POPUP_LAYER);
    desktop.add(createLayer("Iconified"), JLayeredPane.DEFAULT_LAYER);
    desktop.add(createLayer("Open 2"), JLayeredPane.PALETTE_LAYER);
    
    left.add(desktop);
    sP.add(left,JSplitPane.LEFT);
    sP.add(right,JSplitPane.RIGHT);
    
    content.add(sP, BorderLayout.CENTER);
    f.setSize(300, 200);
    f.setVisible(true);
  }

  public static JInternalFrame createLayer(String label) {
    return new SelfInternalFrame(label);
  }

  static class SelfInternalFrame extends JInternalFrame {
    public SelfInternalFrame(String s) {
      getContentPane().add(new JLabel(s), BorderLayout.CENTER);
      setBounds(50, 50, 100, 100);
      setResizable(true);
      setClosable(true);
      setMaximizable(true);
      setIconifiable(true);
      setTitle(s);
      setVisible(true);
    }
  }
}
 
H

Haribald

Gast
Ein Wort zur Anzeige der Bilder:

Das bild wird über die Instanz einer Klasse angezeigt, die von JComponent abgeleitet wird und kann dadurch direkt in das Panel gelegt werden.
Daran kann ich nichts ändern, sonst verhauts mir das gesamte restliche Programm.

Ich hab jetzt mal versucht 2 Panels übereinander in den linken Teil der SplitPane (beider BorderLAyout.North) zu legen. Die untere beinhaltet das Bild, die obere nur einen Button.
Leider wird unabhängig von setOpaque das Bild (-die untere Pane) nicht mehr angezeigt.

Hat jemand eine Idee?

Gruß

Haribald
 

André Uhres

Top Contributor
Versuch's mal so:
Code:
...
        JPanel left = new JPanel(new BorderLayout());
...
        public SelfInternalFrame(String s) {
            setOpaque(false);
            setBackground(new Color(0f, 0f, 0f, 0f));
...
So müssten die JInternalFrames durchsichtig sein. Allerdings bin ich nicht sicher, was du überhaupt willst :?
 
H

Haribald

Gast
Hallo, danke, für deine Antwort.

Bin mir jetzt leider nicht sicher, ob sich deine Antwort auf die Version mit der LayeredPane oder dem durchsichtigen Panel bezieht.?

Ich setz mal mein Beispiel mit dem Panel drunter, die Klasse ImageComponent ist auch dabei,-also lauffähig.
Wie ma sieht überrschreibt das obere Panel das untere, ich hätte den Button aber gerne direkt auf dem Bild.


Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.*;
import javax.swing.*;

public class JLayeredPaneSample {
  public static void main(String args[]) {
	
    JFrame f = new JFrame("JDesktopPane Sample");  
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container content = f.getContentPane();
    
    //Grundaufbau
    JPanel left=new JPanel();
    	left.setBorder(BorderFactory.createTitledBorder("Where is the Picture Panel?"));
    	left.setLayout(new BorderLayout());
    JPanel right=new JPanel();
    	right.setBorder(BorderFactory.createTitledBorder("Right Panel"));
    JSplitPane sP=new JSplitPane();
    	sP.setDividerLocation(150);
    	
    //Oberes Panel
    final JPanel glass=new JPanel();
    glass.setOpaque(false);
    glass.setBackground(new Color(0f, 0f, 0f, 0f)); 
    JButton test=new JButton("klick");
    glass.setLayout(new FlowLayout());
    glass.add(test);   
    
    test.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			glass.setVisible(false);
		}
	});  
    
   //Unteres Panel
    JPanel back=new JPanel();    
    BufferedImage buf=new BufferedImage(500,500,BufferedImage.TYPE_BYTE_GRAY);
    Graphics2D g = buf.createGraphics();
	g.setColor(Color.BLACK);
	g.fillRect(0, 0, 500, 500);
	g.setColor(Color.WHITE);
	g.fillRect(100, 100, 200, 200);
	ImageComponent iC=new ImageComponent(buf);
	back.add(iC);
    
    left.add(back,BorderLayout.NORTH);
    left.add(glass,BorderLayout.NORTH); //Hier auskommentieren um das Bild zu sehen
    sP.add(left,JSplitPane.LEFT);
    sP.add(right,JSplitPane.RIGHT);
    
    content.add(sP, BorderLayout.CENTER);
    f.setSize(300, 200);
    f.setVisible(true);
  } 
}

class ImageComponent extends JComponent{
	
	private BufferedImage 	image;
				
	public BufferedImage getImage(){return image;}
	
	
	
	public ImageComponent(BufferedImage image){
		this.image=image;
		setPreferredSize (new Dimension (image.getWidth(null),image.getHeight(null)));
	}
	
	public void paintComponent (Graphics g){
		g.drawImage(image,0,0,null);
	}
	
}
 

André Uhres

Top Contributor
Ich seh da aber kein JLayeredPane.
Die fünf Bereiche von BorderLayout können jeweils nur eine einzige Komponente aufnehmen.
In einem JLayeredPane ist standardmäßig kein Layoutmanager eingestellt.
Daher müssen alle integrierten Komponenten feste Positionsangaben und Größen haben.
Dazu kann man beispielsweise die Methode setBounds(int x, int y, int width, int height) benutzen.
Wenn man einem JLayeredPane einen Layoutmanager zuordnet,
so werden alle Komponenten gemäß den Richtlinien so angeordnet, als wären sie alle in einer Ebene.
Siehe auch: How to Use Layered Panes. Dort findest du auch den Abschnitt "Laying Out Components in a Layered Pane".

Mein erster Beitrag bezieht sich übrigens auf diese Version: http://www.java-forum.org/de/viewtopic.php?p=458176#458176
 
H

Haribald

Gast
Hallo,

danke für deine Antwort.
Was ich mit dem zweiten Beispiel (ohne LayeredPane) zeigen wollte, ist der stark vereinfachte Aufbau meines Programms.

- eine SplitPane, darin in der Links- und Rechtskomponente Panels.


Ich möchte nun in einem dieser Panels (im Beispiel das Linke) mehrere Komponenten übeinander legen und zwar einmal eine ImageComponente (siehe Beispiel -ein Bild) und darüber mehrere Buttons.
Im Endergebnis sollen die Buttons also direkt auf dem Bild sein.

Ich muss das nicht zwangsweise mit einer LayeredPane lösen, wichtig ist mir nur es irgendwie zu lösen ;-)
Die Anforderungen und Beschränkungen der LayeredPane kenne ich. Das Problem das ich habe ist dieses, dass ich meines Wissens keine LayeredPane in ein JPanel stecken kann, sondern nur in Frames.

Die Frage ist , wie erreich ich es, im linken Teil der SplitPane mehrere Komponenten übereinander zu legen, so dass die unteren (in dem Fall das Bild) noch zu sehen sind?

Hoffe es ist etwas klarer geworden

Gruß

Haribald
 

André Uhres

Top Contributor
Versuch mal den JButton einfach der Bildkomponente hinzuzufügen. Beispiel:
Code:
//left.add(glass,BorderLayout.NORTH); //Hier auskommentieren um das Bild zu sehen
iC.setLayout(new FlowLayout());
JButton bt = new JButton("klick");
iC.add(bt);
(das ist im im Prinzip die Lösung, die schon in der allerersten Antwort vom Landei vorgeschlagen wurde)
 
H

Haribald

Gast
Hallo André


Vielen Dank für die Antwort.
Auf die Idee, das direkt in die ImageComponente zu legen bin ich absolut nicht gekommen.
Vielen vielen Dank dafür, jetzt bin ich fast am Ziel.
Die erste Antwort hatte ich so verstanden, wie ich sie im zweiten Beispiel umgesetzt habe, nämlich eine neues
Panel zu erstellen, dass ich auf Durchsichtig stelle. (Panel glass)
Da hab ich wohl etwas falsch verstanden.

Ich hätte eine ergänzende Frage:
Die Bilder der ImageComponent können sehr unterschiedlicher Größe sein. Aus diesem Grund liegt die ImageComponent selbst noch in einem ScrollPanel.
Wenn ich den Button nun an den unteren Teil des Bildes hänge wir er somit mitunter erst durch Scrollen sichtbar.
In diesem Fall wäre es also sinnvoller, den Butto z.B. an die ScrollPane zu hängen, um ihn immer Beispielsweise im rechten untere Eck zu haben. Das Bild wird beim Scrollen also unter dem Button wegbewegt.
Lässt sich das auch realisieren?

Gruß

Haribald
 

André Uhres

Top Contributor
Wir können ein JPanel mit OverlayLayout erstellen. Dort kommt dann zuerst der JButton hinein
und dann die BildKomponente:
Code:
...
        JPanel jPanel1 = new JPanel() {
            @Override
            public boolean isOptimizedDrawingEnabled() {
                return false;
            }
        };
        jPanel1.setLayout(new OverlayLayout(jPanel1));
        JPanel jPanel2 = new JPanel(new BorderLayout());
        jPanel2.setOpaque(false);
        JPanel jPanel3 = new JPanel();
        jPanel3.setPreferredSize(new Dimension(0, 50));
        jPanel3.setOpaque(false);
        jPanel3.add(new JButton("klick"));
        jPanel2.add(jPanel3, BorderLayout.SOUTH);

        jPanel1.add(jPanel2);//zuerst der JButton
...
        jPanel1.add(new JScrollPane(iC));//dann die Bildkomponente

        sP.add(jPanel1, JSplitPane.LEFT);
...
 
H

Haribald

Gast
Super,

funktioniet einwandfrei.
Ganz herzlichen Dank für dein Geduld und Hilfe André.
Den anderen natürlich auch :)

Gruß

Haribald
 

André Uhres

Top Contributor
Haribald hat gesagt.:
Super,funktioniet einwandfrei.
Wenn du registriert wärst, könntest du das jetzt abhaken :wink:

abhaken.jpg
 
R

redchili

Gast
Haribald hat gesagt.:
... Lösen wollte ich das ursprünglich mit der JLayeredPane, das Problem ist nur, die funktioniert nicht in einem JPanel, sondern nur in einem JFrame. ...
Hallo!

Was genau funktioniert denn nicht mit JLayeredPane (jlp) in einem JPanel (jp)?
Ich habe ein grob ähnliches Problem wie Du und habe nach einiger herumprobiererei nun herausbekommen, dass es doch geht.
Warum es bei mir zunächst so schien, als ob es nicht ginge (Inhalte der JLayeredPane waren nicht sichtbar) war, dass ich vergessen hatte, bei der JLayeredPane eine Grösse, zu setzen (null-Layoutmanager) und diese somit 0x0 gross war.

Was mich skeptisch gemacht hatte war:
Code:
// frame-creation etc
JPanel jp = new JPanel();

// add jp to frame here ... 
 
JLayeredPane jlp = new JLayeredPane();

jp.add(jlp);

// add some components to jlp here...

jp.getComponentCount();   // returns 1! so there must be something...
dpl.getComponentCount();  // also returns the correct number of added components
also nicht vergessen (am besten gleich bei der erzeugung vom jlp-Objekt:
Code:
jlp.setSize(xSize, ySize);
Grüsse, red
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Swing Bild in Button AWT, Swing, JavaFX & SWT 11
Ksanatos Swing Bild (.jpg) einlesen und per Button wechseln AWT, Swing, JavaFX & SWT 9
MaxG. Swing Bild Button AWT, Swing, JavaFX & SWT 7
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
A Applet Bild als Button setzen... AWT, Swing, JavaFX & SWT 6
M animiertes Bild nach Klick auf Button AWT, Swing, JavaFX & SWT 3
P [SWT] Button-ToolItem mit Text und Bild AWT, Swing, JavaFX & SWT 2
L Button ändert eigenes Bild und Progressbar-Value nicht AWT, Swing, JavaFX & SWT 6
S Ein Bild beim drücken eines Button zuweisen AWT, Swing, JavaFX & SWT 16
G Bild als Checkbox bzw gerasteten Button? AWT, Swing, JavaFX & SWT 3
C Bild in Button AWT, Swing, JavaFX & SWT 4
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
G Button auswerten und ausgeben ob richtig oder falsch AWT, Swing, JavaFX & SWT 1
D Button und Textfeld Darstellung AWT, Swing, JavaFX & SWT 3
H Button / Design Ideen AWT, Swing, JavaFX & SWT 2
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
B JavaFX Sprachumschaltung mit Button auf der HMI AWT, Swing, JavaFX & SWT 6
T TableView Button onAction AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
JavaBeginner22 Button Hilfe AWT, Swing, JavaFX & SWT 0
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
J Button-Keyboard Interaktion AWT, Swing, JavaFX & SWT 7
EinNickname9 Swing Button mittig positionieren AWT, Swing, JavaFX & SWT 4
L actionListener für Button AWT, Swing, JavaFX & SWT 97
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
I JavaFX Hover-Effekt bei Button AWT, Swing, JavaFX & SWT 11
Zeppi Swing Button soll Spiel zurücksetzen AWT, Swing, JavaFX & SWT 5
G Button Strings Effektiver setzen AWT, Swing, JavaFX & SWT 3
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
W Zweites/neues Fenster durch Button öffnen AWT, Swing, JavaFX & SWT 6
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
W JavaFX Button - optimale Breite berechnen AWT, Swing, JavaFX & SWT 1
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
S JavaFx Zufallsfarbe beim Button-Klick AWT, Swing, JavaFX & SWT 22
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
Z Button bewegen und Plätze tauschen AWT, Swing, JavaFX & SWT 4
Z Swing Button anklicken und bewegen AWT, Swing, JavaFX & SWT 2
K JavaFX Button verbinden AWT, Swing, JavaFX & SWT 6
Z Mit einem Button einen anderen Button Triggern AWT, Swing, JavaFX & SWT 3
M JavaFX Button action abhängigkeit von Tab AWT, Swing, JavaFX & SWT 1
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
H Eigener Dialog mit Rückgabe -> Warten auf Button AWT, Swing, JavaFX & SWT 3
F JLabel mit ImageIcon per Button bewegen AWT, Swing, JavaFX & SWT 4
L Button Funktion zuweisen in WindowBuilder AWT, Swing, JavaFX & SWT 22
A Button mit Speicher-Funktion AWT, Swing, JavaFX & SWT 8
krgewb Swing Icon von Button AWT, Swing, JavaFX & SWT 12
J Schriftart über einen Button ändern AWT, Swing, JavaFX & SWT 1
Bluedaishi JavaFX Button Image aus Datenbank AWT, Swing, JavaFX & SWT 13
CptK Swing Button: ImageIcon unter den Text AWT, Swing, JavaFX & SWT 4
Ø Swing Button in anderer Klassen ausführen AWT, Swing, JavaFX & SWT 6
X Neues Fenster mit Button öffnen und bearbeiten AWT, Swing, JavaFX & SWT 4
cool_brivk24 Swing Button Farbe ändern AWT, Swing, JavaFX & SWT 2
K JavaFX TextInputDialog Button Text ändern AWT, Swing, JavaFX & SWT 1
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
J Aus welchen Grund wird der Button nicht angezeigt im GridPane? AWT, Swing, JavaFX & SWT 1
S GUI Schließen Button auf der linken Seite AWT, Swing, JavaFX & SWT 2
das_leon AWT Button Design ändern AWT, Swing, JavaFX & SWT 5
J Thread per Button starten AWT, Swing, JavaFX & SWT 10
E Button verschwindet nachdem ein Rechteck gezeichnet wurde AWT, Swing, JavaFX & SWT 5
G JComboBox: Arrow-Button permanent anzeigen AWT, Swing, JavaFX & SWT 4
emma_louisa JavaFX MenuBar Zweitfenster; bei Button "Abbrechen" nur das Zweitfenster schließen AWT, Swing, JavaFX & SWT 2
I JavaFX: "globaler Button" AWT, Swing, JavaFX & SWT 0
M JavaFX ActionEvent Button AWT, Swing, JavaFX & SWT 6
S JavaFx - Button ActionEvent Probleme AWT, Swing, JavaFX & SWT 3
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
Q AWT TicTacToe Image auf Button hinzufügen AWT, Swing, JavaFX & SWT 5
H JavaFX - Button und Text - Falsche Darstellung AWT, Swing, JavaFX & SWT 3
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
it_is_all Swing Button, ComboBox,... -- Unterschied: NetBeans Design <-> Ausführung AWT, Swing, JavaFX & SWT 2
B FXML GUI - Button ausblenden AWT, Swing, JavaFX & SWT 1
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
L JavaFX button über andere Klasse ändern AWT, Swing, JavaFX & SWT 7
L Suchergebnisse variabel mit Button anzeigen lassen AWT, Swing, JavaFX & SWT 3
K über Button andere Java Klasse aufrufen AWT, Swing, JavaFX & SWT 15
J Event Handling Button "enablen" wenn Eingaben in Textfeldern korrekt sind AWT, Swing, JavaFX & SWT 1
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
V JavaFX Button Controller Fehler, trotz Erfolg in einem anderem Code? AWT, Swing, JavaFX & SWT 7
E Fehler bei Button AWT, Swing, JavaFX & SWT 1
A Swing Tabelle wird bei Betätigung des Button nicht befüllt AWT, Swing, JavaFX & SWT 17
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
GreenTeaYT Button funktioniert nicht für Ein-und Auszahlungen? AWT, Swing, JavaFX & SWT 8
MaxG. Swing Farbe von Button beim drücken ändern AWT, Swing, JavaFX & SWT 4
S per Button Variableninhalt aus anderer Klasse holen AWT, Swing, JavaFX & SWT 3
A Swing GUI - Button soll Frame verändern AWT, Swing, JavaFX & SWT 4
T Frage zu GUI - Button soll Objekt erfassen AWT, Swing, JavaFX & SWT 2
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
N Swing Abfrage durch JTextField nach Button betätigung AWT, Swing, JavaFX & SWT 3
H JavaFX via .fxml einen abgeleiteten Button erstellen... AWT, Swing, JavaFX & SWT 4
T JavaFX Button als Runnable AWT, Swing, JavaFX & SWT 4
OlafHD JPasswordField mit Button eingeben AWT, Swing, JavaFX & SWT 4
B JavaFX Wie programmiere ich hier einen "Weiter" Button? AWT, Swing, JavaFX & SWT 11
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
D JavaFX Button Links- und Rechtsklick? AWT, Swing, JavaFX & SWT 1
Thallius Button von JDatePicker customizen? AWT, Swing, JavaFX & SWT 0
K eigener button in swing AWT, Swing, JavaFX & SWT 3
C Durch klicken von Button neues Fenster oeffnen AWT, Swing, JavaFX & SWT 18

Ähnliche Java Themen

Neue Themen


Oben