Java 在JFrame上的JPanel上添加画布

Java 在JFrame上的JPanel上添加画布,java,image,swing,canvas,jpanel,Java,Image,Swing,Canvas,Jpanel,我希望标题不要太混乱。 首先,我还是一个初学者,我几个月前才开始学习java,直到几周前才开始使用图形组件。我的问题是: 我得到了一个JFrame作为容器,然后是一个Canvas“Canvas”来存储BuffereImage,JPanel“bPanel”用来保存三个JButton。出于某种原因,即使我使用了bPanel.setOpaque(false)和/或bPanel.setBackground(新颜色(0,0,0,0)),JPanel仍然会阻止画布,无论我先添加哪个,然后添加哪个,无论我是将

我希望标题不要太混乱。 首先,我还是一个初学者,我几个月前才开始学习java,直到几周前才开始使用图形组件。我的问题是: 我得到了一个JFrame作为容器,然后是一个Canvas“Canvas”来存储BuffereImage,JPanel“bPanel”用来保存三个JButton。出于某种原因,即使我使用了bPanel.setOpaque(false)和/或bPanel.setBackground(新颜色(0,0,0,0)),JPanel仍然会阻止画布,无论我先添加哪个,然后添加哪个,无论我是将画布添加到JFrame还是JPanel。 我在互联网上搜索了几个小时,尝试了至少5种不同的解决方案,但都没有成功。出于某种原因,我无法通过JPanel加载图像,可能是因为我的显示类没有扩展任何内容。 无论如何,让我们继续: 下面是我的代码(是的,我知道我可以选择DisplayExtendesJFrame,但这并不能解决问题,我已经尝试过了)

}

例如,在我的这次尝试中,仅在按下按钮“支架”后才显示图片:

public void showImage(String path) {

    JLabel jl = new JLabel();
    jl.setIcon(new javax.swing.ImageIcon(getClass().getResource(path)));
    frame.add(jl);
    frame.repaint();

}
我非常绝望,因为我花了很多时间试图找到一个加载图形的解决方案。 提前感谢您的帮助:D

几个问题:

  • 不要使用空布局。Swing设计用于布局管理器
  • JFrame的默认布局管理器是BorderLayout。如果不指定约束,组件将添加到中心。只有一个组件可以显示在中心。因此,您不能一直向框架添加组件。您需要具有父/子层次结构
  • 不要使用画布。这是AWT组件。如果您想在Swing中进行自定义绘制,可以使用JPanel
  • 因此,您的代码可能类似于:

    //addButton(draw);
    //addButton(stand);
    //addButton(reset);
    bPanel(draw);
    bPanel(stand);
    bPanel(reset);
    
    JPanel的默认布局管理器是FlowLayout。因此按钮将从左到右添加,并在面板上居中

    //frame.add(bPanel);
    frame.add(bPanel, BorderLayout.PAGE_START);
    
    现在,所有按钮都将添加到框架顶部

    //private Canvas canvas;
    private JPanel canvas;
    ….
    //canvas = new Canvas();
    canvas = new JPanel(new BorderLayout());
    …
    //frame.add(canvas);
    frame.add(canvas, BorderLayout.CENTER);
    
    现在“画布”将添加到框架的边框布局的中心,这意味着它将占用按钮面板未使用的所有空间

    public void showImage(String path) {
    
        JLabel jl = new JLabel();
        jl.setIcon(new javax.swing.ImageIcon(getClass().getResource(path)));
        frame.add(jl);
        frame.repaint();
    
    }
    
    无法将图像直接添加到帧中,因为您已将其他组件添加到帧中。请改用:

        //frame.add(jl);
        //frame.repaint();
        canvas.add(jl);
        canvas.repaint();
    
    因此,图像被添加到画布中,画布被添加到框架中,因此您有一个父/子层次结构

    //draw.setBounds(100, ((height/2)-(bheight/2)), bwidth, bheight);
    //stand.setBounds(((width-100)-bwidth), ((height/2)-(bheight/2)), bwidth, bheight);
    //reset.setBounds(((width/2)-40), (height-120), 80, 80);
    
    不需要上述代码,因为布局管理器的工作是根据布局管理器的规则设置每个组件的大小和位置

    因此,基本上你需要重新开始学习一些Swing基础知识。也许会有帮助。这里有如何使用每个布局管理器的演示。

    几个问题:

  • 不要使用空布局。Swing设计用于布局管理器
  • JFrame的默认布局管理器是BorderLayout。如果不指定约束,组件将添加到中心。只有一个组件可以显示在中心。因此,您不能一直向框架添加组件。您需要具有父/子层次结构
  • 不要使用画布。这是AWT组件。如果您想在Swing中进行自定义绘制,可以使用JPanel
  • 因此,您的代码可能类似于:

    //addButton(draw);
    //addButton(stand);
    //addButton(reset);
    bPanel(draw);
    bPanel(stand);
    bPanel(reset);
    
    JPanel的默认布局管理器是FlowLayout。因此按钮将从左到右添加,并在面板上居中

    //frame.add(bPanel);
    frame.add(bPanel, BorderLayout.PAGE_START);
    
    现在,所有按钮都将添加到框架顶部

    //private Canvas canvas;
    private JPanel canvas;
    ….
    //canvas = new Canvas();
    canvas = new JPanel(new BorderLayout());
    …
    //frame.add(canvas);
    frame.add(canvas, BorderLayout.CENTER);
    
    现在“画布”将添加到框架的边框布局的中心,这意味着它将占用按钮面板未使用的所有空间

    public void showImage(String path) {
    
        JLabel jl = new JLabel();
        jl.setIcon(new javax.swing.ImageIcon(getClass().getResource(path)));
        frame.add(jl);
        frame.repaint();
    
    }
    
    无法将图像直接添加到帧中,因为您已将其他组件添加到帧中。请改用:

        //frame.add(jl);
        //frame.repaint();
        canvas.add(jl);
        canvas.repaint();
    
    因此,图像被添加到画布中,画布被添加到框架中,因此您有一个父/子层次结构

    //draw.setBounds(100, ((height/2)-(bheight/2)), bwidth, bheight);
    //stand.setBounds(((width-100)-bwidth), ((height/2)-(bheight/2)), bwidth, bheight);
    //reset.setBounds(((width/2)-40), (height-120), 80, 80);
    
    不需要上述代码,因为布局管理器的工作是根据布局管理器的规则设置每个组件的大小和位置


    因此,基本上你需要重新开始学习一些Swing基础知识。也许会有帮助。这里有如何使用每个布局管理器的演示。

    哇,非常感谢你给出了这么长而详细的答案。我从youtube教程中获得了画布代码,其中不包括jpanels或其他JComponents,所以我对此非常迷茫。我真的没有因为我不知道JFrame的限制,所以想太多父/子层次结构。再次感谢你,这真的很有帮助:)还有一个问题:我实现/更改了你所更改的所有内容,现在JFrame的高度是无限的;不管我把它拉多远,它都不会结束。你知道为什么吗?谢谢你,我不能告诉你为什么高度是无限的。除了进行自定义绘制的JPanel的“首选大小”之外,不应设置任何组件的大小。Swing教程中关于自定义绘制的部分有一个关于如何执行此操作的工作示例。从简单的事情开始。创建一个框架将您的按钮面板添加到框架中,然后将框架打包。让它工作起来。然后添加自定义面板并使其正常工作。如果它不起作用,那么在一个新的问题中发表你的文章,演示这个问题。编程是关于采取小步骤并测试每一步。我明白了,这是因为我没有正确调整JPanels的大小我没有正确调整JPanels的大小-你不应该设置面板的大小。这是布局管理器的工作。您不应该在组件上使用setBounds()或setSize()。哇,非常感谢您给出了这么长而详细的答案。我从一个youtube教程中获得了画布代码,该教程不包括JPanel或其他JComponents,因此我对此非常迷茫。我并没有过多地考虑父/子层次结构,因为我不知道JFrames的限制。再次感谢你,这真的很有帮助:)再来一个任务