Java 带标尺的JScrollPane';行不通

Java 带标尺的JScrollPane';行不通,java,swing,jscrollpane,Java,Swing,Jscrollpane,我尝试运行JavaSwing2ndEdition 7.1.3ScrollPanelLayout中的示例。图像和卷轴工作正常,但标尺没有。这是我的密码: public class ScrollPaneLayoutDemo extends JFrame{ JLabel label = new JLabel(new ImageIcon("img.jpg")); public ScrollPaneLayoutDemo() { super("ScrollPaneLayou

我尝试运行JavaSwing2ndEdition 7.1.3ScrollPanelLayout中的示例。图像和卷轴工作正常,但标尺没有。这是我的密码:

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();
    }
}

公共类ScrollPaneLayoutDemo扩展JFrame{
JLabel标签=新JLabel(新图像图标(“img.jpg”);
公共ScrollPaneLayoutDemo(){
超级(“滚动面板布局演示”);
JScrollPane jsp=新的JScrollPane(标签);
JLabel[]拐角=新的JLabel[4];
对于(int i=0;i
  • 子对象的维度必须大于JViewports维度(JScrollPane中的可见矩形),然后JScrollBars或自定义装饰可以可见,更多信息请参见Oracle教程如何使用滚动窗格

  • 搜索@annotation

e、 g

不知道为什么,但我不能在这里添加图像:-)

import java.awt.*;
导入javax.swing.*;
公共类ScrollPaneLayoutDemo扩展了JFrame{
私有静态最终长serialVersionUID=1L;
专用JLabel标签=新JLabel(新图像图标(“img.jpg”)){
@凌驾
公共维度getPreferredSize(){
返回新维度(新维度(800600));/*icon.getIconWidth(),icon.getIconHeight()*/
}
};
公共ScrollPaneLayoutDemo(){
超级(“滚动面板布局演示”);
标签。设置首选尺寸(新尺寸(800600));
JScrollPane jsp=新的JScrollPane(标签);
JLabel[]拐角=新的JLabel[4];
对于(int i=0;i<4;i++){
角点[i]=新的JLabel();
角[i].退根地面(颜色.黄色);
角[i].setOpaque(真);
corners[i].setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(2,2,2,2),BorderFactory.createLineBorder(Color.RED,1));
}
JLabel rowheader=新的JLabel(){
私有静态最终长serialVersionUID=1L;
Font f=新字体(“衬线”,Font.ITALIC | Font.BOLD,10);
@凌驾
公共组件(图形g){
超级组件(g);
矩形r=g.getClipBounds();
g、 setFont(f);
g、 setColor(Color.RED);
对于(int i=50-(r.y%50);i
  • 子对象的维度必须大于JViewports维度(JScrollPane中的可见矩形),然后JScrollBars或自定义装饰可以可见,更多信息请参见Oracle教程如何使用滚动窗格

  • 搜索@annotation

e、 g

不知道为什么,但我不能在这里添加图像:-)

import java.awt.*;
导入javax.swing.*;
公共类ScrollPaneLayoutDemo扩展了JFrame{
私有静态最终长serialVersionUID=1L;
专用JLabel标签=新JLabel(新图像图标(“img.jpg”)){
@凌驾
公共维度getPreferredSize(){
返回新维度(新维度(800600));/*icon.getIconWidth(),icon.getIconHeight()*/
}
};
公共ScrollPaneLayoutDemo(){
超级(“滚动面板布局演示”);
标签。设置首选尺寸(新尺寸(800600));
JScrollPane jsp=新的JScrollPane(标签);
JLabel[]拐角=新的JLabel[4];
对于(int i=0;i<4;i++){
角点[i]=新的JLabel();
角[i].退根地面(颜色.黄色);
角[i].setOpaque(真);
corners[i].setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(2,2,2,2),BorderFactory.createLineBorder(Color.RED,1));
}
JLabel rowheader=新的JLabel(){
私有静态最终长serialVersionUID=1L;
Font f=新字体(“衬线”,Font.ITALIC | Font.BOLD,10);
@凌驾
公共组件(图形g){
超级组件(g);
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();
            }
        });
    }
}