Неправильное расположение фонового изображения

Я пытаюсь создать класс BackgroundImage, целью которого является создание фона с несколькими слоями изображений, я использую JLayeredPane для достижения слоев.

Фоновое изображение будет содержать постоянное базовое изображение и будет иметь методы, которые позволяют (надеюсь) постепенно увеличивать и уменьшать изображения на этом базовом изображении.

Прямо сейчас я застрял на базовом изображении, находящемся неправильно.

Вот изображение, которое показывает проблему:

Изображение, показывающее проблему с местоположением

Как вы можете видеть на изображении, над изображением есть небольшая серая область, которой не должно быть. Я бы хотел, чтобы базовое изображение занимало все пространство.

Вот MCVE:

Класс BackgroundTest

import java.awt.*;
import javax.swing.*;

final class BackgroundTest extends JFrame {

public static void main(String[] args) {
    new BackgroundTest();
}

BackgroundTest() {
    JPanel contentPanel = new JPanel();
    BackgroundImage bgImage = new BackgroundImage(contentPanel);

    add(contentPanel);
    setSize(getScreenDimension());
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
}

public static Dimension getScreenDimension() {
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    Rectangle bounds = ge.getMaximumWindowBounds();
    return new Dimension((int) bounds.getWidth(), (int) bounds.getHeight());
}
}

Класс BackgroundImage

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import org.imgscalr.Scalr;

class BackgroundImage {

    private final BaseImage baseImage;
    private final JPanel targetPanel;
    private final JLayeredPane layeredPane;

    BackgroundImage(JPanel targetPanel) {
        this.targetPanel = targetPanel;
        layeredPane = new JLayeredPane();
        Dimension screenDimension = BackgroundTest.getScreenDimension();
        layeredPane.setPreferredSize(screenDimension);
        layeredPane.setMaximumSize(screenDimension);
        layeredPane.setMinimumSize(screenDimension);

        baseImage = new BaseImage();
        layeredPane.add(baseImage, new Integer(0));

        targetPanel.add(layeredPane);
    }

    public void addCharacterImageToBase(int characterIdentifier) {

    }

    public void replaceCurrentCharacterImage(int characterIdentifier) {

    }


    private class BaseImage extends JComponent {
        private ImageIcon imageIcon;
        private int imageWidth, imageHeight;

        BaseImage() {

            BufferedImage backgroundImage;
            try {
                Dimension screenSize = BackgroundTest.getScreenDimension();
                imageWidth = screenSize.width;
                imageHeight = screenSize.height;
                setBounds(0, 0, imageWidth, imageHeight);
                backgroundImage = ImageIO.read(getClass().getResource("/images/background/sky.jpg"));
                if (imageWidth > 0 && imageHeight > 0) {
                    backgroundImage = Scalr.resize(backgroundImage, Scalr.Method.QUALITY, Scalr.Mode.FIT_EXACT, imageWidth, imageHeight, Scalr.OP_ANTIALIAS);
                }
                imageIcon = new ImageIcon(backgroundImage);
            } catch (IOException e) {
                Main.getLogger().log(java.util.logging.Level.INFO, e.getMessage(), e);
            }
        }

        public int getImageWidth() {
            return imageWidth;
        }

        public int getImageHeight() {
            return imageHeight;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(imageIcon.getImage(), 0, 0, imageWidth, imageHeight, this);
        }
    }

    private class CharacterImage extends JComponent {

        CharacterImage(int currentLevelNumber) {

        }
    }
   }

Спасибо за ваше время.

1 ответ

Решение

Ответ в том, что ваш JPanel имеет BorderLayout по умолчанию, а его hgap и vgap не равны 0.

Ты нуждаешься в этом:

JPanel contentPanel = new JPanel(new BorderLayout(0,0));
Другие вопросы по тегам