我应该用Java创建一个基于Swing和gui的服务器和客户端.我需要以某种方式建立一个从服务器到客户端,从客户端到服务器的套接字,并传递某种字符串.I我希望稍后有一个函数可以根据套接字中的字符串做几件事.
出于某种原因,我找不到一个简单的代码示例,它以简单的方式显示了它是如何完成的.
任何人都有任何简单的例子,或者可以解释它是如何完成的?
我将JPanel子类化为覆盖paintComponent(Graphics),我想在jframe中将图像绘制到jpanel上.
但是在我改变jframe的大小之前,我的图像还没有显示出来.这是我的代码:
public class ImagePanel extends JPanel{
public void setImage(BufferedImage bi)
{
image = bi;
revalidate();
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if(image != null)
{
g.drawImage(image, 0, 0, this);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我知道,repaint()即使使用Swing的线程模型,以前从任何线程调用和其他一些选定的方法都被认为是安全的,但是我最近在评论中告诉我并非如此.
谷歌发现很多旧的讨论说这是安全的,但最近没什么.所有过去曾经说过安全的官方参考文献似乎已经消失了,我在各种论坛上发现了一些人讨论它是如何不再安全的.
我找不到任何正式的东西来确认它是否存在 - 而且我真的希望看到一些解释改变逻辑的东西,如果它已被改变的话.考虑到破坏现有应用程序的风险有多严重,删除它似乎是一个非常奇怪的功能.
我真的在寻找一个官方参考链接(即Javadoc,oracle教程或源代码链接),说明这些方法是否可以安全地从任何线程调用.
这里提到这个问题:
在EDT之外安全使用Component.repaint()?
从现已消失的Sun页面中引用一句话:
以下JComponent方法可以安全地从任何线程调用:repaint(),revalidate()和invalidate().repaint()和revalidate()方法将事件派发线程的请求分别调用paint()和validate().
这符合我的理解,但我现在找不到那个页面或任何类似的页面,我看到几个人的未经证实的谣言说它不再安全.但另一方面,我找不到任何明确的说这个功能已经改变.
改变笔记
可能有助于解决这个问题的是Oracle关于Swing线程处理变化的官方声明.我发现了"Java 7中的更改"页面,但根本没有提到它,这些页面都没有以任何方式提及线程或EDT:
http://docs.oracle.com/javase/7/docs/technotes/guides/swing/enhancements-7.html
http://docs.oracle.com/javase/7/docs/technotes/guides/awt/enhancements-7.html
我有两个几乎相同的类:AnimationFrame1和AnimationFrame2.这两个类都显示一个蓝色的球在500 x 500的窗口上水平来回移动.除了runAnimation()和createAndShowGUI()方法之外,这两个类是相同的.在其runAnimation()方法中,AnimationFrame1使用while循环和sleep方法创建动画循环,而AnimationFrame2使用Swing Timer.在其createAndShowGUI()方法中,AnimationFrame1创建一个新线程并在其上调用runAnimation()方法,而AnimationFrame2只调用没有新线程的runAnimation()方法.
在编译了这两个类之后,我发现使用Swing Timer的AnimationFrame2显示了一个更平滑的动画,它不会像使用while循环和sleep方法的AnimationFrame1中显示的动画那样断断续续.我的问题是:为什么AnimationFrame1在动画中显示出比AnimationFrame2更多的口吃?我一直在寻找原因,但迄今为止一无所获.
另外,我显然是Java新手,所以如果您发现我的代码有任何问题或者您知道我可以改进它的任何方式,请告诉我.
这是AnimationFrame1:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
class AnimationFrame1 extends JPanel {
int ovalX;
int prevX;
Timer timer;
boolean moveRight;
BufferedImage img;
public AnimationFrame1() {
setPreferredSize(new Dimension(500, 500));
}
public void runAnimation() {
moveRight = true;
img = null;
ovalX = 0;
prevX = 0;
while(true) {
if (moveRight == true) {
prevX = ovalX;
ovalX = ovalX + 4;
}
else {
prevX = ovalX - 4;
ovalX …Run Code Online (Sandbox Code Playgroud)