我不确定如何在标题中正确命名我的问题,但我希望我的图片可以表达我正在寻找的内容:
所以我想要完成的是,例如你有两张图片,如上所示,还有一个旁边有幻灯片的对象[在图片中命名为 (1)]
根据幻灯片 (1) 的进度/值,是否IMAGE A 滑动而IMAGE B 会弹出。
一旦幻灯片到达底部,IMAGE B将完全接管显示区域,而IMAGE A被隐藏。反之亦然,幻灯片上升到顶部。
有没有想法如何在 Swing 中用 Java 创建这样的东西?我希望我的解释足够准确,可以理解。
感谢您的帮助 :)
编辑 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);
为了对图像的绘制方式进行一些控制,我建议为此创建一个自己的面板,并drawImage
在覆盖的paintComponent
方法中使用调用。图像的“位置”最好应该是一个相对值——即double
介于 0.0(显示第一张图像)和 1.0(显示第二张图像)之间的值,与分辨率和图像大小无关。
这里是关于图像大小一个警告,虽然:一个人必须假定这两个图像的大小是一样的。否则,您将在如何处理不同图像大小的问题上打开一大堆蠕虫。此外,当包含组件大于或小于图像时,应该有一定的自由度。但为简单起见,可以假设它始终具有正确的尺寸。
一个简单的实现可能如下所示:
这是相应的代码:
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);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句