Java 拖动对象时自动滚动JScrollpane
我已经创建了一个约会日历,它本质上是一个JPanel,其中包含其他可移动和可调整大小的JPanel,所有这些都由一个JScrollpane包围,这一切都很好,我能够正确地使用滚动条在JPanel上滚动。我即将完成我的申请,但我想再做一件事 我想做的是,当用户移动约会(JPanel)时,当您到达scrollpane的边缘时,它将以所需的速度自动滚动。我不知道哪个现有的方法或类可以做到这一点(如果有的话),或者是否有人知道有一个jar库可以满足我的需要 这是懒惰吗?是的,也许,我想我应该自己编码,如果你同意的话,有人能建议我从哪里开始吗?我仍在学习Java,可能需要轻轻一推,以保持代码整洁Java 拖动对象时自动滚动JScrollpane,java,swing,jscrollpane,autoscroll,scrollpane,Java,Swing,Jscrollpane,Autoscroll,Scrollpane,我已经创建了一个约会日历,它本质上是一个JPanel,其中包含其他可移动和可调整大小的JPanel,所有这些都由一个JScrollpane包围,这一切都很好,我能够正确地使用滚动条在JPanel上滚动。我即将完成我的申请,但我想再做一件事 我想做的是,当用户移动约会(JPanel)时,当您到达scrollpane的边缘时,它将以所需的速度自动滚动。我不知道哪个现有的方法或类可以做到这一点(如果有的话),或者是否有人知道有一个jar库可以满足我的需要 这是懒惰吗?是的,也许,我想我应该自己编码,如
如果我能提供更多的细节来帮助回答,请告诉我。好的,事实上并不复杂。您需要调用
setAutoscroll(true)在“可滚动”组件上添加一个MouseMotionListener
,调用scrollRectToVisible
下面是一个小示例代码:
import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class TestImageResize {
protected void initUI() throws MalformedURLException, IOException {
final JFrame frame = new JFrame(TestImageResize.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BufferedImage bi = ImageIO.read(new URL(
"http://www.desktopwallpaperhd.net/wallpapers/19/5/islands-paradise-maldive-nature-background-image-landscape-194469.jpg"));
JPanel panel = new JPanel(new BorderLayout());
JLabel label = new JLabel(new ImageIcon(bi));
panel.add(label);
MouseMotionListener doScrollRectToVisible = new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
Rectangle r = new Rectangle(e.getX(), e.getY(), 1, 1);
((JPanel) e.getSource()).scrollRectToVisible(r);
}
};
panel.addMouseMotionListener(doScrollRectToVisible);
panel.setAutoscrolls(true);
frame.add(new JScrollPane(panel));
frame.pack();
frame.setSize(frame.getWidth() / 2, frame.getHeight() / 2);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
new TestImageResize().initUI();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
好的,其实并不复杂。您需要调用setAutoscroll(true)在“可滚动”组件上添加一个MouseMotionListener
,调用scrollRectToVisible
下面是一个小示例代码:
import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class TestImageResize {
protected void initUI() throws MalformedURLException, IOException {
final JFrame frame = new JFrame(TestImageResize.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BufferedImage bi = ImageIO.read(new URL(
"http://www.desktopwallpaperhd.net/wallpapers/19/5/islands-paradise-maldive-nature-background-image-landscape-194469.jpg"));
JPanel panel = new JPanel(new BorderLayout());
JLabel label = new JLabel(new ImageIcon(bi));
panel.add(label);
MouseMotionListener doScrollRectToVisible = new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
Rectangle r = new Rectangle(e.getX(), e.getY(), 1, 1);
((JPanel) e.getSource()).scrollRectToVisible(r);
}
};
panel.addMouseMotionListener(doScrollRectToVisible);
panel.setAutoscrolls(true);
frame.add(new JScrollPane(panel));
frame.pack();
frame.setSize(frame.getWidth() / 2, frame.getHeight() / 2);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
new TestImageResize().initUI();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
谢谢@GuillaumePolet,我已经试着将它添加到滚动窗格和面板中,但它不起作用。很可能我所做的某些事情与此方法相冲突。我将考虑添加我正在处理的代码。它需要时间来修剪它,它是巨大的!谢谢@GuillaumePolet,我已经试着将它添加到滚动窗格和面板中,但它不起作用。很可能我所做的某些事情与此方法相冲突。我将考虑添加我正在处理的代码。它需要时间来修剪它,它是巨大的!很好,这个例子是我想要的。我将把它应用到我的代码中,并向您报告。谢谢你花时间讨论这个问题。好的,当我在主面板上拖动时,它会工作,但当我移动另一个位于顶部的jpanel时,它不会工作。我已将侦听器添加到各个约会中,但当我拖动它时,它会一直滚动到顶部。我在下面添加了我更改的内容:MouseMotionListener doscorlrecttovisible=newmousemotionadapter(){@Override public void mouseDragged(MouseEvent e){rectangler=new Rectangle(mainPanel.getX(),mainPanel.getY(),1,1);mainPanel.scrollRectToVisible(r);};appPanel.addMouseMotionListener(doScrollRectToVisible)代码>eek!如何在注释中输入换行符?对不起@JoeChamberlain发表了一篇关于你的问题的文章。这个新矩形(mainPanel.getX(),mainPanel.getY(),1,1)代码>只能是错误的。mainPanel.getX()将始终是优秀的示例,我希望它能按我的方式工作。我将把它应用到我的代码中,并向您报告。谢谢你花时间讨论这个问题。好的,当我在主面板上拖动时,它会工作,但当我移动另一个位于顶部的jpanel时,它不会工作。我已将侦听器添加到各个约会中,但当我拖动它时,它会一直滚动到顶部。我在下面添加了我更改的内容:MouseMotionListener doscorlrecttovisible=newmousemotionadapter(){@Override public void mouseDragged(MouseEvent e){rectangler=new Rectangle(mainPanel.getX(),mainPanel.getY(),1,1);mainPanel.scrollRectToVisible(r);};appPanel.addMouseMotionListener(doScrollRectToVisible)代码>eek!如何在注释中输入换行符?对不起@JoeChamberlain发表了一篇关于你的问题的文章。这个新矩形(mainPanel.getX(),mainPanel.getY(),1,1)代码>只能是错误的。mainPanel.getX()将始终为0