【问题标题】:Drawing On JPanel Resetting When Tabs Are Switched (Net Beans Java Gui Generator)在切换选项卡时绘制 JPanel 重置(Netbeans Java Gui 生成器)
【发布时间】:2021-09-29 08:52:44
【问题描述】:

我有以下代码:

    private void gardenJPanelMouseClicked(java.awt.event.MouseEvent evt) {                                          
        Graphics g = this.gardenJPanel.getGraphics();
        Graphics2D draw = (Graphics2D) g;

        int x = evt.getX();
        int y = evt.getY();
       
        draw.setStroke(new BasicStroke(pointStroke));

        draw.drawLine(x, y, x, y);
    }            

以下代码完美地利用了 JPanel。唯一的问题是切换选项卡时 JPanel 上的图形会重置。切换选项卡时如何防止 JPanel 重置为空白?我想不通这个问题。

【问题讨论】:

  • 在组件上执行自定义绘画时,您应该重写paintComponent方法,否则每次刷新面板时都会丢失更改。官方 java 教程有一个关于如何使用自定义绘画的优秀部分:docs.oracle.com/javase/tutorial/uiswing/painting/index.html
  • @sorfiend 你能提供一个例子来说明如何用我的代码覆盖它吗?我看到了,我非常困惑。我不知道如何使用 GUI 生成器来做到这一点。请帮忙。
  • @sorfiend 我正在使用 Net Beans。另外,我需要为此使用 JPanel。
  • @sorfiend 请看我下面的回复。我需要有关如何使用 GUI 生成器执行此操作的帮助。

标签: java swing graphics


【解决方案1】:

您的问题的简短回答是您需要创建一个自定义组件并覆盖该JPanel 等的paintComponont 方法,然后我们可以在该方法中执行我们的自定义绘画。

例如,我们可以创建一个扩展 JPanel 的类,该类还包括鼠标点击事件:

public class MyCustomPanel extends JPanel implements MouseListener 
{
    //If you want to dynamically draw dots then use a list to manage them
    ArrayList<Point> points = new ArrayList<>();
    
    //Here is where the painting happens, we need to override the default paint behaviour, then add our own painting
    @Override
    protected void paintComponent(Graphics g)
    {
        //Call this first to perform default painting (borders etc)
        super.paintComponent(g);
    
        //Here we can add our custem painting
        Graphics2D draw = (Graphics2D) g;
        draw.drawString("Example painting", 10, 10);
    
        //If you want to dynamically draw dots then use a list to manage them:
        for (Point point : points)
        {
            draw.drawLine(point.x, point.y, point.x, point.y);
        }
    }
    
    //Add a new point and refresh the graphics
    @Override
    public void mouseClicked(MouseEvent e)
    {
        points.add(new Point(e.getX(), e.getY()));
        this.repaint();
    }
}

然后插入 myCustomPanel 我们不使用 UI 生成器,而是直接将其添加到 JFrame 中,如下所示:

MyCustomPanel panel = new MyCustomPanel();
yourJFframe.add(new myCustomPanel());

【讨论】:

  • 我还是有问题。在 private void gardenJPanelMouseClicked 函数中,我仍然不确定要添加什么。
  • 我需要帮助用我当前的函数来实现它。
  • @Van66a 可以去掉gardenJPanelMouseClicked函数,这个类代替了面板和点击函数,每点击一个点都会成功绘制一个点。如果您不确定如何使用此答案,那么您真的需要通过 swing tutorials 尤其是 custom painting 上的最后一个来了解 java 的工作原理
  • 另一个稍微有点混乱的选项是将您的更改绘制到缓冲图像上,然后每次绘制新内容时,您可以简单地设置更新的image as the JPanel background,或者您可以使用 JLabel 组件您可以为其分配背景图像。
猜你喜欢
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 2022-01-05
相关资源
最近更新 更多