Ява качели фоновое изображение - PullRequest
5 голосов
/ 09 февраля 2010

Я использую JFrame, и у меня есть фоновое изображение на моем кадре. Теперь проблема в том, что размер изображения меньше, чем размер кадра, поэтому я должен сохранить то же изображение еще раз в пустой части окна. Если пользователь нажимает кнопку «Развернуть», мне может потребоваться поместить изображение в пустую область кадра во время выполнения. Может кто-нибудь сказать мне, как это сделать?

Ответы [ 3 ]

12 голосов
/ 09 февраля 2010

Звучит так, как будто вы говорите о плитке против растяжения, хотя неясно, какое поведение вы хотите.

В этой программе есть примеры обоих:

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {
    public static void main(String[] args) throws IOException {
        final Image image = ImageIO.read(new URL("http://sstatic.net/so/img/logo.png"));
        final JFrame frame = new JFrame();
        frame.add(new ImagePanel(image));
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

@SuppressWarnings("serial")
class ImagePanel extends JPanel {
    private Image image;
    private boolean tile;

    ImagePanel(Image image) {
        this.image = image;
        this.tile = false;
        final JCheckBox checkBox = new JCheckBox();
        checkBox.setAction(new AbstractAction("Tile") {
            public void actionPerformed(ActionEvent e) {
                tile = checkBox.isSelected();
                repaint();
            }
        });
        add(checkBox, BorderLayout.SOUTH);
    };

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (tile) {
            int iw = image.getWidth(this);
            int ih = image.getHeight(this);
            if (iw > 0 && ih > 0) {
                for (int x = 0; x < getWidth(); x += iw) {
                    for (int y = 0; y < getHeight(); y += ih) {
                        g.drawImage(image, x, y, iw, ih, this);
                    }
                }
            }
        } else {
            g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
        }
    }
}
1 голос
/ 09 февраля 2010

Вы хотите что-то вроде фонового изображения рабочего стола Windows, когда фоновое изображение используется несколько раз вместо изменения его размера или просто отображается по центру?

Вам нужно только сохранить изображение один раз и просто закрасить его несколько раз в методе paintComponent.

0 голосов
/ 21 мая 2015

Другой способ мозаичного изображения - с TexturePaint:

public class TexturePanel extends JPanel {

    private TexturePaint paint;

    public TexturePanel(BufferedImage bi) {
        super();
        this.paint = new TexturePaint(bi, new Rectangle(0, 0, bi.getWidth(), bi.getHeight()));
    }

    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setPaint(paint);
        g2.fill(new Rectangle(0, 0, getWidth(), getHeight()));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...