java 图形界面,repaint 问题

谁能看一下这个图形化界面的问题:在滚动条中添加标签组件来显示图片,在鼠标点击到的位置用绘图矩形框包围并且对每次点击的矩形框刷新,为什么我这个矩形框总不在鼠标点击的位置im... 谁能看一下这个图形化界面的问题:在滚动条中添加标签组件来显示图片,在鼠标点击到的位置用绘图矩形框包围并且对每次点击的矩形框刷新,为什么我这个矩形框总不在鼠标点击的位置
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class win extends JFrame implements ActionListener{
int rectanNumber=50; //固定矩形框大小
static int start_x,start_y; //鼠标初始与末的位置
static Image image;
Rectangle rectangle=new Rectangle(0,0,0,0);
JLabel label=new JLabel();
JMenuBar jmenubar=new JMenuBar();
JMenu jFileMenu=new JMenu("文件");
JMenuItem jchooserPicMenuitem=new JMenuItem("选择图片");
JPanel mypane=new JPanel();
private JScrollPane scrollMypane;
JFileChooser chooser=new JFileChooser();
Point pointStart=new Point(0,0);
Point pointEnd=new Point(0,0);
//构造函数
public win() {
super("浏览图片");
jmenubar.add(jFileMenu);
jFileMenu.add(jchooserPicMenuitem);
jchooserPicMenuitem.addActionListener(this);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setLayout(new BorderLayout());
this.add(jmenubar,BorderLayout.NORTH);
this.add(mypane,BorderLayout.CENTER);
scrollMypane = new JScrollPane(mypane);
this.add(scrollMypane,BorderLayout.CENTER);
this.setLocation(200, 5);
this.setSize(400,60);
this.setVisible(true);
}

//监视器
public void actionPerformed(ActionEvent e){
int i=chooser.showOpenDialog(this);
if(i==chooser.APPROVE_OPTION){
image=new ImageIcon(chooser.getSelectedFile().getPath()).getImage();
mypane.add(label);
setSize(600,600);
image=image.getScaledInstance (image.getWidth(null),image.getHeight(null), Image.SCALE_DEFAULT );
label.setIcon(new ImageIcon(image));

label.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
start_x=e.getX();
start_y=e.getY();
pointStart=pointEnd;
pointEnd=new Point(e.getX(),e.getY());
rectangle = new Rectangle(start_x-rectanNumber, start_y-rectanNumber, 2*rectanNumber, 2*rectanNumber);
repaint();
}
});
}
}

@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.RED);
g.drawRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
}
public static void main (String[] args)
{
new win();
}
}
展开
 我来答
百度网友160d810
2015-07-06 · 超过35用户采纳过TA的回答
知道答主
回答量:56
采纳率:0%
帮助的人:66.3万
展开全部
鼠标事件取到的e.getX()/e.getY(),是鼠标相对于当前发生事件的组件的位置坐标(在这个事件里是label),而paint方法中的绘制坐标是根据最外层框体确定的,即win
所以计算时需要考虑label的相对位置,但是因为你用了BorderLayout,label的位置不好确定,所以建议把取坐标的代码改成:
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
start_x = e.getXOnScreen() - getX();
start_y = e.getYOnScreen() - getY();
以下不变。。。
根据屏幕的绝对位置,在减去win框体的位置,就可以不考虑组件的相对位置了;
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式