无法在JFrame中看到JPanel中的子JPanel

时间:2016-04-27 13:41:07

标签: java swing jframe jpanel awt

我是java GUI编程的新手。 我创建了JFrame。 在JFrame内,我创建了JPanel。 在JPanel内,我创建了另一个JPanel(我们称之为" A")。

我已经在" A"一个矩形,并希望使用图形创建按钮。 我的gui中没有矩形。我可以看到内部的paintComponent()方法" A"没有被援引。

代码: JPanels :(孩子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
        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);
        }
    }
}

编辑:  谢谢大家, 我有另一个包导致问题,同一个类名。好像现在有效了。

3 个答案:

答案 0 :(得分:2)

您应首先对JButton进行编程,以使图形作为按钮工作。我相信这篇文章会帮助你:

Creating a custom button in Java

我想要一个矩形作为按钮的背景,您可以在主面板中绘制它并在其上添加按钮。尝试使用不同的布局来保留一些订单。

答案 1 :(得分:1)

我已经制作了一个简单的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);
        }
    }
 }

这是获得的结果:

enter image description here

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

答案 2 :(得分:0)

更改 MemoryButton 的类名修复了它。

我有另一个具有相同类名的包。