我有一个JScrollPane
,其中包含由多个组件组成的列标题。其中一个组件需要静态定位,而其他组件需要像正常一样滚动。JScrollPane具有冻结和可滚动组件的列标题
我能想到做的唯一一件事就是添加一个侦听这台冷冻组件的这样的位置滚动条:
frozenHeader.setLocation(scrollViewport.getVisibleRect().getLocation()).
但是,位置实际上不会更新,直到滚动条没有长时间滚动,所以它看起来相当不吸引人。是的,我已经尝试在frozenHeader
及其父母上拨打revalidate()
,然后拨打repaint()
。
这里是重现什么我谈论的例子:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
/**
*
* @author brian
*/
public class TestScroll extends JFrame {
private JScrollPane scrollPane;
private JPanel viewport;
private JPanel colHeader;
// This should be frozen
private JPanel frozenHeader;
// This should scroll
private JPanel scrollHeader;
public TestScroll() {
this.setSize(new Dimension(500, 400));
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Set up the scroll pane
scrollPane = new JScrollPane();
viewport = new JPanel();
viewport.setPreferredSize(new Dimension(1000, 400));
scrollPane.setViewportView(viewport);
// Set up the scroll panes column header
colHeader = new JPanel(new GridBagLayout());
frozenHeader = new JPanel();
// Width is equal to the frame's width, as it should stay in the same location
frozenHeader.setPreferredSize(new Dimension(500, 30));
frozenHeader.setBackground(Color.RED);
scrollHeader = new JPanel();
// Width equal to viewportview's as it should scroll
scrollHeader.setPreferredSize(new Dimension(1000, 30));
scrollHeader.setBackground(Color.BLUE);
JLabel label = new JLabel("Text");
scrollHeader.add(label);
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.WEST;
c.gridx = 0;
c.gridy = 0;
colHeader.add(frozenHeader, c);
c.gridy = 1;
colHeader.add(scrollHeader, c);
scrollPane.setColumnHeaderView(colHeader);
add(scrollPane);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new TestScroll().setVisible(true);
}
});
}
}
我想frozenHeader
(红色面板)始终在屏幕的滚动,而不是关闭屏幕居中,和(蓝色面板)继续滚动,如同在示例中一样。
要多添一点而言,我不是简单地把在视口中,或移动frozenHeader
出列标题,并简单地将其置于JScrollPane
以上的原因是因为我在实际应用中JScrollPane
有上左角面板与列标题高度相同。由于应用程序的性质,我需要利用所有的屏幕空间。
任何有关如何完成这一任务的建议将不胜感激!
啊,当结果,我想我需要看到一些示例代码,它复制了你正在谈论的内容...... – MadProgrammer
你可以做的一种方法是,将可滚动的组件在JScrollPane中添加标题并将标题添加到JScrollPane顶部。我希望你指的是垂直滚动。 – jaks
对不起,我更新了帖子,可滚动和固定的标题必须保留在标题中,因为我不能浪费屏幕空间。 – user1725940