Как правильно нарисовать на Jpanel?

169
28 июля 2019, 03:00

у меня есть главное окно(MainFrame), где меню, таблица и т.д, и есть свободное место, куда размещено пустой JPANEL(MainDrawPanel), я хочу туда нарисовать фигуры.

У меня есть код, который я уже подготовил, но у меня получается рисовать только в новом окне, JFRAME:

    public class MainFrame extends javax.swing.JFrame {
      . . .  
     private void metName () {
     class MyPanel extends JPanel {
                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    g.drawString("Contours: " + contours.size(), 20, 20);
                    for (Contour c : contours) {
                        System.out.println(c.getArea());
                        int gg = rnd.nextInt(250);
                        int r = rnd.nextInt(250);
                        int B = rnd.nextInt(250);
                        g.setColor(new Color(0, 0, 0));
                        ListIterator<Point_dt> itr = c.points.listIterator();
                        Point_dt a = itr.next();//throws Exception if points size = 0
                        while (a != null && itr.hasNext()) {
                            Point_dt b = itr.next();
                            g.drawLine((int) a.x, (int) a.y, (int) b.x, (int) b.y);
                           //g.drawString("(" + a.x + ", " + a.y + ") ", (int)a.x, (int)a.y);
                            //g.drawString("(" + b.x + ", " + b.y + ") ", (int)b.x, (int)b.y);
                            g.fillOval((int) a.x, (int) a.y, 4, 4);
                            g.fillOval((int) b.x, (int) b.y, 4, 4);
                            a = b;
                        }
                    }
                }
            }
            JFrame frame = new JFrame("Рисунок");
            JPanel viewer = new MyPanel();
            frame.getContentPane().add(viewer);
            frame.setSize(new Dimension(900, 780));
            frame.setVisible(true);
    }
    . . .
    }

Этот код работает, но он рисует на отдельном окне, как мне заставить его работать в главном окне (MainFrame), на пустом JPANEL(mainDrawPanel) ?

Answer 1

есть подозрение, что вы просто не видите или MainDrawPanel или MyPanel которую вы не нее кладете. Попробуйте так

mainDrawPanel.setLayout(new BorderLayout());
mainDrawPanel.add(viewer,BorderLayout.CENTER);

Таким образом всю панель viewer должно растянуть на всю центральную область панели MainDrawPanel. Вот документация по BorderLayout. Так же проверьте размеры MainDrawPanel.

Если я правильно помню, то frame.getContentPane() имеет по умолчанию BorderLayout. А при добавлении без явного указания зоны, элемент добавляется в центр. Поэтому в новом фрэйме у вас все отображается.

READ ALSO
Java EE (Jakarta EE) сервера приложений, в чём разница?

Java EE (Jakarta EE) сервера приложений, в чём разница?

Я люблю и обожаю Java, использовал спринг, испрользовал много чего еще, но так вышло что Java EE (Jakarta EE) меня обошел стороной, но сейчас я решил попробовать

141
Java EE (Jakarta EE) и rest

Java EE (Jakarta EE) и rest

Насколько принято или не принято писать Rest API с использованием Java EE?

156
Java EE (Jakarta EE), в чем секрет популярности Tomcat?

Java EE (Jakarta EE), в чем секрет популярности Tomcat?

Правильно ли я понимаю что Tomcat реализует только маленькую часть всего Java EE стека, если да, то почему от такой популярный?

161
Упаковка вэб приложения на Angular для Android

Упаковка вэб приложения на Angular для Android

Подскажите вэб приложения сделанные на Angular 4 можно упаковать через андроид студио для использования на телефоне или его все таки нужно переписывать...

168