我的可调整大小的 JScrollPane 内容具有最小宽度。如果 JScrollPane 小于此宽度,则应出现水平滚动条。如果大于此宽度,视口(viewport)内容应扩展以填满整个视口(viewport)。
这似乎是一个简单的概念,而且我已经找到了一些有用的东西,但感觉就像是一个 hack:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
public class SSBTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
final Component view = new MyView();
final JScrollPane jScrollPane = new JScrollPane(view);
jScrollPane.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(final ComponentEvent e) {
final Dimension minimumSize = view.getMinimumSize();
final int width = Math.max(minimumSize.width, jScrollPane.getViewport().getWidth());
view.setPreferredSize(new Dimension(width, minimumSize.height));
}
});
showInDialog(jScrollPane);
}
});
}
private static void showInDialog(final JScrollPane jScrollPane) {
final JDialog dialog = new JOptionPane(jScrollPane).createDialog("JScrollPane Resize Test");
dialog.setResizable(true);
dialog.setModal(true);
dialog.setVisible(true);
System.exit(0);
}
private static final class MyView extends JPanel {
@Override
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.drawString("Dimensions are " + getSize(), 10, 20);
g.drawRect(0, 0, getMinimumSize().width-1, getMinimumSize().height-1);
g.setColor(Color.BLUE);
g.drawRect(0, 0, getPreferredSize().width-1, getPreferredSize().height-1);
}
@Override
public Dimension getMinimumSize() {
return new Dimension(200, 200);
}
@Override
public Dimension getPreferredSize() {
return super.getPreferredSize();
}
}
}
调整对话框的大小会触发 ComponentListener,它会明确设置视口(viewport) View 的首选大小,从而触发组件验证。但是,调整大小会导致滚动条抖动。有没有更简洁的方法来做到这一点?
编辑:感谢 camickr 提供的 ScrollablePanel 链接,我修改了我的 JPanel 类以实现 Scrollable,并动态更改 getScrollableTracksViewportWidth() 的返回值。
当视口(viewport)很大时,我为 getScrollableTracksViewportWidth()
返回 true
,告诉 JScrollPane 用我的组件填充 View 。当视口(viewport)较小时,我返回 false
,因此会出现滚动条。
import javax.swing.*;
import java.awt.*;
public class SSBTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
final Component view = new MyView();
final JScrollPane jScrollPane = new JScrollPane(view);
showInDialog(jScrollPane);
}
});
}
private static void showInDialog(final JScrollPane jScrollPane) {
final JDialog dialog = new JOptionPane(jScrollPane).createDialog("JScrollPane Resize Test");
dialog.setResizable(true);
dialog.setModal(true);
dialog.setVisible(true);
System.exit(0);
}
private static final class MyView extends JPanel implements Scrollable {
@Override
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.drawString("MyView: " + getWidth() + "x" + getHeight(), 10, 20);
g.drawRect(0, 0, getMinimumSize().width-1, getMinimumSize().height-1);
g.setColor(Color.BLUE);
g.drawRect(0, 0, getPreferredSize().width-1, getPreferredSize().height-1);
g.drawString("Preferred/Minimum Size", 10, getPreferredSize().height/2);
g.setColor(Color.GREEN);
g.drawLine(0, 0, getWidth(), getHeight());
}
@Override
public Dimension getMinimumSize() {
return new Dimension(200, 200);
}
@Override
public Dimension getPreferredSize() {
return getMinimumSize();
}
public Dimension getPreferredScrollableViewportSize() {
return getPreferredSize();
}
public int getScrollableUnitIncrement(final Rectangle visibleRect, final int orientation, final int direction) {
return 10;
}
public int getScrollableBlockIncrement(final Rectangle visibleRect, final int orientation, final int direction) {
return visibleRect.width;
}
public boolean getScrollableTracksViewportWidth() {
final Container viewport = getParent();
return viewport.getWidth() > getMinimumSize().width;
}
public boolean getScrollableTracksViewportHeight() {
return true;
}
}
}
最佳答案
不确定,但您可以使用 Scrollable Panel .您可以配置组件调整大小(尝试使用 STRETCH)。该代码适用于组件的首选大小而不是最小大小,因此它可能不是您想要的。
关于java - 使用可变大小的内容调整 JScrollpane 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4951560/