Java 当我在jscrollpane上下滚动时,图像的某些部分消失了
大家好,我对在Java 当我在jscrollpane上下滚动时,图像的某些部分消失了,java,swing,jscrollpane,mousemotionlistener,Java,Swing,Jscrollpane,Mousemotionlistener,大家好,我对在JPanel中绘制的图像有问题。将图像绘制到面板时没有问题。当我向上或向下滚动图像时,问题就出现了。当再次返回到该部分时,在视口中看不到的图像部分将被绘制为白色 我在JPanel中添加了一个buffereImage。我还可以使用仿射变换调整图像大小。问题是,当我向图像添加JScollPane时,每当我向上或向下滚动scrollpane时,图像的某些部分就会消失 我还尝试了使用drawrendedimage它确实解决了滚动的问题,但它打乱了其他功能 这是我能编写的最简洁的代码 pac
JPanel
中绘制的图像有问题。将图像绘制到面板时没有问题。当我向上或向下滚动图像时,问题就出现了。当再次返回到该部分时,在视口中看不到的图像部分将被绘制为白色
我在JPanel
中添加了一个buffereImage
。我还可以使用仿射变换调整图像大小。问题是,当我向图像添加JScollPane
时,每当我向上或向下滚动scrollpane
时,图像的某些部分就会消失
我还尝试了使用drawrendedimage
它确实解决了滚动的问题,但它打乱了其他功能
这是我能编写的最简洁的代码
package convert;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;
public class ZoomTest {
public static void main(String[] args) {
ImagePanel panel = new ImagePanel();
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(panel));
f.setSize(1200, 1200);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
class ImagePanel extends JPanel {
BufferedImage image;
double scale;
public ImagePanel() {
loadImage();
scale = .38;
addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
int rotation = e.getWheelRotation();
if (rotation < 0) {
scale -= .05;
} else {
scale += .05;
}
if (scale < 0) {
scale = 0;
}
revalidate();
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
double x = (getWidth() - scale * image.getWidth()) / 2;
double y = (getHeight() - scale * image.getHeight()) / 2;
AffineTransform at = new AffineTransform();
at.translate(x, y);
at.scale(scale, scale);
g2.setTransform(at);
g2.drawImage(image, 0, 0, null);
}
public Dimension getPreferredSize() {
int w = (int) (scale * image.getWidth());
int h = (int) (scale * image.getHeight());
return new Dimension(w, h);
}
private void loadImage() {
String fileName = "c:\\users\\john ebarita\\downloads\\lorem-ipsum-1.jpg";
try {
image = ImageIO.read(new File(fileName));
} catch (Exception e) {
e.printStackTrace();
}
}
}
包转换;
导入java.awt.*;
导入java.awt.event.*;
导入java.awt.geom.*;
导入java.awt.image.buffereImage;
导入java.io.*;
导入java.net。*;
导入java.util.ArrayList;
导入javax.imageio.imageio;
导入javax.swing.*;
导入javax.swing.event.*;
公共类动物测试{
公共静态void main(字符串[]args){
ImagePanel=新的ImagePanel();
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 getContentPane().add(新的JScrollPane(面板));
f、 设置大小(12001200);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
}
类ImagePanel扩展了JPanel{
缓冲图像;
双尺度;
公众影像小组(){
loadImage();
量表=.38;
addMouseWheelListener(新的MouseWheelListener(){
@凌驾
已移动公共无效鼠标滚轮(鼠标滚轮事件e){
int-rotation=e.getWheelRotation();
如果(旋转<0){
量表-=.05;
}否则{
量表+=.05;
}
如果(刻度<0){
比例=0;
}
重新验证();
重新油漆();
}
});
}
@凌驾
受保护组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
双x=(getWidth()-scale*image.getWidth())/2;
双y=(getHeight()-scale*image.getHeight())/2;
AffineTransform at=新的AffineTransform();
at.翻译(x,y);
比例(比例,比例);
g2.setTransform(at);
g2.drawImage(图像,0,0,空);
}
公共维度getPreferredSize(){
intw=(int)(scale*image.getWidth());
inth=(int)(scale*image.getHeight());
返回新尺寸(w,h);
}
私有void loadImage(){
String fileName=“c:\\users\\john ebarita\\downloads\\lorem-ipsum-1.jpg”;
试一试{
image=ImageIO.read(新文件(文件名));
}捕获(例外e){
e、 printStackTrace();
}
}
}
以下是您的问题的解决方案。我也有一个坏运气与自定义绘画,所以我的解决方案是直接更新鼠标滚轮上的图像,并将其设置为标签
import java.awt.Image;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
public class ZoomTest {
public static void main(String[] args) {
ImagePanel panel = new ImagePanel();
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(panel));
f.setSize(1000, 1000);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
class ImagePanel extends JLabel {
BufferedImage image;
double scale;
public ImagePanel() {
setHorizontalAlignment(SwingConstants.CENTER);
loadImage();
scale = .38;
updateImage();
addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
int rotation = e.getWheelRotation();
if (rotation < 0) {
scale -= .05;
} else {
scale += .05;
}
if (scale < 0) {
scale = 0;
}
updateImage();
revalidate();
repaint();
}
});
}
private void updateImage() {
int w = (int) (scale * image.getWidth());
int h = (int) (scale * image.getHeight());
setIcon(new ImageIcon(image.getScaledInstance(w, h, Image.SCALE_SMOOTH)));
}
private void loadImage() {
String fileName = "c:\\users\\john ebarita\\downloads\\lorem-ipsum-1.jpg";
try {
image = ImageIO.read(new File(fileName));
} catch (Exception e) {
e.printStackTrace();
}
}
}
导入java.awt.Image;
导入java.awt.event.mouseweelEvent;
导入java.awt.event.MouseWheelListener;
导入java.awt.image.buffereImage;
导入java.io.File;
导入javax.imageio.imageio;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JScrollPane;
导入javax.swing.SwingConstants;
公共类动物测试{
公共静态void main(字符串[]args){
ImagePanel=新的ImagePanel();
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 getContentPane().add(新的JScrollPane(面板));
f、 设置大小(10001000);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
}
类ImagePanel扩展了JLabel{
缓冲图像;
双尺度;
公众影像小组(){
设置水平对齐(旋转恒定中心);
loadImage();
量表=.38;
updateImage();
addMouseWheelListener(新的MouseWheelListener(){
@凌驾
已移动公共无效鼠标滚轮(鼠标滚轮事件e){
int-rotation=e.getWheelRotation();
如果(旋转<0){
量表-=.05;
}否则{
量表+=.05;
}
如果(刻度<0){
比例=0;
}
updateImage();
重新验证();
重新油漆();
}
});
}
私有void updateImage(){
intw=(int)(scale*image.getWidth());
inth=(int)(scale*image.getHeight());
设置图标(新的图像图标(image.getScaledInstance(w,h,image.SCALE_-SMOOTH));
}
私有void loadImage(){
String fileName=“c:\\users\\john ebarita\\downloads\\lorem-ipsum-1.jpg”;
试一试{
image=ImageIO.read(新文件(文件名));
}捕获(例外e){
e、 printStackTrace();
}
}
}
看一看。也许会有帮助
package convert;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;
public class ZoomTest2 {
public static void main(String[] args) {
ImagePanel panel = new ImagePanel();
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(panel));
f.setSize(1200, 1200);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
class ImagePanel extends JPanel {
BufferedImage image;
double scale;
public ImagePanel() {
loadImage();
scale = .38;
addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
int rotation = e.getWheelRotation();
if (rotation < 0) {
scale -= .05;
} else {
scale += .05;
}
if (scale < 0) {
scale = 0;
}
revalidate();
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
double x = (getWidth() - scale * image.getWidth()) / 2;
double y = (getHeight() - scale * image.getHeight()) / 2;
AffineTransform at = new AffineTransform();
at.translate(x, y);
at.scale(scale, scale);
// g2.setTransform(at);
// g2.drawImage(image, 0, 0, this);
g2.drawImage(image, at, this);
// or:
// AffineTransform atf = g2.getTransform();
// atf.concatenate(at);
// g2.setTransform(atf);
// g2.drawImage(image, 0, 0, this);
g2.dispose();
}
public Dimension getPreferredSize() {
int w = (int)(scale * image.getWidth());
int h = (int)(scale * image.getHeight());
return new Dimension(w, h);
}
private void loadImage() {
String fileName = "aaa.png";
try {
image = ImageIO.read(new File(fileName));
} catch (Exception e) {
e.printStackTrace();
}
}
}
包转换;
导入java.awt.*;
导入java.awt.event.*;
导入java.awt.geom.*;
导入java.awt.image.buffereImage;
导入java.io.*;
导入java.net。*;
导入java.util.ArrayList;
导入javax.imageio.imageio;
导入javax.swing.*;
导入javax.swing.event.*;
公共类动物测试2{
公共静态void main(字符串[]args){
ImagePanel=新的ImagePanel();
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 getContentPane().add(新的JScrollPane(面板));
f、 设置大小(12001200);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
}
类ImagePanel扩展了JPanel{
缓冲图像;
双尺度;
公众影像小组(){
loadImage();
量表=.38;
添加