Moinsen,
habe folgendes Problem:
Ich hab ne Klasse StyledPanel geschrieben die vom JPanel erbt, in der ein BufferedImage über die paintComponent-Methode in den Hintergrund gezeichnet wird. Das StyledPanel besitzt ein contentPanel, in dem sich ein Label befindet. Das contentPanel ist durchsichtig (setOpaque(true)) damit man den Hintergrund im StyledPanel sehen kann. Jedoch verschwindet dadurch auch das Label und zwar nur dieses.
Alle anderen Component, die im contentPanel enthalten sind werden normal angezeigt.
Das Label kommt erst wieder zum Vorschein, wenn man setOpaque(true) vom Label aufruft, was natürlich auch deren Hintergrund zum Vorschein bringt.
Gewünscht ist aber, dass nur der Text des Labels dargestellt wird und nicht zusammen mit dem Hintergrund des Labels.
Alle Panels besitzen ein BoxLayout.
So sieht der Kopf der paintComponent-Methode des StyledPanels aus:
super.paintComponent(g) nach dem Zeichnen von background (BufferedImage) aufzurufen führt nur dazu dass background nicht mehr angezeigt wird (jedoch das Label).
Ich hab mich schon durch mehrer Foren durchgeklickt und zahlreiche Artikel zu den Swing Komponent und co. gelesen, aber noch keine passende Lösung gefunden.
Der Lösung, das StyledPanel vom JLabel erben zu lassen und diesem dann das Bild als ImageIcon zuübergeben, bin ich bisher ausgewichen, da ich sonst große Änderungen an meiner Klasse vornehmen müsste.
Ich würde mich freuen, wenn mir jemand eine schnellere Lösung für mein Problem zeigen könnte.
Gruß BreakdownBob
Hier nochmal der gesamte Code der Klasse StyledPanel:
habe folgendes Problem:
Ich hab ne Klasse StyledPanel geschrieben die vom JPanel erbt, in der ein BufferedImage über die paintComponent-Methode in den Hintergrund gezeichnet wird. Das StyledPanel besitzt ein contentPanel, in dem sich ein Label befindet. Das contentPanel ist durchsichtig (setOpaque(true)) damit man den Hintergrund im StyledPanel sehen kann. Jedoch verschwindet dadurch auch das Label und zwar nur dieses.
Alle anderen Component, die im contentPanel enthalten sind werden normal angezeigt.
Das Label kommt erst wieder zum Vorschein, wenn man setOpaque(true) vom Label aufruft, was natürlich auch deren Hintergrund zum Vorschein bringt.
Gewünscht ist aber, dass nur der Text des Labels dargestellt wird und nicht zusammen mit dem Hintergrund des Labels.
Alle Panels besitzen ein BoxLayout.
So sieht der Kopf der paintComponent-Methode des StyledPanels aus:
Code:
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(background != null) {
g.drawImage(background, background_left.getWidth()-3, this.BACKGROUND_TOP_Y+background_top.getHeight()-9, this.getSize().width-background_right.getWidth()-16, this.getSize().height-background_bottom.getHeight()-43, this);
}
Ich hab mich schon durch mehrer Foren durchgeklickt und zahlreiche Artikel zu den Swing Komponent und co. gelesen, aber noch keine passende Lösung gefunden.
Der Lösung, das StyledPanel vom JLabel erben zu lassen und diesem dann das Bild als ImageIcon zuübergeben, bin ich bisher ausgewichen, da ich sonst große Änderungen an meiner Klasse vornehmen müsste.
Ich würde mich freuen, wenn mir jemand eine schnellere Lösung für mein Problem zeigen könnte.
Gruß BreakdownBob
Hier nochmal der gesamte Code der Klasse StyledPanel:
Code:
package game.gui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.EmptyBorder;
import game.content.inventory.Inventory;
import game.content.item.Item;
import game.gui.ItemPanel;
import game.main.Game;
import game.safeload.SaveLoad;
public class StyledPanel extends JPanel{
public static final Dimension DEFAULT_DIMENSION = new Dimension(300,300);
public static final String RES_PATH = "styledpanel/";
public static final String BACKGROUND = "background.png";
public static final String BACKGROUND_TOP_SOURCE = "background_top.png";
public static final String BACKGROUND_TOP_LEFT_SOURCE = "background_top_left.png";
public static final String BACKGROUND_TOP_RIGHT_SOURCE = "background_top_right.png";
public static final String BACKGROUND_TOP_SYMBOL_SOURCE = "background_top_symbol.png";
public static final String BACKGROUND_LEFT_SOURCE = "background_left.png";
public static final String BACKGROUND_RIGHT_SOURCE = "background_right.png";
public static final String BACKGROUND_BOTTOM_SOURCE = "background_bottom.png";
public static final String BACKGROUND_BOTTOM_LEFT_SOURCE = "background_bottom_left.png";
public static final String BACKGROUND_BOTTOM_RIGHT_SOURCE = "background_bottom_right.png";
public static final int BACKGROUND_TOP_Y = 40;
public static final int BORDER_TOP_DEFAULT = 91;
public static final int BORDER_RIGHT_DEFAULT = 51;
public static final int BORDER_LEFT_DEFAULT = 51;
public static final int BORDER_BOTTOM_DEFAULT = 50;
protected int borderTop;
protected int borderRight;
protected int borderLeft;
protected int borderBottom;
private BufferedImage background;
private BufferedImage background_top;
private BufferedImage background_top_left;
private BufferedImage background_top_right;
private BufferedImage background_top_symbol;
private BufferedImage background_left;
private BufferedImage background_right;
private BufferedImage background_bottom;
private BufferedImage background_bottom_left;
private BufferedImage background_bottom_right;
private JLabel backgroundLbl;
private JPanel contentPane;
public StyledPanel() {
this(DEFAULT_DIMENSION);
}
public StyledPanel(Dimension d) {
setMaximumSize(d);
setPreferredSize(d);
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
borderTop = BORDER_TOP_DEFAULT;
borderRight = BORDER_RIGHT_DEFAULT;
borderLeft = BORDER_LEFT_DEFAULT;
borderBottom = BORDER_BOTTOM_DEFAULT;
updateBorder();
loadBackground();
contentPane = new JPanel();
Dimension contentD = new Dimension(this.getPreferredSize().width-borderLeft-borderRight,this.getPreferredSize().height-borderTop-borderBottom);
contentPane.setLayout(new BoxLayout(contentPane,BoxLayout.PAGE_AXIS));
contentPane.setPreferredSize(contentD);
contentPane.setMaximumSize(contentD);
contentPane.setOpaque(false);
add(contentPane);
}
public void updateBorder() {
setBorder(new EmptyBorder(borderTop, borderLeft, borderBottom, borderRight));
}
public int getBorderTop() {
return borderTop;
}
public void setBorderTop(int borderTop) {
this.borderTop = borderTop;
updateBorder();
}
public int getBorderRight() {
return borderRight;
}
public void setBorderRight(int borderRight) {
this.borderRight = borderRight;
updateBorder();
}
public int getBorderLeft() {
return borderLeft;
}
public void setBorderLeft(int borderLeft) {
this.borderLeft = borderLeft;
updateBorder();
}
public int getBorderBottom() {
return borderBottom;
}
public void setBorderBottom(int borderBottom) {
this.borderBottom = borderBottom;
updateBorder();
}
public JPanel getContentPane() {
return contentPane;
}
private void loadBackground() {
try {
background = ImageIO.read(new File(Game.RESOURCE_FOLDER + this.RES_PATH + BACKGROUND));
background_top = ImageIO.read(new File(Game.RESOURCE_FOLDER + this.RES_PATH + BACKGROUND_TOP_SOURCE));
background_top_left = ImageIO.read(new File(Game.RESOURCE_FOLDER + this.RES_PATH + BACKGROUND_TOP_LEFT_SOURCE));
background_top_right = ImageIO.read(new File(Game.RESOURCE_FOLDER + this.RES_PATH + BACKGROUND_TOP_RIGHT_SOURCE));
background_top_symbol = ImageIO.read(new File(Game.RESOURCE_FOLDER + this.RES_PATH + BACKGROUND_TOP_SYMBOL_SOURCE));
background_bottom = ImageIO.read(new File(Game.RESOURCE_FOLDER + this.RES_PATH + BACKGROUND_BOTTOM_SOURCE));
background_bottom_left = ImageIO.read(new File(Game.RESOURCE_FOLDER + this.RES_PATH + BACKGROUND_BOTTOM_LEFT_SOURCE));
background_bottom_right = ImageIO.read(new File(Game.RESOURCE_FOLDER + this.RES_PATH + BACKGROUND_BOTTOM_RIGHT_SOURCE));
background_left = ImageIO.read(new File(Game.RESOURCE_FOLDER + this.RES_PATH + BACKGROUND_LEFT_SOURCE));
background_right = ImageIO.read(new File(Game.RESOURCE_FOLDER + this.RES_PATH + BACKGROUND_RIGHT_SOURCE));
}
catch(Exception e) {
e.printStackTrace();
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(background != null) {
g.drawImage(background, background_left.getWidth()-3, this.BACKGROUND_TOP_Y+background_top.getHeight()-9, this.getSize().width-background_right.getWidth()-16, this.getSize().height-background_bottom.getHeight()-43, this);
}
if(background_top != null) {
g.drawImage(background_top, 0, this.BACKGROUND_TOP_Y, this.getSize().width, background_top.getHeight(), this);
}
if(background_bottom != null) {
g.drawImage(background_bottom, 0, this.getSize().height-background_bottom.getHeight(), this.getSize().width, background_bottom.getHeight(), this);
}
if(background_left != null) {
g.drawImage(background_left, 0, BACKGROUND_TOP_Y, background_left.getWidth(), (int)this.getSize().getHeight(), this);
}
if(background_right != null) {
g.drawImage(background_right, this.getSize().width-background_right.getWidth(), BACKGROUND_TOP_Y, background_right.getWidth(), (int)this.getSize().getHeight(), this);
}
if(background_top_left != null) {
g.drawImage(background_top_left, 0, BACKGROUND_TOP_Y-1, background_top_left.getWidth(), background_top_left.getHeight(), this);
}
if(background_top_right != null) {
g.drawImage(background_top_right, this.getSize().width-background_top_right.getWidth(), BACKGROUND_TOP_Y-1, background_top_right.getWidth(), background_top_right.getHeight(), this);
}
if(background_bottom_left != null) {
g.drawImage(background_bottom_left, 0, this.getSize().height-background_bottom_left.getHeight(), background_bottom_left.getWidth(), background_bottom_left.getHeight(), this);
}
if(background_bottom_right != null) {
g.drawImage(background_bottom_right, this.getSize().width-background_bottom_right.getWidth(), this.getSize().height-background_bottom_left.getHeight(), background_bottom_left.getWidth(), background_bottom_left.getHeight(), this);
}
if(background_top_symbol != null) {
g.drawImage(background_top_symbol, this.getSize().width/2-background_top_symbol.getWidth()/2, 0, background_top_symbol.getWidth(), background_top_symbol.getHeight(), this);
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(500, 700);
frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));
StyledPanel sp = new StyledPanel();
try {
sp = new StyledPanel(new Dimension(300,500));
JLabel label = new JLabel("asdasd");
JButton button = new JButton("asdasd");
sp.getContentPane().add(button);
sp.getContentPane().add(label);
} catch (Exception e) {
e.printStackTrace();
}
frame.getContentPane().add(sp);
frame.setVisible(true);
}
}