0

嗨看看这段代码:package arkanoid;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.event.*;

public class Arkanoid extends JFrame 
{
private static final long serialVersionUID = 6253310598075887445L;
static JFrame frame;


static class Action1 implements ActionListener {        
      public void actionPerformed (ActionEvent e) {     
        //frame = new JFrame("Arkanoid");
        frame.setLocationRelativeTo(null);
        frame.setIgnoreRepaint(true);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setSize(500,400);
        frame.add(new Gra());
      }
    }   
    static class Action2 implements ActionListener {        
      public void actionPerformed (ActionEvent e) {     
          frame.dispose();
          System.exit(0);
      }
} 
public static void main(String[] args) 
{
    //new Arkanoid();
      frame = new JFrame("Arkanoid");
      frame.setSize(500,400);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setTitle("Arkanoid BETA");
      frame.setLocationRelativeTo(null);
      frame.setIgnoreRepaint(true);
      frame.setResizable(false);
      frame.setVisible(true);
      JPanel panel = new JPanel();
      frame.add(panel);

      JButton button = new JButton("Nowa Gra");
      panel.add(button);
      button.addActionListener (new Action1());

      JButton button2 = new JButton("Wyjscie");
      panel.add(button2);
      button2.addActionListener (new Action2());
}
}

这段代码几乎可以工作,我想让 button2 成为一个退出按钮,就像右上角框架图标中的 X 按钮一样,并且 button1 需要在同一个窗口中打开一个 Gra()。当我这样做时,它不能正常工作:/我需要在 button1 上单击 2 次才能转到 Gra(),还有什么是 Gra() 中的 KeyListeners 不能正常工作:(我是 Java 中按钮、框架和面板的新手,所以请帮忙处理这段代码。请更正它。

4

3 回答 3

3

您的代码存在许多基本问题,其中最少的是您button1需要 2 次点击的原因。

但是,对于您的问题,您应该尝试重新排列button1侦听器的顺序,以便首先将您Component添加到框架中,然后再将其设置为可见。一个应该工作的例子:

static class Action1 implements ActionListener {        
     public void actionPerformed (ActionEvent e) {   
        frame.add(new Gra());
        frame.revalidate();
     }
}   

请注意,您已经设置了 in 的大小、位置等framemain因此每次单击按钮时都无需再次设置它们。

我强调您的代码存在比这个问题更重要的问题。您应该查看 Java 的修饰符类型(static此处似乎不适用),以及诸如继承之类的面向对象的概念(您将Arkanoid类定义为扩展JFrame,但将JFrame对象作为类变量)。

于 2013-05-29T22:36:23.250 回答
2

我想让一个按钮2成为一个退出按钮,就像右上角框架中的X按钮一样

您可以使用关闭应用程序ExitAction中的类。

有关如何使用按钮的其他示例,请阅读有关如何使用按钮的 Swing 教程。这是所有 Swing 相关问题的起点。

于 2013-05-30T00:25:43.353 回答
1

你的代码有很多问题。我已经对其进行了一些重构。使用下面的代码和@ricky116 的答案,我认为您应该得到所有这些。

import javax.swing.*;
import java.awt.Color;
import java.awt.event.*;

public class Arkanoid extends JFrame 
{
    public Arkanoid() {
        super("Arkanoid");
        setSize(500,400);
        setTitle("Arkanoid BETA");
        setLocationRelativeTo(null);
        setResizable(false);

        final JPanel panel = new JPanel();
        setContentPane(panel);

        panel.add(new JButton(new AbstractAction("Nowa Gra") {
            public void actionPerformed (ActionEvent e) {     
              panel.removeAll();
              panel.add(new Gra());
              panel.revalidate();
              panel.repaint();
            }
        });

        panel.add(new JButton(new AbstractAction("Wyjscie") {
            public void actionPerformed (ActionEvent e) {     
                Arkanoid.this.setVisible(false);
            }
        });
    }

    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
              Arkanoid frame = new Arkanoid();
              frame.setVisible(true);
            }
        });
    }
}
于 2013-05-29T22:47:28.847 回答