gpt4 book ai didi

java - JScrollPane 内部的内部 JScrollPane 无法正常工作

转载 作者:行者123 更新时间:2023-12-02 01:06:52 27 4
gpt4 key购买 nike

我正在尝试创建一个带有滚动条的容器,并且容器内部有两个内部面板。顶部内面板内还有另一个 JScrollPane。

但目前我遇到的问题是,当我的顶部内面板太长(宽度)时,顶部内面板内的滚动条被禁用,我只能滚动容器的滚动条。

enter image description here

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class TestFrame {

public static void main(String... args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
for (int i = 0; i < 10; i++) {
panel.add(new JButton("Hello-" + i));
}
JScrollPane scrollPane = new JScrollPane(panel);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
JPanel contentPane = new JPanel(new BorderLayout());

JPanel contentPaneSub = new JPanel();
contentPaneSub.add(scrollPane);

contentPane.add(contentPaneSub, BorderLayout.NORTH);

JPanel centerPanel = new JPanel(new FlowLayout());
centerPanel.add(new JButton("Example"));
contentPane.add(centerPanel, BorderLayout.CENTER);

JScrollPane scrollPane1 = new JScrollPane(contentPane);
scrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);

frame.setContentPane(scrollPane1);
//for demo purpose we set this using hard coded way
//in real life project the java will auto adjust it size based on windows resolution
frame.setSize(new Dimension(500, 160));
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
}

我希望得到的是,如果顶部内面板的宽度太长,那么顶部内面板内的滚动条将可见并允许滚动。不是容器中的滚动条。

最佳答案

在尝试解决此问题时,我遇到了两个不同的问题。第一个是将 JScrollPane 包含在窗口中,第二个是将 JScrollPane 的大小调整为动态的。

我能够解决第一个问题,但无法使用自定义类完全解决第二个问题。 JScrollPane 随着窗口的增大而动态增加其宽度,但它不会随着窗口大小而动态缩小。这是因为当窗口尺寸减小时,外部 JScrollPane 会锁定内部内容的宽度,包括内部 JScrollPane

我无法找到一种方法让内部 Pane 动态收缩,而不有效删除外部 Pane 的功能,这是行不通的,因为您的问题专门针对另一个 Pane 中的 JScrollPane功能性JScrollPane

public class TestFrame {

public static void main(String... args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
for (int i = 0; i < 10; i++) {
panel.add(new JButton("Hello-" + i));
}

MyCustomPane scrollPane = new MyCustomPane(panel); //changed this line

scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
JPanel contentPane = new JPanel(new BorderLayout());

JPanel contentPaneSub = new JPanel();
contentPaneSub.add(scrollPane);

scrollPane.setOuterContainer(contentPaneSub); //added this line

contentPane.add(contentPaneSub, BorderLayout.NORTH);

JPanel centerPanel = new JPanel(new FlowLayout());
centerPanel.add(new JButton("Example"));
contentPane.add(centerPanel, BorderLayout.CENTER);

JScrollPane scrollPane1 = new JScrollPane(contentPane);
scrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);

frame.setContentPane(scrollPane1);
//for demo purpose we set this using hard coded way
//in real life project the java will auto adjust it size based on windows resolution
frame.setSize(new Dimension(500, 160));
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
}

MyCustomPane 类的代码:

public class MyCustomPane extends JScrollPane {
Container outerContainer;

public MyCustomPane(Component view) {
super(view);
}

public void setOuterContainer(Container outerContainer) {
this.outerContainer = outerContainer;
}

private Dimension getCustomDimensions() {
if (outerContainer == null) {
return new Dimension(0, 0);
}
return new Dimension(outerContainer.getWidth() - 10, 60); //10 pixels less than container width, arbitrary height
}
@Override
public Dimension getMaximumSize() {
return getCustomDimensions();
}
@Override
public Dimension getMinimumSize() {
return getCustomDimensions();
}
@Override
public Dimension getPreferredSize() {
return getCustomDimensions();
}
}

关于java - JScrollPane 内部的内部 JScrollPane 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57722385/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com