Чтобы иметь некоторый контроль над тем, как рисуются изображения, я бы порекомендовал создать для этого собственную панель и использовать вызовы drawImage
в переопределенном методе paintComponent
.«Местоположение» изображения предпочтительно должно быть значением относительно , то есть значением double
между 0,0 (показывает первое изображение) и 1,0 (показывает второе изображение), чтобы оно не зависело от разрешения.и размер изображения.
Там - это предостережение относительно размера изображения, хотя: нужно предположить, что размер обоих изображений одинаков.В противном случае вы открываете банку с червями в отношении вопроса о том, как обрабатывать изображения разных размеров.Кроме того, есть некоторые степени свободы, что должно происходить, когда содержащий компонент больше или меньше, чем изображения.Но для простоты можно предположить, что он всегда имеет правильный размер.
Тогда простая реализация может выглядеть так:
![ImageSlide](https://i.stack.imgur.com/8ojdL.gif)
А вот соответствующий код:
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);
}
}