Java - создание непрерывного слайда изображения с помощью Swing - PullRequest
0 голосов
/ 10 июня 2019

Я не был уверен, как правильно назвать мою проблему в заголовке, но я надеюсь, что мое изображение может выразить то, что я ищу:

https://i.stack.imgur.com/fIhP8.png

Итак, я пытаюсь сделать так, чтобы у вас, например, было две картинки, как показано выше, и объект со слайдом рядом с ним [named (1) на картинке]

В зависимости от хода / значения слайда (1), ИЗОБРАЖЕНИЕ Снимает ли слайд и Отображается ли ИЗОБРАЖЕНИЕ B .

Как только слайд достигнет дна, ИЗОБРАЖЕНИЕ B полностью займет область отображения, а ИЗОБРАЖЕНИЕ A будет скрыто. То же самое относится и к слайду, идущему наверх.

Есть ли идеи, как создать такую ​​вещь с помощью Java в Swing? Я надеюсь, что мое объяснение было достаточно точным, чтобы понять.

Спасибо за помощь:)

Редактировать 1: Вот код, который я реализовал @camickr Я думал, что это должно работать только путем установки панели просмотра. Я сделал какую-либо ошибку, следуя вашим инструкциям?

JPanel bigPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 20));
JPanel displayPanel = new JPanel();
JScrollPane scrollPane = new JScrollPane();
[...] 
displayPanel.setLayout(new BoxLayout(displayPanel, BoxLayout.X_AXIS));
JLabel label1 = new JLabel(new ImageIcon("R:\\imgA.jpg"));
JLabel label2 = new JLabel(new ImageIcon("R:\\imgB.jpg"));
displayPanel.add(label1);
displayPanel.add(label2);
scrollPane.setViewportView(displayPanel);
bigPanel.add(scrollPane);

Ответы [ 2 ]

2 голосов
/ 11 июня 2019

Чтобы иметь некоторый контроль над тем, как рисуются изображения, я бы порекомендовал создать для этого собственную панель и использовать вызовы drawImage в переопределенном методе paintComponent.«Местоположение» изображения предпочтительно должно быть значением относительно , то есть значением double между 0,0 (показывает первое изображение) и 1,0 (показывает второе изображение), чтобы оно не зависело от разрешения.и размер изображения.

Там - это предостережение относительно размера изображения, хотя: нужно предположить, что размер обоих изображений одинаков.В противном случае вы открываете банку с червями в отношении вопроса о том, как обрабатывать изображения разных размеров.Кроме того, есть некоторые степени свободы, что должно происходить, когда содержащий компонент больше или меньше, чем изображения.Но для простоты можно предположить, что он всегда имеет правильный размер.

Тогда простая реализация может выглядеть так:

ImageSlide

А вот соответствующий код:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

public class ImageSlideTest
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        BufferedImage image0 = createImage("Image 0", Color.RED);
        BufferedImage image1 = createImage("Image 1", Color.GREEN);

        ImageSlidePanel imageSlidePanel = new ImageSlidePanel(image0, image1);
        JPanel panel = new JPanel(new BorderLayout());

        panel.add(imageSlidePanel, BorderLayout.CENTER);

        JSlider slider = new JSlider(SwingConstants.VERTICAL, 0, 100, 0);
        slider.addChangeListener(e -> 
        {
            double location = slider.getValue() / 100.0;
            imageSlidePanel.setLocation(location);
        });
        panel.add(slider, BorderLayout.EAST);

        f.getContentPane().add(panel);

        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private static BufferedImage createImage(String text, Color color)
    {
        int w = 300;
        int h = 200;
        BufferedImage image =
            new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = image.createGraphics();
        g.setColor(color);
        g.fillRect(0, 0, w, h);
        g.setColor(Color.BLACK);
        g.setFont(new Font("Dialog", Font.PLAIN, 30));
        g.drawString(text, 50, 50);
        g.dispose();
        return image;
    }
}

class ImageSlidePanel extends JPanel
{
    private final BufferedImage image0;
    private final BufferedImage image1;
    private double location;

    // Note: The images should have the same size...
    public ImageSlidePanel(BufferedImage image0, BufferedImage image1)
    {
        this.image0 = image0;
        this.image1 = image1;
        this.location = 0.0;
    }

    public void setLocation(double location)
    {
        this.location = Math.min(1.0, Math.max(0.0, location));
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        int dx = (int) (image0.getWidth() * location);
        g.drawImage(image0, -dx, 0, null);
        g.drawImage(image1, -dx + image0.getWidth(), 0, null);
    }

    @Override
    public Dimension getPreferredSize()
    {
        if (isPreferredSizeSet())
        {
            return super.getPreferredSize();
        }
        int w = image0.getWidth();
        int h = image0.getHeight();
        return new Dimension(w, h);
    }

}
2 голосов
/ 10 июня 2019
  1. Создайте два JLabels каждый с ImageIcon для изображения.
  2. Добавьте каждую метку к JPanel, используя горизонтальную BoxLayout
  3. добавить панель к JScrollPane
  4. добавить панель прокрутки к кадру.

Панель прокрутки автоматически отображает полосу прокрутки, если панель не полностью заполняет пространство, доступное для панели прокрутки.

Edit:

Код, который вы опубликовали, НЕ является "MRE":

  1. Мы не можем скомпилировать этот код, поэтому мы не знаем точного контекста использования кода.

  2. Какой смысл текстового поля? Ваш вопрос был о прокрутке двух изображений. Таким образом, текстовое поле не имеет отношения к поставленному вопросу.

  3. У нас нет доступа к вашему изображению, поэтому его также не следует включать в «MRE».

Основой вашего вопроса является возможность прокрутки двух ярлыков. Итак, чтобы проверить это, все что вам нужно, это что-то вроде:

JLabel red = new JLabel("Image 1");
red.setOpaque(true);
red.setBackground( Color.RED );
red.setPreferredSize( new Dimension(200, 200) ); // for testing only

JLabel blue = new JLabel("Image 2");
...

JPanel displayPanel = new JPanel();
displayPanel.setLayout(new BoxLayout(displayPanel, BoxLayout.X_AXIS));
JScrollPane scrollPane = new JScrollPane(displayPanel);
frame.add(scrollPane);
frame.pack();
frame.setVisible(true);

Создайте правильную программу, используя вышеуказанное в качестве основы.

Когда отображается рамка, изображения будут отображаться в полном размере. Сожмите рамку, и появятся полосы прокрутки.

Решение не совсем то, что вы просили, но показывает, как использовать компоненты по умолчанию для достижения эффекта прокрутки. Лично я считаю более интуитивно понятным прокручивать изображения справа налево, используя горизонтальную полосу прокрутки вместо вертикального ползунка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...