有没有一种方法可以将JScrollPane视口的宽度固定为其所有者(JScrollPane)的宽度。我的目标是一个JScrollPane,它可以向下滚动,但是视口的宽度被压缩/设置为JScrollPane的大小。
我尝试手动设置视口的大小,但是由于我使用GridLayout来布局组件,所以它失败了。我还尝试了GridBagLayout并将约束设置为视口及其组件。我还禁用了水平滚动条。
我对Java FX宽度不熟悉。
答案 0 :(得分:2)
您只需要为面板实现Scrollable
接口即可。这是一个示例:
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
/**
* <code>ScrollableExample</code>.
*/
public class ScrollableExample implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new ScrollableExample());
}
@Override
public void run() {
JPanel scrollPanel = new ScrollablePanel();
scrollPanel.setLayout(new GridLayout(20, 1));
for (int i = 0; i < 20; i++) {
scrollPanel.add(new JLabel("It's a simple label to test whether scrolling works " + i));
}
JFrame frm = new JFrame("Test scrolling");
frm.add(new JScrollPane(scrollPanel));
frm.setSize(220, 200);
frm.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frm.setLocationRelativeTo(null);
frm.setVisible(true);
}
private static class ScrollablePanel extends JPanel implements Scrollable {
@Override
public Dimension getPreferredScrollableViewportSize() {
return getPreferredSize();
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
return 5;
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
return 20;
}
@Override
public boolean getScrollableTracksViewportWidth() {
// no horizontal scroll bar
return true;
}
@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}
}
}