我在一个JLable里绘图,因为图形太大无法显示完全,所以想用JScrollPane来实现,可是程序运行后发现JScrollPane的滚动条根本没用。
我的程序大体是这样的,先把JScrollPane作为内容面板,然后把JLabel添加进去,绘图是通过重载JLabel的paintcomponent函数来实现的。
小弟还是个菜鸟,希望各位高手不吝赐教,谢谢。
我的程序大体是这样的,先把JScrollPane作为内容面板,然后把JLabel添加进去,绘图是通过重载JLabel的paintcomponent函数来实现的。
小弟还是个菜鸟,希望各位高手不吝赐教,谢谢。
印象中JscrollPane是与JTextArea在一起使用的...
那该怎么办呀,难道要把JLavbel保存成图片再用JScrollPane?
public DrawingPanel(){
setSize();
} public void paintComponent(Graphics g){
Graphics2D g2d = (Graphics2D) g;
... // do some thing
}
}DrawingPanel drawingPanel = new DrawingPanel();
JScrollPane scrollPane = new JScrollPanel(drawingPanel);
现在的问题不是在哪画,而是为什么我的JScrollPane不起作用,我也试了在JPanel上画,结果是一样的
不会用JViewport啊
我现在是用JLabel.setPreferredSize()来暂时解决问题,但是这样的话必须将大小设定为超过JFrame时才能出现滚动条,很郁闷啊
JScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
JScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
我已经这么设置了,可还是没用啊
实际内容比可视区域大时,才需要滚动。你在JLabel绘制的图形就要把JLabel的大小设置的可以放下你的图形。JLabel又没有实现Scrollable接口。不要指望JLabel会滚动自身。
我的实际内容比可视区域大啊,有可能绘制的图形在整个屏幕都显示不全,那这种情况下没有滚动条很麻烦的。
我也不想纠结啊,可这玩意如鲠在喉啊,我又刚接触java不久,真是让人郁闷
显示你自己绘制的图像,jre就不知道你需要多大的面积了。所以需要手动指定。
后来解决好像是直接把Scrollpane放在Frame里面,然后设定大小就可以了。具体没总结过。适当位置repaint一下。
我现在是把Scrollpane当作内容面板放到JFrame里面,并且通过把滚动条设置为了总是可见
现在暂时的解决方法就是设置JLabel的setPreferredSize来使滚动条显示
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();
}
}我以前写的一个工序自己看把!
目前我也是用setPreferredSize来设置JLabel的大小,当JLabel加载图片的时候用setPreferredSize设置其大小为所加载图片的大小,然后repaint一下。这样的话JLabel就超过JScrollPane的大小, 应该就会显示出滚动条了,但还是不能显示,只有将整个frame放大的时候才会显示滚动条,而且如果又还原的话又不能显示了还会出现错误。郁闷啊,楼主如果解决了,麻烦分享下。谢谢啦~~