Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Картинка выходит за размеры JPanel? 
V
    Опции темы
Killer_13
  Дата 30.3.2012, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



Элементарный вопрос гружу картинку в JLabel, JLabel гружу в JPanel соответственно если картинка побольше хочу, чтоб она занимала то место которое выделено под JPanel а не выходила за его границы. По идее такое должно делаться BorderLayou.CENTER. Почему-то не срабатывает.. или идея моя ложная? smile Если вот так, и картинка больше выделенной ей области и видно только ее часть, а мне нужно чтоб она чуток уменьшалась и занимала все пространство панели, но не больше!

Спасибо!

Код

public class ChessBoard extends JPanel {

    private JPanel[][] countChessCells = new JPanel[8][8];
    
    private ImageIcon pawnBlack = new ImageIcon("./lib/images/ChessFigurPack1/pawnBlack.png");

    public ChessBoard() {

        this.setLayout(new GridLayout(8, 8));
        drawChessBoard();
    }

    private void drawChessBoard() {
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                countChessCells[i][j] = new JPanel(new BorderLayout());
                countChessCells[i][j].addMouseListener(this);
                countChessCells[i][j].add(new JLabel(this.pawnBlack),BorderLayout.CENTER);
                this.add(countChessCells[i][j]);

                if (i % 2 == 0) {
                    if (j % 2 != 0) {
                        countChessCells[i][j].setBackground(Color.DARK_GRAY);
                    } else {
                        countChessCells[i][j].setBackground(Color.WHITE);
                    }
                } else {
                    if (j % 2 == 0) {
                        countChessCells[i][j].setBackground(Color.DARK_GRAY);
                    } else {
                        countChessCells[i][j].setBackground(Color.WHITE);
                    }
                }
            }
        }
    }
}



PM MAIL   Вверх
Mirkes
Дата 1.4.2012, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 2
Всего: 17



Насколько я помню Java сама рисунки по размеру не подгоняет. Нужно перекрыть метод paint и в нем руками подгонять размер картинки к имеющемуся размеру панели. К сожалению не знаю процедур преобразования картинок. Может более опытные подскажут.

Это сообщение отредактировал(а) Mirkes - 1.4.2012, 08:17


--------------------
Mirkes
PM MAIL   Вверх
jk1
Дата 1.4.2012, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



Сама по себе тема масштабирования картинок в Java довольно непростая и требует хорошего знания матчасти.
Если нужно просто быстро поменять размер изображения, то можно воспользоваться вот этим утилитным классом из одного из моих проектов, он как раз нанимается масштабированием изображений
Код

public class ImageUtils {

    public static final int IMAGE_PNG = 1;
    private static final int ALPHA_CHANNEL_MASK = 0xFF000000;
    private static final int RED_CHANNEL_MASK = 0x00FF0000;
    private static final int GREEN_CHANNEL_MASK = 0x0000FF00;
    private static final int BLUE_CHANNEL_MASK = 0x000000FF;
    private static final int BIT = 8;
    private static final int TWO_BITS = 16;
    private static final int THREE_BITS = 24;


    /**
     * Resizes an image.
     *
     * @param image     The image to resize
     * @param maxWidth  The image's max width
     * @param maxHeight The image's max height
     * @param type      int code jpeg, png or gif
     * @return A resized <code>BufferedImage</code>
     */
    public BufferedImage resizeImage(BufferedImage image, int type, int maxWidth, int maxHeight) {
        Dimension largestDimension = new Dimension(maxWidth, maxHeight);

        // Original size
        int imageWidth = image.getWidth(null);
        int imageHeight = image.getHeight(null);

        float aspectRatio = (float) imageWidth / imageHeight;

        if (imageWidth > maxWidth || imageHeight > maxHeight) {
            if ((float) largestDimension.width / largestDimension.height > aspectRatio) {
                largestDimension.width = (int) Math.ceil(largestDimension.height * aspectRatio);
            } else {
                largestDimension.height = (int) Math.ceil(largestDimension.width / aspectRatio);
            }

            //Modified size
            imageWidth = largestDimension.width;
            imageHeight = largestDimension.height;
        }
        return createBufferedImage(image, type, imageWidth, imageHeight);
    }

    /**
     * Creates a <code>BufferedImage</code> from an <code>Image</code>. This method can
     * function on a completely headless system. This especially includes Linux and Unix systems
     * that do not have the X11 libraries installed, which are required for the AWT subsystem to
     * operate. The resulting image will be smoothly scaled using bilinear filtering.
     *
     * @param source The image to convert
     * @param width  The desired image width
     * @param height The desired image height
     * @param type   int code jpeg, png or gif
     * @return bufferedImage The resized image
     */
    private BufferedImage createBufferedImage(BufferedImage source, int type, int width, int height) {
        int imageType = BufferedImage.TYPE_INT_RGB;
        if (type == IMAGE_PNG && hasAlpha(source)) {
            imageType = BufferedImage.TYPE_INT_ARGB;
        }

        BufferedImage bufferedImage = new BufferedImage(width, height, imageType);

        int sourceX;
        int sourceY;

        double scaleX = (double) width / source.getWidth();
        double scaleY = (double) height / source.getHeight();

        int x1;
        int y1;

        double xDiff;
        double yDiff;

        int rgb;
        int rgb1;
        int rgb2;

        for (int y = 0; y < height; y++) {
            sourceY = y * source.getHeight() / bufferedImage.getHeight();
            yDiff = y / scaleY - sourceY;

            for (int x = 0; x < width; x++) {
                sourceX = x * source.getWidth() / bufferedImage.getWidth();
                xDiff = x / scaleX - sourceX;

                x1 = Math.min(source.getWidth() - 1, sourceX + 1);
                y1 = Math.min(source.getHeight() - 1, sourceY + 1);

                rgb1 = getRGBInterpolation(source.getRGB(sourceX, sourceY), source.getRGB(x1, sourceY), xDiff);
                rgb2 = getRGBInterpolation(source.getRGB(sourceX, y1), source.getRGB(x1, y1), xDiff);

                rgb = getRGBInterpolation(rgb1, rgb2, yDiff);

                bufferedImage.setRGB(x, y, rgb);
            }
        }

        return bufferedImage;
    }

    /**
     * Makes rgb interpolation.
     *
     * @param value1   first known value
     * @param value2   second known value
     * @param distance distance between values
     * @return rgb an integer pixel in the ARGB color model
     */
    private int getRGBInterpolation(int value1, int value2, double distance) {
        int alpha1 = (value1 & ALPHA_CHANNEL_MASK) >>> THREE_BITS;
        int red1 = (value1 & RED_CHANNEL_MASK) >> TWO_BITS;
        int green1 = (value1 & GREEN_CHANNEL_MASK) >> BIT;
        int blue1 = (value1 & BLUE_CHANNEL_MASK);

        int alpha2 = (value2 & ALPHA_CHANNEL_MASK) >>> THREE_BITS;
        int red2 = (value2 & RED_CHANNEL_MASK) >> TWO_BITS;
        int green2 = (value2 & GREEN_CHANNEL_MASK) >> BIT;
        int blue2 = (value2 & BLUE_CHANNEL_MASK);

        return ((int) (alpha1 * (1.0 - distance) + alpha2 * distance) << THREE_BITS)
                | ((int) (red1 * (1.0 - distance) + red2 * distance) << TWO_BITS)
                | ((int) (green1 * (1.0 - distance) + green2 * distance) << BIT)
                | (int) (blue1 * (1.0 - distance) + blue2 * distance);
    }

    /**
     * Determines if the image has transparent pixels.
     *
     * @param image The image to check for transparent pixel.s
     * @return <code>true</code> of <code>false</code>, according to the result
     */
    private boolean hasAlpha(Image image) {
        try {
            PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);
            pg.grabPixels();

            return pg.getColorModel().hasAlpha();
        } catch (InterruptedException e) {
            return false;
        }
    }
}




--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Killer_13
Дата 1.4.2012, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



jk1 - пасиб, пока обошелся без этого, если что воспользуюсь. smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0680 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.