Hi!
Ich habe ein JPanel, das das anzuzeigende Image an die Größe des JPanel anpasst.
Das will ich nun im LINE_END eines BorderLayouts einbinden, aber das passt sich die Größe nicht mehr wie gewünscht an. Vermutlich liegt es an der PreferredSize des JPanel, aber ich konnte das Problem noch nicht lösen und stehe mittlerweile auf dem Schlauch.
Der Header soll wie im GridBagLayout angegeben 10% des Fensters belegen. Das Image soll sie maximale Höhe des Headers ausnutzen.
Der relevante Code beginnt wohl in der Methode createAndInitHeader() und geht dann über addContentTo(header) zu createAndInitHeaderlogo():
Ich habe ein JPanel, das das anzuzeigende Image an die Größe des JPanel anpasst.
Das will ich nun im LINE_END eines BorderLayouts einbinden, aber das passt sich die Größe nicht mehr wie gewünscht an. Vermutlich liegt es an der PreferredSize des JPanel, aber ich konnte das Problem noch nicht lösen und stehe mittlerweile auf dem Schlauch.
Der Header soll wie im GridBagLayout angegeben 10% des Fensters belegen. Das Image soll sie maximale Höhe des Headers ausnutzen.
Der relevante Code beginnt wohl in der Methode createAndInitHeader() und geht dann über addContentTo(header) zu createAndInitHeaderlogo():
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.LayoutManager;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class BorderLayoutDemo extends JFrame {
private static final long serialVersionUID = 2863765494455240239L;
private boolean SHOW_TEXT_INSTEAD_OF_LOGO = false;
private Dimension startupSize = new Dimension(1024, 768);
private GridBagConstraints c = new GridBagConstraints();
private static JComponent imageWrapper;
private static ImageIcon image = new ImageIcon("images/rrc_logo.gif");
public static void main(String[] args) {
JFrame demoApp = new BorderLayoutDemo();
demoApp.setVisible(true);
}
public BorderLayoutDemo() {
initialize();
addHeader();
addContent();
DynamicImagePanel dynImage = new DynamicImagePanel(image.getImage());
JFrame imageOnly = new JFrame();
imageOnly.add(dynImage);
imageOnly.setSize(234, 100);
imageOnly.setVisible(true);
imageOnly.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void initialize() {
initializeFrame();
initialzeLayoutContraints();
}
private void initializeFrame() {
LayoutManager frameLayout = new GridBagLayout();
setLayout(frameLayout);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(startupSize);
}
private void initialzeLayoutContraints() {
}
private void addHeader() {
JPanel header = createAndInitHeader();
c.gridx = 0;
c.gridy = 0;
c.fill = GridBagConstraints.BOTH;
c.weightx = 0.5;
c.weighty = 0.1;
add(header, c);
}
private JPanel createAndInitHeader() {
JPanel header = new JPanel(new BorderLayout());
header.setBorder(BorderFactory.createEtchedBorder());
addContentTo(header);
return header;
}
private void addContentTo(JPanel container) {
JPanel maincontent = createAndInitHeadertext();
container.add(maincontent, BorderLayout.CENTER);
JComponent logo = createAndInitHeaderlogo();
container.add(logo, BorderLayout.LINE_END);
}
private JPanel createAndInitHeadertext() {
int numberOfHeaderRows = 3;
JPanel headertext = new JPanel(new GridLayout(0, 1));
headertext.setBorder(BorderFactory.createTitledBorder("text"));
for(int i=0; i<numberOfHeaderRows; i++) {
addLabelTo(headertext, "header row", i);
}
return headertext;
}
private JPanel createAndInitHeaderlogo() {
LayoutManager logolayout = new FlowLayout();
JPanel container = new JPanel(logolayout);
container.setBorder(BorderFactory.createTitledBorder("logo"));
if(SHOW_TEXT_INSTEAD_OF_LOGO) {
imageWrapper = new JLabel("Logo");
} else {
imageWrapper = new DynamicImagePanel(image.getImage());
}
imageWrapper.setBorder(BorderFactory.createEtchedBorder());
container.add(imageWrapper);
container.add(Box.createRigidArea(new Dimension(50, 0)));
return container;
}
private void addContent() {
JPanel content = createAndInitContent();
c.gridx = 0;
c.gridy = 1;
c.fill = GridBagConstraints.BOTH;
c.weightx = 0.5;
c.weighty = 0.9;
add(content, c);
}
private JPanel createAndInitContent() {
int numberOfContentAreas = 2;
JPanel container = new JPanel(new GridLayout(0, numberOfContentAreas));
container.setBorder(BorderFactory.createTitledBorder("content"));
for(int i=0; i<numberOfContentAreas; i++) {
addLabelTo(container, "main content", i);
}
return container;
}
private void addLabelTo(JPanel container, String textprefix, int number) {
JLabel row = new DynamicFontLabel(textprefix+ " "+ number);
row.setHorizontalAlignment(JLabel.CENTER);
row.setVerticalAlignment(JLabel.CENTER);
row.setBorder(BorderFactory.createEtchedBorder());
container.add(row);
}
public class DynamicFontLabel extends JLabel {
private static final long serialVersionUID = 5037485673099026994L;
private Insets margin = new Insets(0, 5, 0, 5);
public DynamicFontLabel() {
super();
}
public DynamicFontLabel(String string) {
super(string);
}
@Override
protected void paintComponent(Graphics g) {
calcFont(g);
super.paintComponent(g);
}
private void calcFont(Graphics g) {
Insets insets = getInsets();
// Insets margin = getMargin(); // just for a JButton
int x = insets.left + margin.left;
int y = insets.top + margin.top;
// Breite und Höhe bestimmen
Dimension size = getSize();
int w = size.width - x - insets.right - margin.right;
int h = size.height - y - insets.bottom - margin.bottom;
Font font = g.getFont();
String text = getText();
FontMetrics fm = g.getFontMetrics(font);
while (fm.stringWidth(text) < w && fm.getMaxAscent() + fm.getMaxDescent() < h) {
font = font.deriveFont(font.getSize2D() + 0.5f);
fm = g.getFontMetrics(font);
}
g.setFont(font);
}
}
class DynamicImagePanel extends JPanel {
private static final long serialVersionUID = 1928634527591569084L;
private Image background;
public DynamicImagePanel(Image image) {
background = image;
}
public void paintComponent(Graphics g) {
int width = getWidth();
int height = getHeight();
g.drawImage(background, 0, 0, width, height, this);
BorderLayoutDemo.imageWrapper.setPreferredSize(new Dimension(image.getIconWidth()+50, image.getIconHeight()));
}
}
}