作者sbrhsieh (sbr)
看板java
标题Re: [J2SE] canvas物件显示图片的问题
时间Sat Jul 18 15:30:09 2009
※ 引述《yuntechvb (云宝宝)》之铭言:
: 各位大大好
: 小弟是刚接触swing的新手
: 想请问一下
: canvas物件
: 利用方法paint将图片载入
: 但是图片大过视窗大小
: 图片就会被剪掉
: 有何方法可以避免这个问题呢?
: 补上一些漏掉的讯息
: 因为我是要做类似地图的功能
: 所以会有拖曳的作动
: 在拖曳的事件下有加入repaint的动作
: 不过还是无法让被裁掉的部份复原
我个人觉得这是 sun JRE 1.6 增加 swing top-level container 优化的 bug 之一。
你提供的程式只有在 sun JRE 1.6(甚至只有在 JRE for Windows)才会出现你描述
的情况。移动 Canvas object 後不只是外观无法完整呈现,canvas 外观没有正确呈现
的部分也无法收到 mouse event(即使你点击的部分的确是落在 canvas 内)。
使用 Visual Studio 附的 Spy++,以 find window 功能来观察 Canvas 所产生的
native window,可以看出这个 native window 所登记的 size 有符合 Canvas
object 所设定的 size,但是 find window 的标把移到 Canvas 产生的 native
window 区域内时,Spy++ 会画出 native window 的边框,看起来又只有占据
JFrame 的 content pane 的区域。
目前可以朝两个方向:
1. 不使用 swing top-level container 改用 AWT 对应的元件(JFrame => Frame)。
2. 使用 swing component 来实做绘制地图的部分。
考虑到你的应用中视窗里可能不会是只有显示地图的这个元件,那麽会建议你采
後者的作法。
使用 swing component 来替代你原来使用 Canvas 实做的元件,实做上的困难度
应该是差不多的。
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class j5_test {
ImageIcon temp = new ImageIcon(getClass().getResource("bg.jpg"));
JFrame f_main = new JFrame("");
int x1, y1, newx, newy;
float scale = 1f;
j5_test() {
f_main.getContentPane().setLayout(null);
f_main.setBounds(0, 0, 300, 300);
f_main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JComponent canvas1 = new JComponent() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(temp.getImage(), 0, 0, this);
}
};
canvas1.setBounds(0, 0, temp.getIconWidth(), temp.getIconHeight());
f_main.getContentPane().add(canvas1);
f_main.setVisible(true);
canvas1.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
x1 = evt.getX();
y1 = evt.getY();
}
});
canvas1.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent evt) {
final Container parentOfCanvas = canvas1.getParent();
final int iconWidth = temp.getIconWidth();
final int iconHeight = temp.getIconHeight();
newx = Math.min(0, evt.getX() - x1 + canvas1.getX());
newx = Math.max(newx, -iconWidth + parentOfCanvas.getWidth());
newy = Math.min(0, evt.getY() - y1 + canvas1.getY());
newy = Math.max(newy, -iconHeight + parentOfCanvas.getHeight());
canvas1.setLocation(newx, newy);
}
});
}
public static void main(String[] args) {
j5_test Test = new j5_test();
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.173.143.248
※ 编辑: sbrhsieh 来自: 218.173.143.248 (07/18 16:48)
1F:推 yuntechvb:大致上解决了 谢谢 07/21 09:24