我在一个JLable里绘图,因为图形太大无法显示完全,所以想用JScrollPane来实现,可是程序运行后发现JScrollPane的滚动条根本没用。
    我的程序大体是这样的,先把JScrollPane作为内容面板,然后把JLabel添加进去,绘图是通过重载JLabel的paintcomponent函数来实现的。
    小弟还是个菜鸟,希望各位高手不吝赐教,谢谢。

解决方案 »

  1.   

    用了JLabel干嘛要用JscrollPane?
    印象中JscrollPane是与JTextArea在一起使用的...
      

  2.   

    因为绘制的图像太大了,窗体显示不全,所以想用滚动条啊
    那该怎么办呀,难道要把JLavbel保存成图片再用JScrollPane?
      

  3.   

    绘图一般使用JPanel,JLabel一般用来显示图片。public class DrawingPanel extends JPanel{
        public DrawingPanel(){
            setSize();
        }    public void paintComponent(Graphics g){
            Graphics2D g2d = (Graphics2D) g;
            ... // do some thing 
        }
    }DrawingPanel drawingPanel = new DrawingPanel();
    JScrollPane scrollPane = new JScrollPanel(drawingPanel);
      

  4.   

    回复7楼:
    现在的问题不是在哪画,而是为什么我的JScrollPane不起作用,我也试了在JPanel上画,结果是一样的
      

  5.   

    回复9楼:
    不会用JViewport啊
    我现在是用JLabel.setPreferredSize()来暂时解决问题,但是这样的话必须将大小设定为超过JFrame时才能出现滚动条,很郁闷啊
      

  6.   

    回复11楼:
    JScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    JScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    我已经这么设置了,可还是没用啊
      

  7.   

    我觉得这才是正常的,是你太纠结了。
    实际内容比可视区域大时,才需要滚动。你在JLabel绘制的图形就要把JLabel的大小设置的可以放下你的图形。JLabel又没有实现Scrollable接口。不要指望JLabel会滚动自身。
      

  8.   

    回复13楼:
    我的实际内容比可视区域大啊,有可能绘制的图形在整个屏幕都显示不全,那这种情况下没有滚动条很麻烦的。
    我也不想纠结啊,可这玩意如鲠在喉啊,我又刚接触java不久,真是让人郁闷
      

  9.   

    你的图形要占用多大,就把用来绘制图形的组件设置的比图形大小多一个Inset的大小
      

  10.   

    显示一个现有的图片,JRE可以从图片的大小计算出组件的大小。
    显示你自己绘制的图像,jre就不知道你需要多大的面积了。所以需要手动指定。
      

  11.   

    遇到过和楼主一样的问题。
    后来解决好像是直接把Scrollpane放在Frame里面,然后设定大小就可以了。具体没总结过。适当位置repaint一下。
      

  12.   

    图片不用画,就当成背景icon加进去啊
      

  13.   

    回复18楼:
    我现在是把Scrollpane当作内容面板放到JFrame里面,并且通过把滚动条设置为了总是可见
    现在暂时的解决方法就是设置JLabel的setPreferredSize来使滚动条显示
      

  14.   


    package aaaa;import java.awt.Robot;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;import javax.imageio.ImageIO;
    import javax.swing.Icon;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;public class TestDemo extends JFrame implements ActionListener { JTextField txt1 = new JTextField(20); JTextField txt2 = new JTextField(20);// JFileChooser choose1 = new JFileChooser();//创建文件打开对话框
    JButton btn1 = new JButton("打开图片1");
    JButton btn2 = new JButton("打开图片2");
    JButton btn3 = new JButton("RGB颜色值");
    JButton btn4 = new JButton("16进制");
    JFileChooser choose1 = new JFileChooser();//创建文件打开对话框
    JLabel lbl1 = new JLabel("尚无照片1");
    JLabel lbl2 = new JLabel("尚无照片2"); JTextArea area = new JTextArea(5, 18);//多行文本框 JScrollPane jsp1 = new JScrollPane(lbl1); JScrollPane jsp2 = new JScrollPane(lbl2); JScrollPane jsp3 = new JScrollPane(area); JPanel panel = new JPanel(); Robot robot = null;
    int num=0;
    int[]bottle1;
    int[]bottle2; 
    public TestDemo() {
    super("吴健制作");
    this.panel.setLayout(null); this.txt1.setBounds(15, 10, 300, 20); this.txt2.setBounds(15, 40, 300, 20); this.btn1.setBounds(350, 10, 100, 20);
    this.btn2.setBounds(350, 40, 100, 20); this.jsp1.setBounds(15, 80, 175, 175);
    this.jsp2.setBounds(250, 80, 175, 175); this.btn3.setBounds(15, 285, 90, 20);
    this.btn4.setBounds(15, 315, 90, 20);
    jsp3.setBounds(130, 285, 260, 60);

    // choose1.setDialogTitle("打开图片");
    txt1.setEditable(false);
    txt2.setEditable(false);
    panel.add(txt1);
    panel.add(btn1); panel.add(txt2);
    panel.add(btn2); panel.add(jsp1);
    panel.add(jsp2); panel.add(btn3);
    panel.add(btn4);
    panel.add(jsp3); btn1.addActionListener(this);//添加监听 btn2.addActionListener(this); btn3.addActionListener(this); btn4.addActionListener(this); this.getContentPane().add(panel);
    this.setBounds(100, 100, 470, 400);//窗体起始坐标大小 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭的处理 this.setVisible(true);//窗体是否可看

    this.setResizable(false);//窗体时候可以调整大小
    } public void actionPerformed(ActionEvent e) {
    if (e.getSource() == btn1) {
    this.choose1.showSaveDialog(null);// 弹出一个文件选择器对话框。
    this.choose1.setDialogTitle("打开图片");
    File file = this.choose1.getSelectedFile();//返回选中的文件。
    if(file!=null){
    txt1.setText(file.getAbsolutePath());
    Icon icon= new ImageIcon(file.getAbsolutePath());
    lbl1.setIcon(icon);//显示第一张图片
    lbl1.setText("");//文本字符串
    }else{
    txt1.setText(null);
    }

    } if (e.getSource() == btn2) {
    this.choose1.showSaveDialog(null);
    this.choose1.setDialogTitle("打开图片");
    File file = this.choose1.getSelectedFile();
    if(file!=null){
    txt2.setText(file.getAbsolutePath());
    Icon icon= new ImageIcon(file.getAbsolutePath());
    lbl2.setIcon(icon);//显示第一张图片
    lbl2.setText("");//文本字符串
    }else{
    txt1.setText(null);
    } } if (e.getSource() == btn3) {
    area.setText("");
    int count = 0;
    File file1 = new File(txt1.getText());
    File file2 = new File(txt2.getText()); int width = new ImageIcon(file1.getAbsolutePath()).getIconWidth(); int height = new ImageIcon(file1.getAbsolutePath()).getIconHeight(); int width2 = new ImageIcon(file2.getAbsolutePath()).getIconWidth(); int height2 = new ImageIcon(file2.getAbsolutePath())
    .getIconHeight(); if (width == width2 && height == height2) {
    try {

    BufferedImage bi1= ImageIO.read(file1);
    BufferedImage bi2= ImageIO.read(file2);

    for (int i = 0; i < width; i++) {
    for (int j = 0; j < height; j++) { int a = bi1.getRGB(i, j);//返回一张图片的RPG值
    int b = bi2.getRGB(i, j);//第二张图片 String tmp1 = Integer.toHexString(a);
    String tmp2 = Integer.toHexString(b);
    bottle1[num++]=a;
    bottle2[num++]=b;
    if (a != b) { tmp1 = tmp1.substring(tmp1.length() - 6);
    tmp2 = tmp2.substring(tmp2.length() - 6);


    area.append(this.getRGBColor(tmp1) + "\t"
    + this.getRGBColor(tmp2) + "\n"
    ); count++;
    }
    }
    }
    } catch (IOException e1) {

    e1.printStackTrace();
    } area.append("共有" + count + "处不同\n");
    } else { area.append("图片大小不一样,请重新选择图片\n");
    }
    } if (e.getSource() == btn4) {
    area.setText("");
    int count = 0;
    File file1 = new File(txt1.getText());
    File file2 = new File(txt2.getText());
    int width = new ImageIcon(file1.getAbsolutePath()).getIconWidth(); int height = new ImageIcon(file1.getAbsolutePath()).getIconHeight(); int width2 = new ImageIcon(file2.getAbsolutePath()).getIconWidth(); int height2 = new ImageIcon(file2.getAbsolutePath())
    .getIconHeight(); if (width == width2 && height == height2) {
    try {
    BufferedImage bi1 = ImageIO.read(file1); BufferedImage bi2 = ImageIO.read(file2);
    for (int i = 0; i < width; i++) {
    for (int j = 0; j < height; j++) { int a = bi1.getRGB(i, j);
    int b = bi2.getRGB(i, j); if (a != b) { area.append(Integer.toHexString(a)
    .toUpperCase()
    + "\t"
    + Integer.toHexString(b).toUpperCase()
    + "\n");
    count++;
    }
    }
    }
    } catch (IOException e1) {
    e1.printStackTrace();
    }
    area.append("共有" + count + "处不同\n");
    } else { area.append("图片大小不一样,请重新选择图片\n");
    }
    }
    } private String getRGBColor(String src) {
    int red = Integer.parseInt(src.substring(0, 2), 16);
    int green = Integer.parseInt(src.substring(2, 4), 16);
    int blue = Integer.parseInt(src.substring(4, 6), 16); return "Ox" + Integer.toHexString(red).toUpperCase()
    + Integer.toHexString(green).toUpperCase()
    + Integer.toHexString(blue).toUpperCase();
    } public static void main(String[] args) {
    new TestDemo();
    }
    }我以前写的一个工序自己看把!
      

  15.   

    楼主 问题解决了没 我遇到同样的问题
    目前我也是用setPreferredSize来设置JLabel的大小,当JLabel加载图片的时候用setPreferredSize设置其大小为所加载图片的大小,然后repaint一下。这样的话JLabel就超过JScrollPane的大小, 应该就会显示出滚动条了,但还是不能显示,只有将整个frame放大的时候才会显示滚动条,而且如果又还原的话又不能显示了还会出现错误。郁闷啊,楼主如果解决了,麻烦分享下。谢谢啦~~