为什么我不能在jpanel上创建形状? [英] Why can't I create a shape on jpanel?
问题描述
我正在使用套接字编程来处理Java gui.我想使用从服务器发送的参数在jframe上创建jpanel,并在jpanel中创建随机形状. 我使用此资源来绘制形状:
I'm working on java gui with socket programming.I want to create jpanel on the jframe with the parameters I send from the server and create random shapes in jpanel. I used this resource to draw shapes:
https://github.com/AugustBrenner/Random -Draw-Shape/blob/master/DrawPanel.java
我在jframe中的代码是;
my code in jframe is;
public void starteGame(String received) {
gamers.setText(received);
String[] mParsed = received.split(" ");
boolean filled = true;
int width = Integer.parseInt(mParsed[2]);
int height = Integer.parseInt(mParsed[1]);
int x1 = Integer.parseInt(mParsed[3]);
int y1 = Integer.parseInt(mParsed[4]);
int x2 = Integer.parseInt(mParsed[5]);
int y2 = Integer.parseInt(mParsed[6]);
int randomShape = Integer.parseInt(mParsed[7]);
Color firstColor = new Color(Integer.parseInt(mParsed[8]), true);
Color secondColor = new Color(Integer.parseInt(mParsed[9]), true);
boolean cyclic = Boolean.parseBoolean(mParsed[10]);
switch (randomShape) {
case 1:
// add the line to the list of lines to be displayed
shape = new MyPolygon(x1, y1, x2, y2, firstColor, filled);
break;
case 2:
shape = new MyRectangle(x1, y1, x2, y2, firstColor, filled);
break;
case 3:
shape = new MyOval(x1, y1, x2, y2, firstColor, filled);
break;
}
jPanel2=new PanelDraw(width,height,x1,y1,x2,y2,firstColor,secondColor,
randomShape,shape,cyclic);
}
And my PanelDraw is;
public class PanelDraw extends JPanel implements MouseMotionListener {
private Random randomNumbers;
private MyShape shape;
int x1;
int y1;
int x2;
int y2;
Color firstColor;
Color secondColor;
int width;
int height;
// generate random shape
int randomShape;
boolean cyclic ;
// constructor, creates a panel with random shapes
public PanelDraw(int width, int height, int x1, int y1, int x2, int y2,
Color first, Color second, int randomS,MyShape shape ,boolean cyclic) {
this.width = width;
this.height = height;
// generate random coordinates
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
// generate a random color
this.firstColor = first;
this.secondColor = second;
// generate random shape
randomShape = randomS;
this.shape=shape;
this.cyclic=cyclic;
//setBackground( Color.BLACK );
} // end DrawPanel constructor
public void mouseMoved(MouseEvent event) {
}// end mouseMoved
public void mouseDragged(MouseEvent event) {
} // end method
// for each shape array, draw the individual shapes
@Override
public void paintComponent(Graphics g) {
//initialize filled boolean to true;
boolean filled = true;
// initialize random cyclic boolean
// draw the shape
Graphics2D g2d = (Graphics2D) g; // cast g to Graphics2D
g2d.setPaint(new GradientPaint(x1, y1, firstColor, x2, y2,
secondColor, cyclic));
shape.draw(g2d);
g2d.dispose();
// shapeCount++;
try {
Thread.sleep(700);
} catch (Exception e) {
}
repaint();
} // end method paintComponent
} // end class DrawPanel
当我的函数正在运行并且随机形状没有出现时,面板不会出现. 你能帮我吗?
the panel does not appear when my function is running and random shapes do not appear. Can you help me?
推荐答案
问题#1 ...
try {
Thread.sleep(700);
} catch (Exception e) {
}
在您的paintComponent
方法内部:/
Swing是单线程的(并且不是线程安全的),在paintComponent
中执行此操作将防止在"sleep
"返回之前对所有内容进行绘制,
Swing is single threaded (and not thread safe), doing this in your paintComponent
will prevent EVERYTHING from been painted until AFTER sleep
returns, it will also stop all user interaction from occurring.
有关更多详细信息,请参见 Swing中的并发 >
问题#1.1 ...
See Concurrency in Swing for more details
Graphics2D g2d = (Graphics2D) g; // cast g to Graphics2D
//...
g2d.dispose();
传递给您的Graphics
上下文是由系统创建的,并且在绘制过程中被绘制的所有组件之间共享.像这样处理它可能会导致其他组件被粉刷
The Graphics
context passed to you is created by the system and is shared between all components been painted during the paint pass. Disposing of it like this can cause other components from been painted
repaint();
在您的paintComponent
方法内部.
请勿直接或间接更改喷涂过程中任何组件的状态.绘画应该描绘状态,而别无其他.这样做将导致重新绘制管理器运行异常并消耗所有CPU周期
Don't change the state, directly or indirectly, of any component from within a paint pass. Painting should paint state and nothing else. Doing this will cause the repaint manager to run wild and consume all the CPU cycles
jPanel2=new PanelDraw(width,height,x1,y1,x2,y2,firstColor,secondColor, randomShape,shape,cyclic);
是的,但是您没有将组件添加到任何东西中,那么它应该如何绘画?
Yes, but you're not adding the component to anything, so how is it suppose to be painted?
这篇关于为什么我不能在jpanel上创建形状?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!