JPanel中不可见的JButton



这是我的JPanel。第一个按钮总是可见的,但第二个按钮只有当你在上面放了一个cursour时才可见。问题出在哪里?

第页。S.如果可以的话,请用简单的英语,因为我的英语说得不好

public class GamePanel extends JPanel implements KeyListener{

GamePanel(){
    setLayout(null);
}
public void paint(Graphics g){
    JButton buttonShip1 = new JButton();
    buttonShip1.setLocation(10, 45);
    buttonShip1.setSize(40, 40);
    buttonShip1.setVisible(true);
    add(buttonShip1);
    JButton buttonShip2 = new JButton();
    buttonShip2.setLocation(110, 145);
    buttonShip2.setSize(440, 440);
    buttonShip2.setVisible(true);
    add(buttonShip2);
    }
}

如果你想避免问题并正确学习JavaSwing,请在这里查看他们的教程。

这里有太多的问题要讨论,所以我尽量保持简单。

  1. 您使用的是null布局。null布局在很大程度上是避免的,因为通常有一个布局可以满足您的需求。它需要一些时间才能正常工作,但本教程中有一些默认值使用起来相当简单。那里有一些不错的图片,向你展示了你可以对每种布局做些什么。如果使用布局管理器,通常不需要在JButtons等大多数组件上使用setLocation, setSizesetVisible

  2. 您正在Swing应用程序中调用paint方法。您之所以要调用paintComponent,是因为您使用的是Swing而不是Awt。您还需要在paintComponent方法的第一行调用super.paintComponent(g)方法,以便正确覆盖其他paintComponent方法。

  3. paint/paintComponent相关的方法经常被调用。您不希望在其中创建/初始化对象。paint/paintComponent方法并不像听起来那样是一次性方法。它们不断被调用,您应该围绕这一点来设计GUI。将与paint相关的方法设计为事件驱动,而不是顺序。换句话说,编程paintComponent方法的心态是,GUI对事物的反应是连续的,而不是像正常程序那样按顺序运行这是一个非常基本的方法,希望不会让你感到困惑,但如果你去看看教程,你最终会明白我的意思。

Java中有两种基本类型的GUI。一个是Swing和另一个是CCD_ 18。在stackoverflow上查看此答案对两人的描述很好。

下面是一个JPanel上的两个按钮的示例。

public class Test 
{
    public static void main(String[] args) 
    {
        JFrame jframe = new JFrame();
        GamePanel gp = new GamePanel();
        jframe.setContentPane(gp);
        jframe.setVisible(true);
        jframe.setSize(500,500);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static class GamePanel extends JPanel{
    GamePanel() {
        JButton buttonShip1 = new JButton("Button number 1");
        JButton buttonShip2 = new JButton("Button number 2");
        add(buttonShip1);
        add(buttonShip2);
        //setLayout(null);
        //if you don't use a layout manager and don't set it to null
        //it will automatically set it to a FlowLayout.
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        // ... add stuff here later
            // when you've read more about Swing and
            // painting in Swing applications
        }
    }
}
  1. 不要使用空布局
  2. 不要在绘制方法中创建零部件。paint()方法仅用于自定义绘制。您不需要重写paint()方法

阅读Swing教程如何使用FlowLayout中的一节,了解一个使用按钮和布局管理器的简单示例。

相关内容

  • 没有找到相关文章

最新更新