1. 屏幕图像传送中,我对不同大小屏幕处理策略
远处桌面控制软件,听起来很神秘,其实,就是在服务器和客户机之间传送屏幕截图。这样,引出了一个问题——不同电脑的屏幕大小不一定相同。而远程控制之所以能够实现,无非就是传送鼠标事件、键盘事件的相关数据。鼠标事件的数据,最重要的是鼠标移动中的坐标的传送。这样一来,坐标的相对性就会造成远程控制中鼠标操作的不准确行。举个简单的例子:客户端界面上会有一个鼠标监听器,鼠标移动时,获取一个一个的坐标(x,y),然后传送给服务器。这个坐标是相对于客户端的界面而言,传到服务器后,服务器解析出这个坐标,用Robot 对象驱动鼠标移动,一定会移动到客户端鼠标移动的位置么?很明显,不一定会。对于这个问题,其实很容易解决,客户端和服务器对于每一个鼠标移动的坐标做一定的计算处理就可以了。但是,计算起来很麻烦,一个一个的像素,要怎么计算的准确,说实话我不知道。
客户端收到服务器发来的每一个图片,要显示在界面上,用户才可以看到。我可以把图片显示在一个组件上(JLabel),然后给Jlabel添加鼠标监听器,这样一来,每次捕获的坐标就是相对于服务器桌面的(0,0)点的,省去了计算的麻烦。但是,还有一个问题,如何显示完全的桌面截屏图像?我做了这样的处理:创建一个JscrollPane 对象,把Jlabel 添加到 JscrollPane 中,在界面上添加 这个滚动面板,然后鼠标监听器也加到滚动面板。
测试代码:
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
public class Test {
public static void main(String[] args) {
Test test=new Test();
test.showUI();
}
private void showUI(){
javax.swing.JFrame jFrame=new JFrame("Test");
jFrame.setSize(800, 600);
jFrame.setLayout(null);
javax.swing.JLabel jLabel=new JLabel();
// jLabel.setIcon(传入一个图片);
javax.swing.JScrollPane scrollPane=createScroll(jLabel);
scrollPane.setBounds(20,20,600,500);
jFrame.add(scrollPane);
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(3);
}
/**
* 创建 滚动面板 ,包含 jComponent 组件视图
* @param jComponent 滚动面板中,要添加滚动条的 视图
* @return 滚动面板
*/
private javax.swing.JScrollPane createScroll(javax.swing.JComponent jComponent) {
javax.swing.JPanel jPanel = new javax.swing.JPanel();
jPanel.add(jComponent);
javax.swing.JScrollPane jScrollPane = new JScrollPane(jPanel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
return jScrollPane;
}
}
2. 鼠标适配器使用的问题
鼠标监听器有三种:MouseListener、MouseMotionListener、MouseWheelListener。他们实现不同的鼠标事件的监听。
1.MouseListener 接口定义了方法:鼠标点击、按下、释放、进入、退出。
源代码:
public interface MouseListener extends EventListener {
public void mouseClicked(MouseEvent e);
public void mousePressed(MouseEvent e);
public void mouseReleased(MouseEvent e);
public void mouseEntered(MouseEvent e);
public void mouseExited(MouseEvent e);
}
2.MouseMotionListener 接口定义的方法:鼠标移动和拖拽
源代码:
public interface MouseMotionListener extends EventListener {
public void mouseDragged(MouseEvent e);
public void mouseMoved(MouseEvent e);
}
3.MouseWheelListener 接口定义的方法: 鼠标滚轮的滚动
源代码:
public interface MouseWheelListener extends EventListener {
public void mouseWheelMoved(MouseWheelEvent e);
}
鼠标适配器把鼠标的三中监听器的方法都包罗在里面了。我们使用时,只需要实现自己需要的方法。我在使用中,就只重写了鼠标的按下、释放、移动、滚轮滚动的相关方法。当,添加监听器给组件是,只有一种监听会实现,比如说,按下和释放可以,或者只有移动可以,或者只有滚轮滚动可以。原因在于,给组件添加鼠标监听器是,添加的是MouseListener 或者是MouseWheelListener 还是 MouseMotionListener 。我理解的适配器就是,把我们需要的方法实现,添加MouseListener 就可以。但是,在继承关系中,MouseAdapter实现了MouseMotionListener、Mouselistener 、MouseWheelListener,但是在添加监听器以后,鼠标事件调用方法是,存在一个多态的问题。解决很简单,addMouseMotionListener()、 addMouselistener() 、 addMousewheelListener() ,三个方法都传入你的适配器就OK了。问题虽然很简单,但是对于多态的理解很重要。
最后呢,说说键盘监听吧。其实,键盘监听,不是很明白。我给界面添加KeyListener ,界面只有一个Jlabel 组件式,监听可以实现,但是键盘上有一个 JButton 是,加个界面就没有用,如果这时候把KeyListerner 添加到Button 上,也可以实现监听。对于其中的原因,不是很清楚,有待解决。