我需要创建一个通常会应用滚动条的区域,它必须水平滚动(内容只是一个更大逻辑区域的视图),但我必须使用一些特殊的控件放置在控件的左右两侧命令滚动。
我有关于使用绝对值的想法(根据逻辑视图并减去偏移量。因此,偏移量右侧的控件将被放置为负 x 值并因此被丢弃。x 值高于宽度的控件也将被丢弃。
这是一种有效的方法吗?
最好的问候索伦
我需要创建一个通常会应用滚动条的区域,它必须水平滚动(内容只是一个更大逻辑区域的视图),但我必须使用一些特殊的控件放置在控件的左右两侧命令滚动。
我有关于使用绝对值的想法(根据逻辑视图并减去偏移量。因此,偏移量右侧的控件将被放置为负 x 值并因此被丢弃。x 值高于宽度的控件也将被丢弃。
这是一种有效的方法吗?
最好的问候索伦
您可以在 a 上创建一个JScrollPane
(Component
更大的逻辑区域)并删除滚动条。
然后,您可以添加按钮来左右滚动。单击这些按钮时,应移动滚动窗格的视图。这是通过设置视图的绝对位置来完成的。您可以通过首先获取视图的绝对位置然后增加/减少它并再次设置它来使其相对。
这是一个显示较大图像的可滚动窗口的类。
public class ViewScroller {
public ViewScroller() {
JFrame frame = new JFrame("ViewScroller");
final ImageIcon image = new ImageIcon("path\\to\\my\\image");
JLabel label = new JLabel(image);
final JScrollPane scrollPane = new JScrollPane(label);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
JButton left = new JButton("<");
left.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Point p = scrollPane.getViewport().getViewPosition();
p.x = p.x < 10 ? 0 : p.x - 10;
scrollPane.getViewport().setViewPosition(p);
}
});
JButton right = new JButton(">");
right.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Point p = scrollPane.getViewport().getViewPosition();
int offset = p.x + scrollPane.getViewport().getWidth();
p.x = offset + 10 > image.getIconWidth() ? p.x : p.x + 10;
scrollPane.getViewport().setViewPosition(p);
}
});
frame.add(right, BorderLayout.EAST);
frame.add(left, BorderLayout.WEST);
frame.add(scrollPane, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setVisible(true);
}
}