Почему я не могу создать форму на jpanel? - PullRequest
0 голосов
/ 26 апреля 2019

Я работаю над java gui с программированием сокетов. Я хочу создать jpanel на jframe с параметрами, которые я посылаю с сервера, и создавать случайные фигуры в jpanel.Я использовал этот ресурс для рисования фигур:

https://github.com/AugustBrenner/Random-Draw-Shape/blob/master/DrawPanel.java

мой код в jframe:

 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

панельне появляется, когда моя функция работает, а случайные фигуры не отображаются.Вы можете мне помочь?

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Задача № 1 ...

try {
    Thread.sleep(700);
} catch (Exception e) {
}

внутри вашего paintComponent метода: /

Swing является однопоточным (и не безопасным для потоков), выполнение этого в вашем paintComponent предотвратит рисование ВСЕГО до возвращения ПОСЛЕ sleep, а также остановит все взаимодействие с пользователем.

См. Параллельность в Swing для получения более подробной информации

Задача № 1.1 ...

Graphics2D g2d = (Graphics2D) g; // cast g to Graphics2D
//...
g2d.dispose();

Переданный вам контекст Graphics создается системой и используется всеми компонентами, которые были окрашены во время прохождения рисования. Такая утилизация может привести к окрашиванию других компонентов

Задача № 1.2 ...

repaint();

внутри вашего paintComponent метода.

Не изменяйте состояние, прямо или косвенно, любого компонента из прохода рисования. Картина должна рисовать состояние и больше ничего. Это приведет к тому, что менеджер перерисовки будет работать вхолостую и потреблять все циклы ЦП

Задача № 2 ....

jPanel2=new PanelDraw(width,height,x1,y1,x2,y2,firstColor,secondColor, randomShape,shape,cyclic);

Да, но вы не добавляете компонент ни к чему, так как он должен быть нарисован?

1 голос
/ 26 апреля 2019
Thread.sleep(700);

Никогда не используйте Thread.sleep () в методе рисования.

Это приведет к тому, что поток диспетчеризации событий перейдет в спящий режим, что означает, что графический интерфейс не может перерисовываться или отвечать на события.

Также:

  1. Никогда не вызывайте reapint () в методе рисования. Если вам нужна анимация, используйте Swing Timer.

  2. Первое выражение в методе paintCoponent () должно быть super.paintComponent(g), чтобы убедиться, что фон панели очищен перед выполнением пользовательской рисования.

...