Text vom Jlabel wird nicht angezeigt

R0wiwan

Mitglied
Hallo zusammen!
Ich habe mit GUI angefangen, und will ein kleines Text-Story-Game programmieren.
Leider wird dennoch der Text, den ich über ein Jlabel ausgeben will nicht angezeigt.
Ich habe ein ImageIcon als Hintergrundbild, und vermute, dass das der Fehler ist.
Könnt ihr mir helfen?

Hier ist der Code vom Window:


import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.Color;
import java.awt.font.*;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.*;

public class StoryWindow extends JFrame {

Font font = new Font("Arial", 0, 20);
ImageIcon bild;
JLabel background;
JLabel text;


public StoryWindow(ActionListener listener) {

setTitle("Story");
setSize(500,500);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

bild = new ImageIcon("background1.png");

JPanel mainpanel = new JPanel();
mainpanel.setOpaque(true);
add(mainpanel);
JPanel buttonleiste = new JPanel();
add(buttonleiste, BorderLayout.SOUTH);
buttonleiste.setBackground(Color.gray);
buttonleiste.setPreferredSize(new Dimension(40,40));

background = new JLabel(bild);
mainpanel.add(background);
text = new JLabel();
text.setText("Test");
mainpanel.add(text);

JButton auswahlA = new JButton("Start");
JButton auswahlB = new JButton("Exit");
buttonleiste.add(auswahlA);
buttonleiste.add(auswahlB);
auswahlA.setFont(font);
auswahlB.setFont(font);
auswahlA.addActionListener(listener);
auswahlB.addActionListener(listener);

}

public void showMessage(String msg) {
text.setText(msg);
text.setFont(font);
}

}


Hier ist noch der Code vom Controller:


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Controller implements ActionListener {

private StoryWindow window;

public void startStory() {
window = new StoryWindow(this);
window.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();

if (command.equals("Start")) {
window.showMessage("Start");
}
else if (command.equals("Exit")) {
System.exit(0);
}

}

}
 
Ich habe ein ImageIcon als Hintergrundbild, und vermute, dass das der Fehler ist.
Ja, das ist kein Hintergrundbild. BorderLayout zeigt in jedem seiner Bereiche eine Komponente an.

Was funktionieren könnte, wäre ein LayeredPane aber ein Panel, das ein Hintergrundbild anzeigen soll, wäre für mich eine eigene Komponente. Hier ein Starter mit Skalierung (ohne ist es wesentlich einfacher):
Java:
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

// for testing purposes
import javax.imageio.ImageIO;
import java.net.URL;

public class ImagePanel extends JPanel {
    private BufferedImage image;
    private Image scaled;

    public ImagePanel(BufferedImage image) {
        this.image = image;
    }

    @Override
    public Dimension getPreferredSize() {
        Insets insets = getInsets();
        int width = insets.left + insets.right + image.getWidth();
        int height = insets.top + insets.bottom + image.getHeight();
        return new Dimension(width, height);
    }

    @Override
    protected void paintComponent(Graphics g) {
        Insets insets = getInsets();
        g.drawImage(getScaled(), insets.left, insets.top, null);
    }

    private Image getScaled() {
        Insets insets = getInsets();                
        int w = getWidth() - insets.left - insets.right;
        int h = getHeight() - insets.top - insets.bottom;

        if (scaled == null || scaled.getWidth(null) != w || scaled.getHeight(null) != h) {
            scaled = image.getScaledInstance(w, h, Image.SCALE_SMOOTH);
        }

        return scaled;
    }


    public static void main(String[] args) throws Exception {
        BufferedImage img = ImageIO.read(new URL("https://upload.wikimedia.org/" +
                "wikipedia/commons/thumb/7/77/Wikipedia_svg_logo.svg/" +
                "768px-Wikipedia_svg_logo.svg.png"));

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JPanel panel = new ImagePanel(img);
                panel.add(new JButton("Test"));
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.add(panel);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}
 
Danke für die Antwort!
Aber ich glaube, ich lass das erstmal ganz weg mit den Hintergrundbildern, da mir das noch zu kompliziert ist.
Ich versuch einfach, ein Storygame ohne das Hintergrundbild zu machen.
 

Neue Themen


Zurück
Oben