我有一个JScrollPane附加到JFrame中包含的所有JPanel。我还有一个扩展JSlider的自定义滑块类。它也包含在JFrame中。我的问题是,当JSlider放大我面板中的图像时,我的JScrollPane没有使用图像缩放来调整大小。我已经尝试了从重置JScrollPane上的边界到手动调整滚动条以重置首选大小的所有内容。我在其他stackoverflow问题上看到的任何内容似乎都对我有用。这是我的一些代码,我在其中添加了当前的滚动窗格(没有一些多余的细节):
JFrame frame = new JFrame("");
frame.setTitle("Image Viewer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
if (img.getWidth() > START_WIDTH || img.getHeight() > START_HEIGHT) {
frame.setSize(START_WIDTH, START_HEIGHT);//variables set elsewhere in the code
} else {
frame.setSize(img.getWidth(), img.getHeight());//img is the BufferedImage displayed in the JPanel
}
parentPane = new BackgroundPane(img, frame.getWidth(), frame.getHeight()); //BackgroundPane is the JPanel. More accurately, it's a custom class extending JPanel.
scroll = new ImageScroller(parentPane,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS, img); //Custom class extending JScrollPane. This is the problematic area. Its size needs to readjust. It's also a class variable
frame.setLocationRelativeTo(null);
ImageSlider slider = new ImageSlider(SelectionRectangle.this); //the zoom bar extending JSlider
{...}//some removed superfluous code
frame.add(slider, BorderLayout.SOUTH);
frame.add(scroll);
frame.pack();
frame.setVisible(true);
以下是当面板缩放时当前在ImageSlider中使用的代码。我尝试重新调整滚动条的大多数尝试都发生在这里:
@Override
public void stateChanged(ChangeEvent arg0) {
int value = ((JSlider) arg0.getSource()).getValue();
SCALE = value / 100.0; //Scaling factor
ACTIVE_FRAME.revalidateViewport(); //Method within the frame class. See below
}
RevalidateViewport功能:
public void revalidateViewport() {
scroll.getViewport().revalidate();
scroll.getViewport().repaint();
}
如何根据比例因子调整滚动条的大小?有一些简单的方法我还没见过吗?我是JScrollPanes的新手。
谢谢。如果您有任何问题,请告诉我。