Добавление элемента на JPanel в произвольное место - Java

Узнай цену своей работы

Формулировка задачи:

Можно ли добавить какой-либо элемент на JPanel, указав его координаты? Или тут другой класс стоит использовать? Пробовал так, но ничего не меняется
Листинг программы
  1. JPanel contents = new JPanel(new FlowLayout(FlowLayout.LEFT));
  2. contents.add(btnOk, new Point(350, 400));

Решение задачи: «Добавление элемента на JPanel в произвольное место»

textual
Листинг программы
  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.util.Random;
  4. import java.util.concurrent.ExecutorService;
  5. import java.util.concurrent.Executors;
  6. import java.util.concurrent.TimeUnit;
  7.  
  8.  
  9. public class StarBoxes extends JFrame {
  10.     private static int counter = 0;
  11.     private int grid = 12;
  12.     private int pause = 50; //ms
  13.     private static ExecutorService exec = Executors.newCachedThreadPool(); // параллельное выполнение
  14.     private static Random rnd = new Random();
  15.  
  16.     private class CStar extends JPanel implements Runnable {  // панель со своим потоком и локальной фоновой задаче
  17.         private final int id = counter++;
  18.  
  19.         private int pause;
  20.         private Random rnd = new Random();
  21.         private Color color = new Color(0);
  22.         private int[] pX;
  23.         private int[] pY;
  24.         private int nVertices;
  25.  
  26.         public CStar(int pause, int nVertices) {  // параметр только пауза
  27.             this.pause = pause;
  28.             this.nVertices = nVertices;
  29.         }
  30.  
  31.  
  32.         public void makePolygon() {
  33.             System.out.println("Make Polygon "+this+" "+pause);
  34.             double angle = rnd.nextInt(90);  // стартовый угол
  35.             pX = new int[nVertices * 2];
  36.             pY = new int[nVertices * 2];
  37.  
  38.             Dimension dim = this.getSize();         // свои размеры
  39.             int cX = dim.width / 2;                   // по центру панели
  40.             int cY = dim.height / 2;
  41.             int radius = (dim.width > dim.height ? dim.height / 2 : dim.width / 2);
  42.             int nPoints = pX.length;                // число точек
  43.  
  44.             for (int i = 0; i < nPoints; i++) {
  45.                 int len = (i % 2 == 0 ? radius : radius / 2);
  46.                 double x = Math.cos(2 * Math.PI * ((double) i / nPoints + angle / 360)) * len;
  47.                 double y = Math.sin(2 * Math.PI * ((double) i / nPoints + angle / 360)) * len;
  48.                 pX[i] = (int) x + cX;
  49.                 pY[i] = (int) y + cY;
  50.             }
  51.         }
  52.  
  53.         @Override
  54.         protected void paintComponent(Graphics g) {
  55.             super.paintComponent(g);  // вызывать обязательно чтобы не было искажений
  56.             color = new Color(rnd.nextInt(0xFFFFFF));
  57.             if (pX == null) {
  58.                 makePolygon(); // обновить полигон
  59.             }
  60.             g.setColor(color);
  61.             g.fillPolygon(pX, pY, pX.length);
  62.  
  63.         }
  64.  
  65.         @Override
  66.         public void run() {
  67.             try {
  68.                 while (!Thread.interrupted()) {
  69.                     color = new Color(rnd.nextInt(0xFFFFFF));
  70.                     // getParent().repaint();      // если не используется super.paintComponent(g)
  71.                     repaint();                      // super.paintComponent(g) ОБЯЗАТЕЛЬНО
  72.                     TimeUnit.MILLISECONDS.sleep(pause);
  73.                 }
  74.             } catch (InterruptedException e) {
  75.                 System.out.println(this + " interrupted");
  76.             }
  77.         }
  78.  
  79.         @Override
  80.         public String toString() {
  81.             return "CBox " + id;
  82.         }
  83.     }
  84.  
  85.  
  86.  
  87.     public StarBoxes() {
  88.         setLayout(new GridLayout(grid, grid));              // 12x12
  89.         for (int i = 0; i < grid * grid; i++) {             // 144 окошка для панелей
  90.             if (rnd.nextBoolean()) {
  91.                 CStar cStar = new CStar(250, 5); // звездочка
  92.                 add(cStar);
  93.                 exec.execute(cStar);                        // запустили фоновый поток панели
  94.             } else {
  95.                 JPanel jPanel = new JPanel();// пустая панель
  96.                 add(jPanel);
  97.             }
  98.         }
  99.  
  100.     }
  101.  
  102.  
  103.     public static void main(String[] args) {
  104.         SwingUtilities.invokeLater(new Runnable() {
  105.             @Override
  106.             public void run() {
  107.                 StarBoxes starBoxes = new StarBoxes();
  108.                 starBoxes.setSize(500,400);
  109.                 starBoxes.setVisible(true);
  110.  
  111.             }
  112.         });
  113.     }
  114.  
  115. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.429 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут