java - 带标尺的 JScrollPane 不起作用

标签 java swing jscrollpane

我尝试运行 Java Swing 第二版 7.1.3 ScrollPaneLayout 中的示例。图像和卷轴工作得很好,但标尺却没有。这是我的代码:

public class ScrollPaneLayoutDemo extends JFrame{
    JLabel label = new JLabel(new ImageIcon("img.jpg"));

    public ScrollPaneLayoutDemo() {
        super("ScrollPaneLayout Demo");

        JScrollPane jsp = new JScrollPane(label);

        JLabel[] corners = new JLabel[4];

        for(int i=0; i<4; i++)
        {
            corners[i] = new JLabel();
            corners[i].setBackground(Color.YELLOW);
            corners[i].setOpaque(true);
            corners[i].setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2), BorderFactory.createLineBorder(Color.RED, 1)));
        }

        JLabel rowheader = new JLabel() {
            Font f = new Font("Serif", Font.ITALIC | Font.BOLD, 10);

            public void paintComponent(Graphics g)
            {
                super.paintComponent(g);

                Rectangle r = g.getClipBounds();
                g.setFont(f);
                g.setColor(Color.RED);
                for (int i = 50 - (r.y % 50); i < r.height; i += 50) {
                      g.drawLine(0, r.y + i, 3, r.y + i);
                      g.drawString("" + (r.y + i), 6, r.y + i + 3);
                }
            }

            public Dimension getPreferredSize() 
            {
                return new Dimension(25, (int) label.getPreferredSize().getHeight());
            }
        };
        rowheader.setBackground(Color.YELLOW);
        rowheader.setOpaque(true);

        JLabel columnheader = new JLabel() {
            Font f = new Font("Serif", Font.ITALIC | Font.BOLD, 10);

            public void paintComponent(Graphics g)
            {
                super.paintComponent(g);

                Rectangle r = g.getClipBounds();
                g.setFont(f);
                g.setColor(Color.RED);
                for (int i = 50 - (r.x % 50); i < r.width; i += 50) 
                {
                      g.drawLine(r.x + i, 0, r.x + i, 3);
                      g.drawString("" + (r.x + i), r.x + i - 10, 16);
                }
            }

            public Dimension getPreferredSize()
            {
                return new Dimension((int) label.getPreferredSize().getWidth(),25);
            }
        };
        columnheader.setBackground(Color.YELLOW);
        columnheader.setOpaque(true);

        jsp.setRowHeaderView(rowheader);
        jsp.setColumnHeaderView(columnheader);
        jsp.setCorner(JScrollPane.LOWER_LEFT_CORNER, corners[0]);
        jsp.setCorner(JScrollPane.LOWER_RIGHT_CORNER, corners[1]);
        jsp.setCorner(JScrollPane.UPPER_LEFT_CORNER, corners[2]);
        jsp.setCorner(JScrollPane.UPPER_RIGHT_CORNER, corners[3]);

        getContentPane().add(jsp, BorderLayout.CENTER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 300);
        setVisible(true);
    }

    public static void main(String[] args) {
        new JScrollPaneDemo();
    }
}

如果有人可以帮助我解决这个问题,我将不胜感激。

最佳答案

  • 子级的维度必须大于 JViewports 维度(JScrollPane 中的可见矩形),然后 JScrollBars 或自定义装饰才能可见,更多信息请参见 Oracle 教程如何使用 ScrollPanes

  • 搜索@Annotations

例如

不知道为什么,但我无法在此处添加图像:-)

来自

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

public class ScrollPaneLayoutDemo extends JFrame {

    private static final long serialVersionUID = 1L;
    private JLabel label = new JLabel(new ImageIcon("img.jpg")) {
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(new Dimension(800, 600));/*icon.getIconWidth(), icon.getIconHeight()*/
        }
    };

    public ScrollPaneLayoutDemo() {
        super("ScrollPaneLayout Demo");
        label.setPreferredSize(new Dimension(800, 600));
        JScrollPane jsp = new JScrollPane(label);
        JLabel[] corners = new JLabel[4];
        for (int i = 0; i < 4; i++) {
            corners[i] = new JLabel();
            corners[i].setBackground(Color.YELLOW);
            corners[i].setOpaque(true);
            corners[i].setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2), BorderFactory.createLineBorder(Color.RED, 1)));
        }
        JLabel rowheader = new JLabel() {
            private static final long serialVersionUID = 1L;
            Font f = new Font("Serif", Font.ITALIC | Font.BOLD, 10);

            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Rectangle r = g.getClipBounds();
                g.setFont(f);
                g.setColor(Color.RED);
                for (int i = 50 - (r.y % 50); i < r.height; i += 50) {
                    g.drawLine(0, r.y + i, 3, r.y + i);
                    g.drawString("" + (r.y + i), 6, r.y + i + 3);
                }
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(25, (int) label.getPreferredSize().getHeight());
            }
        };
        rowheader.setBackground(Color.YELLOW);
        rowheader.setOpaque(true);
        JLabel columnheader = new JLabel() {
            private static final long serialVersionUID = 1L;
            Font f = new Font("Serif", Font.ITALIC | Font.BOLD, 10);

            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Rectangle r = g.getClipBounds();
                g.setFont(f);
                g.setColor(Color.RED);
                for (int i = 50 - (r.x % 50); i < r.width; i += 50) {
                    g.drawLine(r.x + i, 0, r.x + i, 3);
                    g.drawString("" + (r.x + i), r.x + i - 10, 16);
                }
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension((int) label.getPreferredSize().getWidth(), 25);
            }
        };
        columnheader.setBackground(Color.YELLOW);
        columnheader.setOpaque(true);
        jsp.setRowHeaderView(rowheader);
        jsp.setColumnHeaderView(columnheader);
        jsp.setCorner(JScrollPane.LOWER_LEFT_CORNER, corners[0]);
        jsp.setCorner(JScrollPane.LOWER_RIGHT_CORNER, corners[1]);
        jsp.setCorner(JScrollPane.UPPER_LEFT_CORNER, corners[2]);
        jsp.setCorner(JScrollPane.UPPER_RIGHT_CORNER, corners[3]);
        getContentPane().add(jsp, BorderLayout.CENTER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 300);
        setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ScrollPaneLayoutDemo();
            }
        });
    }
}

关于java - 带标尺的 JScrollPane 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27151276/

相关文章:

java - 将 JButton 添加到 JScrollPane

java - 为什么我要在这个例子中使用 JScrollPane ?

java - 加密应用程序数据的正确方法

java - 如何使用命令行从不同路径启动 glassfish 域

java - 模拟 ResourceInfo 的 getResourceClass

java - Map<Integer, String> 还是 String[]?

java - 如何保存在 JTable 中输入的数据,以便在我们退出应用程序后它仍然存在?

java - 在 JTable 中查找并选择

Java Swing 问题 - 使用调色板

java - 如何在 JScrollPane 之上绘制?