JScrollPane滚动条无法使用

dengshuai23 2010-01-12 11:09:33
我在一个JLable里绘图,因为图形太大无法显示完全,所以想用JScrollPane来实现,可是程序运行后发现JScrollPane的滚动条根本没用。
我的程序大体是这样的,先把JScrollPane作为内容面板,然后把JLabel添加进去,绘图是通过重载JLabel的paintcomponent函数来实现的。
小弟还是个菜鸟,希望各位高手不吝赐教,谢谢。
...全文
758 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
twtkthh2008 2011-07-21
  • 打赏
  • 举报
回复
gdhetsdfg
xiongye378 2011-05-18
  • 打赏
  • 举报
回复
楼主 问题解决了没 我遇到同样的问题。。。
目前我也是用setPreferredSize来设置JLabel的大小,当JLabel加载图片的时候用setPreferredSize设置其大小为所加载图片的大小,然后repaint一下。这样的话JLabel就超过JScrollPane的大小, 应该就会显示出滚动条了,但还是不能显示,只有将整个frame放大的时候才会显示滚动条,而且如果又还原的话又不能显示了还会出现错误。郁闷啊,楼主如果解决了,麻烦分享下。谢谢啦~~
zeus406 2010-01-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();
}
}



我以前写的一个工序自己看把!
dengshuai23 2010-01-14
  • 打赏
  • 举报
回复
回复19楼:
我要做的是从一个二进制文件中读取数据,然后绘制图形,不是绘制现有的图片
dengshuai23 2010-01-14
  • 打赏
  • 举报
回复
回复18楼:
我现在是把Scrollpane当作内容面板放到JFrame里面,并且通过把滚动条设置为了总是可见
现在暂时的解决方法就是设置JLabel的setPreferredSize来使滚动条显示
chayliu 2010-01-13
  • 打赏
  • 举报
回复
遇到过和楼主一样的问题。
后来解决好像是直接把Scrollpane放在Frame里面,然后设定大小就可以了。具体没总结过。适当位置repaint一下。
huntor 2010-01-13
  • 打赏
  • 举报
回复
显示一个现有的图片,JRE可以从图片的大小计算出组件的大小。
显示你自己绘制的图像,jre就不知道你需要多大的面积了。所以需要手动指定。
xinyan2xh 2010-01-13
  • 打赏
  • 举报
回复
图片不用画,就当成背景icon加进去啊
dengshuai23 2010-01-13
  • 打赏
  • 举报
回复
回复15楼:
可是这样一来不就成了手动设置了,难道就不能自动实现吗?
如果再没有满意答案,那分就都给你好了,看你这么不厌其烦地回我问题,谢谢你了,呵呵
fhuibo212 2010-01-12
  • 打赏
  • 举报
回复
以前做过,具体得下班回去看看
dengshuai23 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sagegz 的回复:]
用了JLabel干嘛要用JscrollPane?
印象中JscrollPane是与JTextArea在一起使用的...
[/Quote]
因为绘制的图像太大了,窗体显示不全,所以想用滚动条啊
那该怎么办呀,难道要把JLavbel保存成图片再用JScrollPane?
sagegz 2010-01-12
  • 打赏
  • 举报
回复
用了JLabel干嘛要用JscrollPane?
印象中JscrollPane是与JTextArea在一起使用的...
huntor 2010-01-12
  • 打赏
  • 举报
回复
你的图形要占用多大,就把用来绘制图形的组件设置的比图形大小多一个Inset的大小
dengshuai23 2010-01-12
  • 打赏
  • 举报
回复
回复13楼:
我的实际内容比可视区域大啊,有可能绘制的图形在整个屏幕都显示不全,那这种情况下没有滚动条很麻烦的。
我也不想纠结啊,可这玩意如鲠在喉啊,我又刚接触java不久,真是让人郁闷
huntor 2010-01-12
  • 打赏
  • 举报
回复
我觉得这才是正常的,是你太纠结了。
实际内容比可视区域大时,才需要滚动。你在JLabel绘制的图形就要把JLabel的大小设置的可以放下你的图形。JLabel又没有实现Scrollable接口。不要指望JLabel会滚动自身。
dengshuai23 2010-01-12
  • 打赏
  • 举报
回复
回复11楼:
JScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
JScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
我已经这么设置了,可还是没用啊
huntor 2010-01-12
  • 打赏
  • 举报
回复
构造方法里不是可以传入参数,设置滚动条不显示,一直显示,或者按需显示
dengshuai23 2010-01-12
  • 打赏
  • 举报
回复
回复9楼:
不会用JViewport啊。。。
我现在是用JLabel.setPreferredSize()来暂时解决问题,但是这样的话必须将大小设定为超过JFrame时才能出现滚动条,很郁闷啊。。。
huntor 2010-01-12
  • 打赏
  • 举报
回复
使用JViewport,自己控制
dengshuai23 2010-01-12
  • 打赏
  • 举报
回复
回复7楼:
现在的问题不是在哪画,而是为什么我的JScrollPane不起作用,我也试了在JPanel上画,结果是一样的。。。
加载更多回复(3)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧