使用多个 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 中,您仍然会遇到问题:
- JPanel 是不透明的,因此最后绘制的面板将覆盖底部面板。
- 您的 DrawRectangle 面板没有 preferredSize,因为您没有重写 getPreferredSize() 方法,因此大小将为 0,因此没有任何内容可绘制
- JPanel 使用 FlowLayout,因此每个组件都将根据布局管理器的规则定位在面板上,因此您的 Rectangle 不会绘制在您认为应该位于的位置。
您需要先阅读 Swing Tutorial 了解 Swing 基础知识。也许部分:
Custom Painting
- 将向您展示如何正确覆盖 paintCompnent() 方法并实现 getPreferredSize() 方法
Doing Without a Layout Manager
- 因为您希望将组件放置在特定位置(即矩形的 x/y)。
说了这么多,这是一个更简单的解决方案,可以在单个面板上自定义绘制所有矩形。查看 Custom Painting Approaches。它有工作示例来演示执行此操作的两种常用方法:
- 将要绘制的对象添加到列表中,然后绘制方法将遍历列表来绘制每个对象。
- 直接绘制到 BufferedImage,然后通过使用自定义绘制的 JLabel 绘制 BufferedImage。
我正在尝试制作一个几乎可以在屏幕上绘制矩形和形状的程序。到目前为止,我已经制作了一个具有菜单栏和工具栏的 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 中,您仍然会遇到问题:
- JPanel 是不透明的,因此最后绘制的面板将覆盖底部面板。
- 您的 DrawRectangle 面板没有 preferredSize,因为您没有重写 getPreferredSize() 方法,因此大小将为 0,因此没有任何内容可绘制
- JPanel 使用 FlowLayout,因此每个组件都将根据布局管理器的规则定位在面板上,因此您的 Rectangle 不会绘制在您认为应该位于的位置。
您需要先阅读 Swing Tutorial 了解 Swing 基础知识。也许部分:
Custom Painting
- 将向您展示如何正确覆盖 paintCompnent() 方法并实现 getPreferredSize() 方法Doing Without a Layout Manager
- 因为您希望将组件放置在特定位置(即矩形的 x/y)。
说了这么多,这是一个更简单的解决方案,可以在单个面板上自定义绘制所有矩形。查看 Custom Painting Approaches。它有工作示例来演示执行此操作的两种常用方法:
- 将要绘制的对象添加到列表中,然后绘制方法将遍历列表来绘制每个对象。
- 直接绘制到 BufferedImage,然后通过使用自定义绘制的 JLabel 绘制 BufferedImage。