gpt4 book ai didi

java - 带有卡住和可滚动组件的 JScrollPane 列标题

转载 作者:太空宇宙 更新时间:2023-11-04 07:06:27 25 4
gpt4 key购买 nike

我有一个 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(红色面板)始终位于屏幕中央,而不是滚动到屏幕外,并且 scrollHeader(蓝色面板)像示例中那样继续滚动。

为了添加更多上下文,我之所以不简单地将 scrollHeader 放在视口(viewport)中,或者将 frozenHeader 移出列标题并简单地将其放置在 JScrollPane 上方,是因为我的实际应用程序中的 JScrollPane 有一个左上角面板,其高度与列标题相同。由于应用程序的性质,我需要利用所有的屏幕空间。

任何有关如何实现这一目标的建议将不胜感激!

最佳答案

"I want the Red Panel to always be centered in the screen, instead of scrolling off the screen."

问题在于您正在设置columnHeaderView。这可以很容易地完成,只需将 colHeader 面板设置为独立实体,并且设置 columnHeaderView

    colHeader = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
colHeader.add(frozenHeader);
JPanel panelForScrollPaneAndScrollHeader = new JPanel(new BorderLayout());
panelForScrollPaneAndScrollHeader.add(scrollHeader, BorderLayout.NORTH);
panelForScrollPaneAndScrollHeader.add(scrollPane, BorderLayout.CENTER);

add(colHeader, BorderLayout.NORTH);
add(panelForScrollPaneAndScrollHeader, BorderLayout.CENTER);

这是执行此操作的结果

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class TestScroll1 extends JFrame{
private JScrollPane scrollPane;
private JPanel viewport;
private JPanel colHeader;
private JPanel frozenHeader;
private JPanel scrollHeader;

public TestScroll1() {
frozenHeader = new JPanel();
frozenHeader.setPreferredSize(new Dimension(500, 30));
frozenHeader.setBackground(Color.RED);

scrollHeader = new JPanel();
scrollHeader.setPreferredSize(new Dimension(1000, 30));
scrollHeader.setBackground(Color.BLUE);

scrollPane = new JScrollPane();
viewport = new JPanel();
viewport.setPreferredSize(new Dimension(1000, 400));
scrollPane.setViewportView(viewport);


colHeader = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
colHeader.add(frozenHeader);
JPanel panelForScrollPaneAndScrollHeader = new JPanel(new BorderLayout());
panelForScrollPaneAndScrollHeader.add(scrollHeader, BorderLayout.NORTH);
panelForScrollPaneAndScrollHeader.add(scrollPane, BorderLayout.CENTER);
add(colHeader, BorderLayout.NORTH);
add(panelForScrollPaneAndScrollHeader, BorderLayout.CENTER);


setSize(new Dimension(500, 400));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);

}

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new TestScroll1().setVisible(true);
}
});
}
}

关于java - 带有卡住和可滚动组件的 JScrollPane 列标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21299618/

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