如何使角落组件始终在JScrollPane中可见

时间:2013-06-13 13:44:18

标签: java swing jbutton jscrollpane jscrollbar

鉴于

import javax.swing.*;

public class TestCornerComponent {

    public static void main(String args[]) {
        JTable table = new JTable();
        final JScrollPane scrollPane = new JScrollPane(table);

        /* button to put in corner */
        JButton cornerButton = new JButton("#");
        scrollPane.setCorner(JScrollPane.UPPER_TRAILING_CORNER,
            cornerButton);

        scrollPane.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);


        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                JFrame frame = new JFrame("Test corner component");
                frame.getContentPane().add(scrollPane);
                frame.setVisible(true);
            }
        });
    }
}

无论JTable是否为空,如何使cornerButton始终可见?

我看到SwingX中的JXTable实现了这一点,但我无法从源代码中解读它是如何完成的。

由于

1 个答案:

答案 0 :(得分:3)

  

我的问题是,当ScrollPane的列标题视口中存在某些内容时,JScrollPane仅显示该按钮。

我认为这只是问题的一半。您需要视口中的组件占用一些空间。

  

我已经尝试在那里放一个空的JPanel,但这似乎不起作用

尝试视口中的空JPanel以及列标题中的面板:

import java.awt.*;
import javax.swing.*;

public class TestCornerComponent {

    public static void main(String args[])
    {
        final JScrollPane scrollPane = new JScrollPane();

        /* button to put in corner */
        JButton cornerButton = new JButton("#");
        scrollPane.setCorner(JScrollPane.UPPER_TRAILING_CORNER, cornerButton);

        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        JPanel column = new JPanel();
        column.setPreferredSize( new Dimension(100, cornerButton.getPreferredSize().height) );
        scrollPane.setColumnHeaderView( column );

        JPanel view = new JPanel();
        view.setPreferredSize( new Dimension(100, 100) );
        scrollPane.setViewportView( view );

        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                JFrame frame = new JFrame("Test corner component");
                frame.add(scrollPane);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}