JPanel没有显示在我的JFrame中

时间:2013-09-18 12:28:11

标签: java swing jpanel

所以我正在玩JPanels和JFrames,我注意到我创建的JPanel在我将它添加到Jframe对象时没有显示。请注意,当我在Jframe构造函数中创建JPanel时,在添加到Jframe之前给出了jpanel参数,它可以工作。但是现在我正在使用我创建的JPanel对象,它不再起作用了。 这就是我所做的。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyGui extends JFrame {

    MyMouseListener listen = new MyMouseListener();

    public MyGui() {
        setSize(500, 500);
        //setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
        getContentPane().setBackground(Color.WHITE);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        Panel panel = new Panel();
        add(panel, BorderLayout.WEST);
        //setVisible(true);
        show();
    }

    public static void main(String[] a) {
        MyGui gui = new MyGui();
    }
}

class Panel extends JPanel {

    MyMouseListener listen = new MyMouseListener();

    public Panel() {
        setPreferredSize(new Dimension(300, 300));
        addMouseListener(listen);
        setBackground(Color.YELLOW);
        setLayout(new GridLayout(3, 1));
    }

    public void paint(Graphics g) {
        super.paintComponents(g);
        g.drawOval((int) Math.round(listen.p.getX()),
                (int) Math.round(listen.p.getX()), 1, 1);
    }
}

class MyMouseListener implements MouseListener {

    Point p = new Point();

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("Mouse was clicked");
    }

    @Override
    public void mousePressed(MouseEvent e) {
        p = e.getPoint();
        System.out.println(p);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }
}

编辑: 其实我觉得我发现了错误。 JPanel有它的paint方法,当删除时允许Jframe显示面板。但是我需要能够在JPanel上绘制内容。

5 个答案:

答案 0 :(得分:4)

super.paintComponent(g);

建议:

1)你正在制造不必要的复杂事物。 例如关闭窗口你应该使用

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

而不是调用System.exit(0);并使用窗口侦听器

2)正如@mKorbel所说,你应该使用SwingUtilities.invokeLater启动你的gui,因为Java GUI应该在EDT(事件调度线程)上运行,不应该在主线程上运行。

答案 1 :(得分:2)

1)super.paintComponents(g);里面paint()可能是

public void paintComponent(Graphics g) {
    super.paintComponent(g);

    ....
}

2)不要设置任何大小setSize(500,500);或setPreferredSize(new Dimension(300, 300));,使用pack()然后(取消注释)setVisible(true)用于JFrame,并覆盖getPreferredSize()的{​​{1}}

3)JPanel内的MyGui gui=new MyGui();应该包含在public static void main(String []a){中,更多请参见invokeLater

答案 2 :(得分:0)

您是否尝试设置布局管理器并将面板添加到contentPane而不是JFrame本身?

getContentPane().setLayout(new BorderLayout());
getContentPane().add(panel, BorderLayout.WEST);

答案 3 :(得分:0)

框架的默认布局管理器为FlowLayout而不是BorderLayout。在setLayout(new BorderLayout())构造函数中尝试MyGui

答案 4 :(得分:0)

您未将布局设置为内容窗格。尝试类似getContentPane.setLayout(new Layout())

的内容

查看oracle文档以获取有关布局管理器的详细信息:http://docs.oracle.com/javase/tutorial/uiswing/layout/layoutlist.html

希望这会有所帮助