簡體   English   中英

將JPanel添加到JFrame

[英]Adding a JPanel into JFrame

我有一個擴展JFrame BoardGUI類。 我在JPanel添加了按鈕。 當我嘗試將面板添加到框架中並在其上使用mouselistoner時,按鈕(撤消和重播)變得不可見。 當我將鼠標懸停在按鈕上時,它們變為可見。

這是我的代碼:

public class BoardGUI extends JFrame {
    JButton a=new JButton("Undo");
    JButton r=new JButton("replay");
    JPanel jp=new JPanel();

    public BoardGUI() {

        // TODO Auto-generated constructor stub
        setTitle("Checkers Game");
        setSize(645, 700);

        jp.setLayout(new FlowLayout());
        jp.setPreferredSize(new Dimension(645,35));
        a.setVisible(true);
        r.setVisible(true);
        jp.add(a);
        jp.add(r);
        add(jp,BorderLayout.SOUTH);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseExited(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent arg0) {
                // TODO Auto-generated method stub
                repaint();

            }
        });


    }
    public void paint(Graphics g)
    {
        for(int i=0;i<8;i++)
        {
            for(int j=0;j<8;j++)
            {
                g.fillRect(i*100, j*100, 100, 100);
            }
        }
    }
}

有人可以幫我解決這個問題嗎?

  • JPanel重寫getPreferredSize ,然后調用JFrame.pack()而不是任何大小調整

  • 不要設置PreferredSize

  • 不要為JFrame覆蓋paint ,為(另一個,單獨的) JPanel覆蓋paintComponent ,將此JPanel放在JFrames CENTER area

。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BoardGUI extends JFrame {

   private JButton a = new JButton("Undo");
   private  JButton r = new JButton("replay");
   private  JPanel jp = new JPanel();

    public BoardGUI() {
        setTitle("Checkers Game");
        jp.setLayout(new FlowLayout());
        jp = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(new Dimension(645, 35));
            }

           /* @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                //
            }*/
        };
        jp.add(a);
        jp.add(r);
        add(jp, BorderLayout.SOUTH);
        pack();
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String args[]) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new BoardGUI();
            }
        });
    }
}

您有一個645 x 700 JFrame,在其上繪制了800 x 800棋盤格。 可能是覆蓋了按鈕。

將棋盤格放置在其自己的JPanel中,並僅在該面板內繪制。 將該面板放在JFrame的中心。

不使用:

a.setVisible(true);
r.setVisible(true);

無需使用它。 使用setVisible(true)使框架可見時,將繪制所有組件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM