在 JFrame 中的 JPanel 中看不到 child JPanel

Can't see child JPanel in JPanel in JFrame

我创建了一个 JFrame。 在这个 JFrame 中,我创建了一个 JPanel。 在这个 JPanel 中,我创建了另一个 JPanel(我们称它为“A”)。

我在“A”中画了一个矩形,想用图形创建按钮。 我的图形用户界面中没有矩形。我可以看到“A”中的 paintComponent() 方法没有被调用。

代码: JPanels:(child JPanel 是内部 class)

public class MemoryPanel extends JPanel {
    
    public MemoryPanel(){
        setPreferredSize(new Dimension(350,448));
    }
    
    @Override 
    public void paintComponent(Graphics g) {    
        //POSITIONING
        setLayout(new BorderLayout());
        
        //CREATE MEMORY BUTTONS
        MemButton a=new MemButton();
        
        //Drawing Rectangles for Memory
        add(a,BorderLayout.CENTER);

    } 
    

    
    private class MemoryButton extends JPanel{
        public MemoryButton(){
            setLayout(null);
            setPreferredSize(new Dimension(87,40));
        }
        
        @Override
        public void paintComponent(Graphics g){
            Graphics2D td= (Graphics2D)g;
            td.drawRect(0, 0, 20, 20);
        }
    }
}

您应该首先对 JButton 进行编程,以便您的图形可以用作按钮。我相信这个 post 会帮助你:

Creating a custom button in Java

如果您想要一个矩形作为按钮的背景,您可以在主面板中绘制它并在其上添加按钮。尝试使用不同的布局来维护一些秩序。

我制作了一个简单的 GUI 来测试您的代码,矩形显示正确。 我没有对您发布的代码进行任何相关更改。

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class SimpleJFrameProgram extends JFrame {
     private static final long serialVersionUID = 1L;

     public SimpleJFrameProgram() {
         super("TEST");

         initComponents();

         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         this.pack();
         this.setLocationRelativeTo(null);
         this.setVisible(true);
     }


    private void initComponents() {
        MemoryPanel memoryPanel = new MemoryPanel();

        this.add(memoryPanel);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    new SimpleJFrameProgram();
                } catch (Exception e) {
                   e.printStackTrace();
                }
            }
       });
    }
 }

我对您的 MemoryPanel 进行了细微更改:将 MemButton 替换为您的 MemoryButton 并将矩形填充为红色以提高其在测试中的可见性。如果没有最后的更改,矩形也会出现。

  import java.awt.BorderLayout;
  import java.awt.Color;
  import java.awt.Dimension;
  import java.awt.Graphics;
  import java.awt.Graphics2D;

  import javax.swing.JPanel;

  public class MemoryPanel extends JPanel {

    public MemoryPanel(){
         setPreferredSize(new Dimension(350,448));
    }

    @Override
    public void paintComponent(Graphics g) {
        // POSITIONING
        setLayout(new BorderLayout());

        // CREATE MEMORY BUTTONS
        MemoryButton a = new MemoryButton();

        // Drawing Rectangles for Memory
        add(a,BorderLayout.CENTER);

    }

    private class MemoryButton extends JPanel{
        public MemoryButton(){
            setLayout(null);
            setPreferredSize(new Dimension(87,40));
        }

        @Override
        public void paintComponent(Graphics g) {

            Graphics2D td = (Graphics2D) g;
            td.setColor(Color.red);
            td.fillRect(0, 0, 20, 20);
        }
    }
 }

这是得到的结果:

也许您的问题出在初始化父级 JFrame

更改 MemoryButton 的 class 名称修复了它。

我有另一个具有相同 class 名称的包裹。