为什么我不能在jpanel上创建形状? [英] Why can't I create a shape on jpanel?

查看:235
本文介绍了为什么我不能在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆