我有一个JFrame,我有一个JPanel,我正在尝试使用paintComponent()做一些免费的手绘。 现在,我从mouseDragged方法内部更改xPOS和yPOS变量,然后调用repaint(),这样就可以了。
//**PROGRAM 1**-My DrawPanel Class
public class DrawPanel extends JPanel implements Runnable, MouseMotionListener{
int xpos = 0;
int ypos = 0;
String message;
DrawPanel(){
//constructor ini
addMouseMotionListener(this);
setBackground(Color.green);
setSize(500, 400);
setBounds(10, 10, 500, 400);
}
public void paintComponent(Graphics g) {
g.setColor(Color.red);
g.fillOval(xpos, ypos, 5, 5);
}
@Override
public void mouseDragged(MouseEvent arg0) {
xpos= arg0.getX();
ypos= arg0.getY();
// s.SendData(xpos,ypos);
repaint();
}
public void run() {
try{
while((message = reader.readLine())!=null) {
int in = message.indexOf("#");
xpos = Integer.parseInt(message.substring(0, in));
ypos = Integer.parseInt(message.substring(in+1));
System.out.print(xpos+" "+ypos);
repaint();
}}catch(Exception e){e.printStackTrace();}
}
}
我有一个线程,从一些其他java程序通过套接字接受一些新的坐标,我能够接受它们,我的
System.out.print(xpos+" "+ypos);
工作正常,但是之后的repaint()方法似乎不起作用,没有错误,没有任何反应。
仅供参考,我提到的另一个java程序,具有相同类型的结构,我将这个java程序的坐标发送到那个程序,
// s.SendData(xpos,ypos);
并且可以从线程内部调用repaint()方法。 但是,似乎可以理解,为什么它不会发生在这一个。 任何帮助将不胜感激,谢谢。
SSCCE PaintBrushServer
import java.awt.*;
import java.awt.event.*;
//import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import javax.imageio.ImageIO;
import javax.swing.*;
public class PaintBrush {
DrawPanel dr = new DrawPanel();
myFrame mf;
Graphics g1;
boolean flag=false;
server s;
BufferedReader reader;
PaintBrush(){
myFrame mf = new myFrame();
s = new server();
}
public static void main(String[] args) {
new PaintBrush();
}
public class ButtonPanel extends JPanel{
ButtonPanel(){
add(new myButton());
}
}
public class DrawPanel extends JPanel implements Runnable, MouseMotionListener{
int xpos = 0;
int ypos = 0;
String message;
DrawPanel(){
//constructor ini
addMouseMotionListener(this);
setBackground(Color.green);
setSize(500, 400);
setBounds(10, 10, 500, 400);
//s = new server();
}
public void paintComponent(Graphics g) {
g.setColor(Color.red);
g.fillOval(xpos, ypos, 5, 5);
}
@Override
public void mouseDragged(MouseEvent arg0) {
xpos= arg0.getX();
ypos= arg0.getY();
s.SendData(xpos,ypos);
repaint();
}
@Override
public void run() {
try{
while((message = reader.readLine())!=null) {
int in = message.indexOf("#");
xpos = Integer.parseInt(message.substring(0, in));
ypos = Integer.parseInt(message.substring(in+1));
// System.out.print(xpos+" "+ypos);
repaint();
}}catch(Exception e){e.printStackTrace();}
}
}
public class myFrame extends JFrame{
myFrame(){
DrawPanel dr = new DrawPanel();
//setBackground(Color.black);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setSize(665,490);
getContentPane().add(BorderLayout.CENTER,dr);
getContentPane().add(BorderLayout.NORTH, new ButtonPanel());
}
}public class myButton extends JButton{
myButton(){
setText("PaintBrushServer");
// addActionListener(new listen());
}
}
public class server {
ServerSocket ssock;
Socket clientSocket;
PrintWriter writer;
DataOutputStream os = null;
server(){
//ini server
try {
ssock = new ServerSocket(42422);
System.out.println("waiting");
clientSocket = ssock.accept();
System.out.println(clientSocket.getRemoteSocketAddress()+" connected\n");
//writer = new PrintWriter(.getOutputStream());
InputStreamReader streamReader = new InputStreamReader(clientSocket.getInputStream());
reader = new BufferedReader(streamReader);
os = new DataOutputStream(clientSocket.getOutputStream());
new Thread(dr).start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void SendData(int x, int y){
try{
os.writeBytes(x+"#"+y+"\n");
}catch(Exception e){e.printStackTrace();}
}
}
}
SSCCE-PaintBrushClient
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.io.*;
import java.net.*;
import javax.swing.*;
public class Client {
int xpos = 0;
int ypos = 0;
Boolean flag = false;
ClientConnect cc ;
DataOutputStream os = null;
BufferedReader reader;
Client(){
//server connect
ClientConnect cc = new ClientConnect();
}
public static void main(String[] args) {
new Client();
}
public class ClientConnect {
private Socket sock;
String message;
ClientConnect(){
try {
sock = new Socket("127.0.0.1", 42422);
InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(streamReader);
os = new DataOutputStream(sock.getOutputStream());
//sr = new ServerReader();
//sr.start();
new myFrame();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}
public void SendData(int x, int y){
try{
os.writeBytes(x+"#"+y+"\n");
}catch(Exception e){e.printStackTrace();}
}
public class DrawPanel extends JPanel implements Runnable, MouseMotionListener{
String message;
DrawPanel(){
//constructor ini
addMouseMotionListener(this);
setBackground(Color.green);
setSize(500, 400);
setBounds(10, 10, 500, 400);
}
public void paintComponent(Graphics g) {
g.setColor(Color.red);
g.fillOval(xpos, ypos, 5, 5);
}
@Override
public void run() {
// TODO Auto-generated method stub
try{
while((message = reader.readLine())!=null) {
int in = message.indexOf("#");
xpos = Integer.parseInt(message.substring(0, in));
ypos = Integer.parseInt(message.substring(in+1));
//System.out.println(message);
System.out.println(xpos+" "+ypos);
repaint();
}}catch(Exception e){e.printStackTrace();}
}
@Override
public void mouseDragged(MouseEvent arg0) {
// TODO Auto-generated method stub
xpos= arg0.getX();
ypos= arg0.getY();
//flag = true;
//System.out.println(xpos);
//SendData(xpos,ypos);
repaint();
}
public void mouseMoved(MouseEvent arg0) {
}
}
public class myButton extends JButton{
myButton(){
setText("PaintBrushClient");
//addActionListener(new listen());
}
}
public class ButtonPanel extends JPanel{
ButtonPanel(){
add(new myButton());
}
}
public class myFrame extends JFrame{
myFrame(){
DrawPanel dr = new DrawPanel();
new Thread(dr).start();
setResizable(false);
setBackground(Color.black);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setSize(665,490);
getContentPane().add(BorderLayout.CENTER,dr);
getContentPane().add(BorderLayout.NORTH, new ButtonPanel());
}
}
}
答案 0 :(得分:2)
另一个人可能看不到一个帖子中的xpos / ypos更新。在 至少他们应该是不稳定的,但我更喜欢setXYPosition() 方法:
public synchronized void setXYPosition(int x, int y) {
this.xpos = x;
this.ypos = y;
repaint();
}
答案 1 :(得分:2)
好的,我最终让它在我的电脑上工作,所以我想这可能会让你感兴趣:
这里有两件事:
当您覆盖paintComponent
时,您仍应调用super:super.paintComponents(g);
,然后再绘制其余内容。
制作你的xpos ypos volatile
,因为你可以从不同的线程中访问它们。
您的代码中也缺少重写方法。最后,我把它全部修好了,我可以在一帧画画,同时看到它画在两个画面上(推出了2个不同的节目)。
我不会嘲笑设计和其他东西。还有其他帖子提供了很好的建议。
我认为还有一件事没有被提及,但如果您在两个程序之间共享类。将它们放在另一个文件中并多次使用它而不是复制/粘贴它们。您的几个课程就是这种情况。如果两者之间只有轻微差异,只需添加一个参数即可更改以指示您所处的情况。
好吧,我在咆哮,但实际上当你在服务器框架中绘图时,客户端会做出反应并绘制相同的东西。在个人情况下,我会在您的情况下将客户端称为服务器,将服务器称为客户端。通常,服务器“监听”客户端,在这种情况下,您绘制的是您的客户端,您看到它被复制的位置是您的服务器,但这只是语义。
答案 2 :(得分:1)
1)在您计划使用JTextArea
的情况下,使用String
显示来自Object
的传入ServerSocked
或Stylled Text
,然后查看{ {1}}
2)使用JTextPane
打开,阅读和关闭(SwingWorker
)finally block
,有两种选择:
使用Socket
或publish()
分发来自process()
的传入Chars
,String
或Object
,因为声明输出将在EDT,我建议将方法Socket
包装到JTextCompoent#append
如果结束并invokeLater
将Socked
或done()
置于所需的String
4)确保可以使用JComponent
将Runnable#Thread
或String
从Object
分发到Swing GUI,但我建议输出必须包含在{{ 1}},
3)在这个论坛上有一些关于Socket
的非常好的代码
答案 3 :(得分:1)
在PaintBrushServer上的线程内部没有调用repaint()方法的上述问题的答案,而在PaintBrushClient上调用它是....
只需从myFrame(JFrame)类中删除DrawPanel dr = new DrawPanel();
,就像我在开始时已经完成的那样。
感谢所有人的意见和建议,@ andrewThompson我现在知道如何提供一个好的SSCCE..lol
答案 4 :(得分:0)
你说你有一个接受坐标的线程,这是Event Dispatch Thread吗?如果是,则可能阻止对UI的任何更新。
答案 5 :(得分:-1)
您可以使用SwingUtilities.invokelater( ... )
在进行其他计算时对UI进行更新。在你的情况下
repaint()
甚至更好
revalidate();
repaint();
应该在invokeLater
可运行的实现中调用。