可滚动区域没有滚动条

时间:2013-04-05 11:10:42

标签: java swing jscrollpane jscrollbar

我需要创建一个通常应用滚动条的区域,它必须水平滚动(内容只是一个更大的逻辑区域的视图),但我必须使用一些左右放置的特殊控件控制以便滚动。

我想知道使用绝对值(根据逻辑视图并减去偏移量。因此,偏移量的控件将放置为负x值并因此被丢弃。具有高于宽度的x值的控件也会被丢弃。

这是一种有效的方法吗?

祝你好运 索伦

1 个答案:

答案 0 :(得分:2)

您可以在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);
  }
}