我正在尝试制作一个几乎可以在屏幕上绘制矩形和形状的程序。到目前为止,我已经制作了一个带有菜单栏和工具栏以及一些按钮(尚不起作用)的GUI。

现在,我一直困扰着这个问题,即我的矩形未显示在绘图面板上,并且我认为这是由于JPRnel在DrawRectangle类上彼此重叠。但我不确定。

这是我的DrawRectangle类,在这里我不想绘制矩形,然后将它们放到我的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类,我想在其中存储DrawRectangle类中的所有绘制的图形

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类

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;
    }
}


第一次在stackoverflow :)

最佳答案

drawPanel = new JPanel();


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

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


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


  我想这是由于JPRnels类相互重叠的缘故。


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


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


您需要先阅读Swing Tutorial来了解Swing的基础知识。也许关于:


Custom Painting-将向您展示如何正确覆盖paintCompnent()方法并实现getPreferredSize()方法
Doing Without a Layout Manager-因为您希望将组件放置在特定位置(即矩形的x / y)。


话虽如此,这是在单个面板上对所有Rectangle进行自定义绘制的一种更简单的解决方案。检出Custom Painting Approaches。它具有一些工作示例,以演示实现此目的的两种常用方法:


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

07-26 02:50