Графика не отображается в JLayeredPane (java swing)

#java #swing #graphics #jlayeredpane

#java #swing #графика #jlayeredpane

Вопрос:

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

 public class ClassA 
{
    protected final static int dimesionsY = 1000;
    private static int dimesionsX;
    private static JFrame window;
    private static JLayeredPane layeredPane;

    public void init()
    {
        window = new JFrame("Foo");
        dimesionsX = // some user input
        window.setPreferredSize(new Dimension(dimesionsX, dimesionsY));
        window.setLayout(new BorderLayout());

            layeredPane = new JLayeredPane();
        layeredPane.setBounds(0, 0, dimesionsX, dimesionsY);
        window.add(layeredPane, BorderLayout.CENTER);

            ClassB myGraphic = new ClassB();    
        myGraphic.drawGraphic();

        layeredPane.add(myGrpahic, new Integer(0), 0);

        window.pack();
        window.setVisible(true);
    }
}



public class ClassB extends JPanel
{
    public void drawGraphic()
    {
        repaint();
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        g.setColor(Color.BLACK);
        g.fillRect(10, 10, 100, 100);
    }
}
 

Однако моя графика, похоже, не отображается, и я не понимаю, почему. Я также попытался добавить ее в JPanel первую, добавив это JPanel к JLayeredPane тому, что, однако, тоже не сработало.

Пожалуйста, кто-нибудь может мне помочь?

Ответ №1:

Если вы добавляете компонент в JLayeredPane, это похоже на добавление его в нулевой макет с помощью контейнера: вы должны полностью указать размер и положение компонента.

например,

 import java.awt.*;

import javax.swing.*;

public class ClassA {
   protected final static int dimesionsY = 800;
   protected final static int dimesionsX = 1000; //!!
   private static JFrame window;
   private static JLayeredPane layeredPane;

   public void init() {
      window = new JFrame("Foo");
      // !! dimesionsX = // some user input

      //!! window.setPreferredSize(new Dimension(dimesionsX, dimesionsY));
      window.setLayout(new BorderLayout());

      layeredPane = new JLayeredPane();
      //!! layeredPane.setBounds(0, 0, dimesionsX, dimesionsY);
      layeredPane.setPreferredSize(new Dimension(dimesionsX, dimesionsY));
      window.add(layeredPane, BorderLayout.CENTER);

      ClassB myGraphic = new ClassB();
      myGraphic.drawGraphic();

      myGraphic.setSize(layeredPane.getPreferredSize());
      myGraphic.setLocation(0, 0);
      //!! layeredPane.add(myGraphic, new Integer(0), 0);
      layeredPane.add(myGraphic, JLayeredPane.DEFAULT_LAYER);

      window.pack();
      window.setVisible(true);
   }

   public static void main(String[] args) {
      new ClassA().init();
   }
}

class ClassB extends JPanel {
   public void drawGraphic() {
      repaint();
   }

   public void paintComponent(Graphics g) {
      super.paintComponent(g);

      g.setColor(Color.BLACK);
      g.fillRect(10, 10, 100, 100);
   }
}
 

Комментарии:

1. Кроме того, если вы накладываете JPanels друг на друга, надеюсь, вы позаботились о том, чтобы значение opaque было равно false . Другое решение вашей проблемы включает наложение буферных изображений друг на друга.

2. Спасибо за вашу помощь в этом. Я заметил, что вы использовали JLayeredPane.DEFAULT_LAYER при добавлении графики. Мне просто интересно, что лучше всего использовать в случае, если я хочу добавить дополнительную графику?

3. Я бы использовал любую логику, чтобы работать наилучшим образом. Если у меня есть что-то, что, как я знаю, будет внизу, я помещу это в слой по умолчанию.

4. Хорошо, это имеет смысл. Как бы мне добавить слой, чтобы он был поверх всего?

5. @JonW09: он просто должен иметь самую высокую целочисленную (…) константу при добавлении ее в JLayeredPane. Также проверьте API JLayeredPane для констант по умолчанию, которые использует Swing и которые вы тоже можете использовать.

Ответ №2:

См. раздел «Размещение компонентов на многоуровневой панели» из руководств по Java.

Кроме того, иногда вам нужно установить предпочтительный размер:

layeredPane.setPreferredSize(new Dimension(width, height));