为画布设置滚动窗格的问题
Posted
技术标签:
【中文标题】为画布设置滚动窗格的问题【英文标题】:problem in setting scrollpane for canvas 【发布时间】:2011-10-24 00:12:48 【问题描述】:在下面的程序中,我想放大和缩小用户选择的图像。问题是当我通过单击 zoomin zoomout 按钮放大或缩小图像时,滚动条不起作用。请帮忙解决什么问题
导入 java.awt.BorderLayout; 导入 java.awt.Canvas; 导入 java.awt.Container; 导入 java.awt.Cursor; 导入 java.awt.Dimension; 导入 java.awt.Graphics; 导入 java.awt.Graphics2D; 导入 java.awt.Image; 导入 java.awt.event.ActionEvent; 导入 java.awt.event.ActionListener; 导入 java.awt.image.BufferedImage; 导入java.io.File; 导入 java.io.IOException; 导入 javax.imageio.ImageIO; 导入 javax.swing.JButton; 导入 javax.swing.JFileChooser; 导入 javax.swing.JFrame; 导入 javax.swing.JMenu; 导入 javax.swing.JMenuBar; 导入 javax.swing.JMenuItem; 导入 javax.swing.JPanel; 导入 javax.swing.JScrollPane; 公共类 ImageProcess 扩展 JFrame 实现 ActionListener 私人 JMenuItem 新图像; 私人 JMenuItem 打开; 私有图像图像; 私有文件文件; 私有 JFrame jf; 私人 JPanel 面板; 私人光标缩放光标; 公共图像处理() super("图片演示"); this.setBounds(200, 200, 100, 100); this.setSize(800, 800); this.setResizable(true); 设置默认关闭操作(JFrame.EXIT_ON_CLOSE); 容器 con = this.getContentPane(); this.setVisible(true); JMenuBar 菜单栏 = new JMenuBar(); this.setJMenuBar(菜单栏); JMenu 文件 = new JMenu("文件"); newimage = new JMenuItem("New"); open = new JMenuItem("打开"); menubar.add(文件); 文件。添加(新图像); 文件.addSeparator(); 文件。添加(打开); newimage.addActionListener(this); open.addActionListener(this); 公共无效actionPerformed(ActionEvent e) if (e.getSource() == newimage) ReadImage ri = new ReadImage(); if (e.getSource() == open) OpenImage oi = new OpenImage(); 公共静态无效主要(字符串参数[]) ImageProcess imagepro = new ImageProcess(); 类 ImageFileFilter 扩展 javax.swing.filechooser.FileFilter 公共布尔接受(文件文件) 如果(文件.isDirectory()) 返回假; 字符串名称 = file.getName().toLowerCase(); return (name.endsWith(".jpg") || name.endsWith(".png") || 名称 .endsWith(".gif")); 公共字符串 getDescription() 返回“图像(*.gif,*.bmp,*.jpg,*.png)”; 类 ReadImage 扩展 JFrame 档案档案; JFileChooser 选择器; 公共读取图像() 选择器 = 新的 JFileChooser(); 选择器.setMultiSelectionEnabled(false); 选择器.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); int returnVal = 选择器.showOpenDialog(ReadImage.this); 如果(returnVal == JFileChooser.APPROVE_OPTION) 文件 = 选择器.getSelectedFile(); 尝试 final BufferedImage bi = ImageIO.read(file); 画布可以=新画布() 公共无效油漆(图形g) Graphics2D g2d = (Graphics2D) g; g2d.drawImage(bi, 0, 0, this); ; this.getContentPane().add(can); can.setPreferredSize(new Dimension(bi.getWidth(), bi .getHeight())); 这个.pack(); this.setVisible(true); 捕捉(IOException 即) 即.printStackTrace(); 类 OpenImage 扩展 JFrame 实现 ActionListener 私有 JFileChooser 选择器; 私有文件文件; 私有 JFrame jf; 帆布可以; J面板盘; 公共 JScrollPane sp; 尺寸 imgSize, iniSize; 私有 JButton butIn = new JButton("ZoomIN"); private JButton butOut = new JButton("ZoomOUT"); private JButton butReset = new JButton("Reset"); 公共 OpenImage() 选择器 = 新的 JFileChooser(); 选择器.setCurrentDirectory(new File(".")); 选择器.addChoosableFileFilter(new ImageFileFilter()); int returnVal = 选择器.showOpenDialog(null); 如果(returnVal == JFileChooser.APPROVE_OPTION) 文件 = 选择器.getSelectedFile(); 字符串文件名 = file.getName(); 尝试 final BufferedImage bi = ImageIO.read(file); imgSize = iniSize = new Dimension(bi.getWidth(), bi.getHeight()); jf = 新的 JFrame(); this.setResizable(false); this.setTitle(文件名); pan = new JPanel(); pan.add(但在); pan.add(butOut); // pan.add(butReset); butIn.addActionListener(this); butOut.addActionListener(this); butReset.addActionListener(this); 可以=新画布() 公共无效油漆(图形g) Graphics2D g2d = (Graphics2D) g; 如果(imgSize.width = iniSize.width) 可以.setSize(imgSize); can.repaint(); 可以.验证(); 公共无效缩放() if (!(getWidth() > imgSize.width)) int x = 10 * imgSize.width / 100; int y = 10 * imgSize.height / 100; imgSize = new Dimension(imgSize.width - x, imgSize.height - y); if (getWidth() >= iniSize.width + 50) 可以.setSize(imgSize); can.repaint(); 可以.验证(); 别的 重绘();【问题讨论】:
真正用于最深入的调试:-) 您的代码从第 156 行开始缺少一些东西 【参考方案1】:不要混用 swing JScrollPane 和 awt Canvas。使用例如JPanel 和paintComponent() 方法。
【讨论】:
但我只能使用画布,现在我将框架中使用的所有具有画布的组件更改为 awt 组件。现在我正在使用 ScrollPane,只有水平滚动才有效,请告诉我启用垂直滚动我需要做什么我正在创建 ScrollPane 的构造函数,如下所示 ScrollPane sp=new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);跨度> download.oracle.com/javase/6/docs/api/javax/swing/… @user571616:请解释您“只能使用画布”的限制。如果我们知道为什么会这样,我们可能会更好地帮助您。【参考方案2】:如果您不要求/期望您的项目使用 ImageProcesing、Video... 的一些特殊功能,那么请考虑使用 Canvas
是无用的,而显示 Icon/ImageIcon 的更好方法是使用 @987654322 @ 具有在 Swing 中绘制图片的所有内置功能,而无需为此使用 paint()/paintComponent(),这里是 JFileChoser/JScrollPane/Image 的示例
【讨论】:
以上是关于为画布设置滚动窗格的问题的主要内容,如果未能解决你的问题,请参考以下文章