按JButton时绘制矩形

时间:2017-01-25 23:47:53

标签: java swing

我目前正在开发一款小游戏,但我遇到了一个问题:

我有三个类,第一个是JFrame:

public class Game 
{

    public static void main(String[] args)
    {
        new Game().gui();
    }


    public void gui()
    {
        DrawPanel panel = new DrawPanel();
        JFrame frame = new JFrame("Test");
        //frame.add(panel); 
        frame.add(new MainMenu());
        frame.setSize(800, 700);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
    }
}

现在我有另外两个类,一个是mainMenu,目前只包含一个JButton。 我决定将菜单设为自己的类,因为后来我想通过按下escape来调用菜单,但问题是(出于测试原因)我想在" start"被压了。我尝试了不同的方法但没有任何反应。

public class MainMenu extends JPanel implements ActionListener
{

     GamePanel panel = new GamePanel();

     public MainMenu()
     {

         setLayout(new GridBagLayout());
         GridBagConstraints c = new GridBagConstraints();

         JButton b1 = new JButton("Start");
         c.fill = GridBagConstraints.HORIZONTAL;
         c.ipadx = 200;

         b1.addActionListener(new ActionListener()
         {
            @Override
            public void actionPerformed(ActionEvent e) {
                setVisible(false);
            }
         });
         add(b1, c);

     }

}


public class DrawPanel extends JPanel
{

     public void paint(Graphics g) 
          {
            g.drawRect (10, 10, 200, 200);  
          }

}

1 个答案:

答案 0 :(得分:1)

我在您的代码中发现了一些错误:

  1. 您没有将DrawPanel添加到任何内容中,因为此行

    frame.add(panel); 
    

    被评论,因此,这导致我们遇到下一个问题:

  2. 您将覆盖paint()方法,而不是paintComponent(),也不要忘记致电

    super.paintComponent();
    

    在方法的最开始。没有它,您将阻止您的代码继续绘制其余组件。请参阅Custom painting in Swing

  3. 由于您尚未为DrawPanel宣布某个位置,因此它仍然没有显示任何内容,因此它正在使用JFrame的默认Layout Manager,即CENTER 3}}并且未指定的默认位置为new MainMenu(),当您在同一位置添加DrawPanel时,它会替换DrawPanel面板,因为只有一个组件可以存在在同一个位置上。

    而是尝试将CENTER放置到MainMenu,将SOUTH放置到main。它现在应该是这样的:

    BorderLayout

  4. 请务必按照以下方式编写public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { //Your constructor here } }); } 方法,将程序放在enter image description here上:

    ActionListener
  5. 您正在MainMenu上实施actionPerformed但未实施其方法,将其删除或实施b1方法并将代码移至MainMenu操作中倾听它。不过,我强烈建议您同时参加Event Dispatch Thread (EDT)

  6. 您正在使用JPanel的{​​{1}}展示率,而应尝试使用Should your class implement ActionListener or use an object of an anonymous ActionListener class或考虑使用CardLayout

    例如,我会创建一个JDialog并将JButton放在那里,这样就会打开JFrame并在其中绘制Rectangle

    < / LI>

    现在,产生上述输出并遵循所有建议(但#6)的代码是:

    import java.awt.BorderLayout;
    import java.awt.Graphics;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class Game {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new Game().gui();
                }
            });
        }
    
        public void gui() {
            DrawPanel panel = new DrawPanel();
            JFrame frame = new JFrame("Test");
            frame.add(panel, BorderLayout.CENTER);
            frame.add(new MainMenu(), BorderLayout.SOUTH);
            frame.setSize(400, 300);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setResizable(false);
        }
    }
    
    class MainMenu extends JPanel  {
    
    //  GamePanel panel = new GamePanel();
    
        public MainMenu() {
    
            setLayout(new GridBagLayout());
            GridBagConstraints c = new GridBagConstraints();
    
            JButton b1 = new JButton("Start");
            c.fill = GridBagConstraints.HORIZONTAL;
            c.ipadx = 200;
    
            b1.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    setVisible(false);
                }
            });
            add(b1, c);
        }
    }
    
    class DrawPanel extends JPanel {
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawRect(10, 10, 200, 200);
        }
    }
    

    根据@MadProgrammer的评论中的建议,您还可以覆盖getPreferredSize()的{​​{1}}方法,然后拨打DrawPanel

    您的frame.pack()课程现在应该如下所示:

    DrawPanel