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