使用多个 JPanel 未显示矩形、形状 (Java/Swing)

Rectangles, shapes aren't showing up (Java/Swing) using multiple JPanels

我正在尝试制作一个几乎可以在屏幕上绘制矩形和形状的程序。到目前为止,我已经制作了一个具有菜单栏和工具栏的 GUI,其中包含一些按钮(这些按钮尚未运行)。

现在我遇到了这个问题,我的矩形没有显示在我的绘图面板上,我认为这是由于 JPanel 相互重叠导致我的 DrawRectangle class。但我不确定。

这是我的 DrawRectangle class 我不想在其中绘制矩形然后将它们放入我的 DrawingPanel (如果可能的话)。

package Shapes;

import java.awt.Graphics;

import javax.swing.JPanel;

public class DrawRectangle extends JPanel 
{
    private static final long serialVersionUID = 1L;

    public int old_x;
    public int old_y;
    public int new_x;
    public int new_y;

    public DrawRectangle(int old_x, int old_y, int new_x, int new_y)
    {
        this.old_x = old_x;
        this.old_y = old_y;
        this.new_x = new_x;
        this.new_y = new_y;

        repaint();
    }

    public void paintComponent(Graphics g)
    {
        g.drawRect(old_x, old_y, new_x, new_y);
    }
}

这是我的 DrawingPanel class,我想在其中存储我的 DrawRectangle class

中绘制的所有图形
package Panel;

import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.BorderFactory;
import javax.swing.JPanel;

import Shapes.DrawRectangle;

    public class DrawingPanel
    {   
        private JPanel drawPanel;

         private int tool = 1;
         int currentX, currentY, oldX, oldY;

        public DrawingPanel()
        {
            drawPanel = new JPanel();               
            drawPanel.setBackground(Color.WHITE);
            drawPanel.setBorder(BorderFactory.createLineBorder(Color.black));

            // Testing, neither of them are showing up (trying without mouse)
            new DrawRectangle(100,100,100,100); 
            new DrawRectangle(200,200,300,100); 

            drawPanel.addMouseListener(new MouseAdapter(){
                public void mousePressed(MouseEvent evt){
                    drawPanelMousePressed(evt);
                }

                public void mouseReleased(MouseEvent evt){
                    drawPanelMouseReleased(evt);
                }
            });

            drawPanel.addMouseMotionListener(new MouseMotionAdapter(){
                public void mouseDragged(MouseEvent evt){
                    drawPanelMouseDragged(evt);
                }
            });
        }

        public JPanel getDrawPanel() 
        {
            return drawPanel;
        }

        private void drawPanelMouseDragged(MouseEvent evt) {
            if (tool == 1) {
                currentX = evt.getX();
                currentY = evt.getY();
                oldX = currentX;
                oldY = currentY;
                System.out.println(currentX + " " + currentY);
                System.out.println("PEN!!!!");
            }
        }

        private void drawPanelMousePressed(MouseEvent evt) {
            oldX = evt.getX();
            oldY = evt.getY();
            System.out.println(oldX + " " + oldY);
        }


        private void drawPanelMouseReleased(MouseEvent evt) {
             currentX = evt.getX();
             currentY = evt.getY();

        }
    }

我还在考虑我的 JPanel 容器,它可能会导致我的 DrawingPanel 内容未显示。这是我的 ContainerPanel class

package Panel;

import java.awt.BorderLayout;

import javax.swing.JPanel;

public class ContainerPanel
{
    private JPanel containerPanel;

    public ContainerPanel()
    {
        containerPanel = new JPanel(new BorderLayout());                                
        containerPanel.setOpaque(true);
        containerPanel.add(new DrawingPanel().getDrawPanel(), BorderLayout.CENTER);     
        containerPanel.add(new ToolBarPanel().getToolBarPanel(), BorderLayout.NORTH);   
    }

    public JPanel getContainerPanel()
    {
        return containerPanel;
    }
}

第一次在 Whosebug :)

drawPanel = new JPanel();  

创建面板时,将其分配给一个变量,以便您可以在 getDrawPanel() 方法中使用该变量。

new DrawRectangle(100,100,100,100); 

在这里您创建了一个 DrawRectangle 但您没有对它做任何事情。您不会将它添加到 drawPanel 或其他任何东西,因此它永远不会被绘制。

and I'm thinking it's due to JPanels who overlap on each other that my DrawRectangle class.

即使您解决了上述问题并将 DrawRectangle class 添加到 DrawPanel 中,您仍然会遇到问题:

  1. JPanel 是不透明的,因此最后绘制的面板将覆盖底部面板。
  2. 您的 DrawRectangle 面板没有 preferredSize,因为您没有重写 getPreferredSize() 方法,因此大小将为 0,因此没有任何内容可绘制
  3. JPanel 使用 FlowLayout,因此每个组件都将根据布局管理器的规则定位在面板上,因此您的 Rectangle 不会绘制在您认为应该位于的位置。

您需要先阅读 Swing Tutorial 了解 Swing 基础知识。也许部分:

  1. Custom Painting - 将向您展示如何正确覆盖 paintCompnent() 方法并实现 getPreferredSize() 方法

  2. Doing Without a Layout Manager - 因为您希望将组件放置在特定位置(即矩形的 x/y)。

说了这么多,这是一个更简单的解决方案,可以在单个面板上自定义绘制所有矩形。查看 Custom Painting Approaches。它有工作示例来演示执行此操作的两种常用方法:

  1. 将要绘制的对象添加到列表中,然后绘制方法将遍历列表来绘制每个对象。
  2. 直接绘制到 BufferedImage,然后通过使用自定义绘制的 JLabel 绘制 BufferedImage。