你这样不行啊,一闪一闪的根本看不到显示效果或者更本没有显示,绘图的方法要写在paintComponent(Graphics g)里面才能长久保存。
我知道你想在mouseClicked里面做什么,但是在这里进行绘图,repaint没有立即被执行,所以有可能没有任何显示;如果repaint执行了,也很有可能立刻被后面的绘图所覆盖。最好的办法是在这里出发一个标志,然后调用repaint函数,在paintComponent函数中对这个标志进行绘制,决定到底该怎么画。
手写了一段代码,没有编译,你可以参考一下:
package colin;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class JXFrame extends JFrame
{
boolean mouseCliked = false;
int x,y;
public void paintComponent(Graphics g)
{
if(mouseCliked )
{
g.setColor(255,255,0);//必须有这一步,否则画笔颜色为默认背景色,是根本看不出任何线条效果的。
g.drawLine(0,0,x,y);
}
}
public void setPoint(int x,int y)
{
this.x = x;
this.y = y;
}
}
package colin;
import java.awt.*;
import javax.swing.*;
class frame{
frame(){
JXFrame f = new JXFrame();
f.addMouseListener(new Mouseevent(f));
f.setSize(500,600);
f.setVisible(true);
}
public static void main(String args[]){
new frame();
}
}
package colin;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class Mouseevent implements MouseListener{
JXFrame parent;
public Mouseevnt(JXFrame parent){
this.parent = parent;
}
public void mousePressed(MouseEvent e){
}
public void mouseReleased(MouseEvent e){
this.parent.mouseCliked = false;
}
public void mouseEntered(MouseEvent e){
this.parent.mouseCliked = false;
}
public void mouseExited(MouseEvent e){
this.parent.mouseCliked = false;
}
public void mouseClicked(MouseEvent e){
this.parent.setPoint(e.getX(),e.getY());
this.parent.mouseCliked = true;
this.parent.repaint();
}
}
肯定是位运算符,为什么API里说可以把控制键使用位运算符来操作的原因,我给你作个例子,你就会明白了。
在JAVA中控制键(就是ctrl, alt等,当然你这里的这个也是这个范围内的)是用某一个字节中的位来表示的,我们假设在java使用一个字节(8位)来表过这些控制键。比如这一个字节的第1位表示ctrl,第2位表示alt...最后一位表示BUTTON3_DOWN_MASK,那么当按下ctrl第1位会被置于1,按下alt最后一位会被置于1,如果按下鼠标右见,则最后一位被置于1。因此常量BUTTON3_DOWN_MASK在这个字节中的表示就是0000 0001。如果是这样的话,我们来看你的if语句。
event.getModifiersEx()&InputEvent.BUTTON3_DOWN_MASK ,这样就很明白了。如果你按下了ctrl,也就是把这个字节的第1位置1,也就是1000 0000然后把这个数拿来与0000 0001按位与,结果为0,表示没按下鼠标右见。因此只有当你按下鼠标右见时表达式才为真,也就是才为1。整个表达式也就是(event.getModifiersEx()&InputEvent.BUTTON3_DOWN_MASK)!=0没有按下鼠标右见时,条件为真。
package colin;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
public class frame extends JFrame{
//构造方法
frame(){
this.addMouseListener(new Mouseevent(this));
this.setSize(500,600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭时程序退出
this.setVisible(true);
}
public static void main(String args[]){
new frame();
}
}
class Mouseevent implements MouseListener{
frame f;
//构造方法,持有窗口对象的引用
Mouseevent(frame f){
this.f= f;
}
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
Graphics g = f.getGraphics();
Color c = g.getColor();//取出画笔颜色
g.setColor(Color.RED);//设置画笔颜色
g.drawLine(0,0,x,y);
g.setColor(c);//恢复画笔颜色
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
}
不会