目前正在开发一种通过以太网进行通信的Java GUI。它旨在通过一个端口发送数据并通过另一个端口接收数据。接收到的数据用于填充GUI的动态部分,该部分随接收的数据而变化,遗憾的是还必须缩放以适合屏幕。我的问题是如何使用Java来填充部分GUI以及收到的以太网数据的缩放版本?
使用swing作为显示器并使用awt作为监听器。从Java套接字接收数据。仍然不清楚接收数据的确切方式是打包的,但试图找到如何填充虚拟屏幕的基本想法。单独的线程最有可能填充屏幕,但也包括如何使用缩放版本实际填充屏幕。
GUI旨在模拟具有物理按钮和图形显示的物理显示单元(彩色字以及箭头和其他图形,原始想法只是将像素映射为像素,但缩放会让我失望)。
这是代码片段,此时没有填充虚拟屏幕,只是白色轮廓和通信端口尚未打开(所有McduPanel都是将静态图像绘制到屏幕上,而setKey只是设置了一个字符串变量基于按下的按钮并通过开放端口发送):
private McduPanel mPanel;
public McduGui() {
mPanel = new McduPanel();
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice vc = env.getDefaultScreenDevice();
JFrame window = new JFrame();
window.addMouseListener(new MouseClickHandler());
window.add(mPanel);
window.setUndecorated(true);
window.setResizable(false);
vc.setFullScreenWindow(window);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
getPorts();
} catch (IOException ex) {
System.out.println(ex);
}
}
public static class MouseClickHandler implements MouseListener {
@Override
public void mousePressed(MouseEvent me) {
int screenX = me.getXOnScreen();
int screenY = me.getYOnScreen();
System.out.println("screen(X,Y) = " + screenX + "," + screenY);
setKey(screenX,screenY);
}
@Override
public void mouseReleased(MouseEvent e) {
}
@OverrideDo
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
public static void getPorts() throws IOException {
String screen = "host"; //host name
String charData = "host"; //host name
int screenPort = 71;//Integer.parseInt(71);
int charPort = 72;//port number
Socket echoSocket = new Socket(screen, 71);
PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
}
进一步澄清:
静态图像被绘制到屏幕上,字符串映射到屏幕上的位置,每次看到鼠标按下时都会发送与该位置相关联的字符串。 GUI中有一个虚拟屏幕,它将根据从端口接收的数据进行更改。现在数据将会出现在空中,但是根据设计,它应该与物理屏幕看起来完全相同。
我能给出的最好的例子是想到一个游戏男孩,游戏男孩的图像在面板上是静态的,但虚拟屏幕会根据从端口接收的数据不断更新。该盒子需要刷新,并且可能会从原始大小缩放。
答案 0 :(得分:0)
行。我真的很努力地理解你的问题。我仍然不确定你的问题是绘画,线程还是从套接字读取,但我做了一个可运行的例子。代码非常丑陋,但您可以按原样执行它。代码创建了一个"测试服务器"每隔几秒就写一个端口,然后测试客户端"每隔几秒从这个端口读取一次。客户端读取一些文本后,会将其打印在屏幕上。
请注意,这只是一个例子 - 正如我所说的那样超级难看,但它开箱即用。也不是我强烈建议不要画任何东西!使用JButtons显示按钮和JTextFields(或JTextAreas)以显示文本。不要在屏幕上绘画来打印它!
import java.awt.Graphics;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class RemoteConsole extends JPanel {
private String text = "Start";
public static void main(String[] args) throws Exception {
// your class is called McduPanel
RemoteConsole remoteConsole = new RemoteConsole();
// JFrame which contains all components
JFrame frame = new JFrame();
frame.setSize(400, 500);
frame.setVisible(true);
frame.getContentPane().add(remoteConsole);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ServerSocket serverSocket = new ServerSocket(4564);
// this is a test server which just writes "test"
// to a port every 1 seconds
new Thread() {
public void run() {
try {
Socket socket = new Socket("localhost", 4564);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
while (true) {
System.out.println("send");
out.println("test");
sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
// a test client which checks the port every 1.5 seconds
// and paints the text to a JPanel
new Thread() {
public void run() {
try {
Socket socket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String message = in.readLine();
System.out.println("received: " + message);
remoteConsole.appendText(message);
remoteConsole.repaint();
sleep(1500);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString(text, 75, 100);
}
public void appendText(String text) {
this.text += text;
}
}