JPanel中的隐形JButton

时间:2014-04-11 20:26:37

标签: java swing jpanel jbutton null-layout-manager

这是我的JPanel。第一个按钮始终可见,但仅当您在其上放置一个光标时,才能看到该条纹。问题出在哪里?

P.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);
    }
}

2 个答案:

答案 0 :(得分:5)

  1. 不要使用空布局
  2. 不要在绘画方法中创建组件。 paint()方法仅用于自定义绘制。您无需覆盖paint()方法。
  3. 阅读Swing教程How to Use FlowLayout中的部分,了解使用按钮和布局管理器的简单示例。

答案 1 :(得分:5)

如果您想避免出现问题并正确学习Java Swing,请查看他们的教程here

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

  1. 您正在使用null布局。大多数情况下都避免使用null布局,因为通常会有一个布局完全符合您的要求。它需要一些时间才能运行,但有一些默认值in this tutorial使用起来相当简单。那里有一些漂亮的图片,向您展示您可以对每个布局做些什么。如果您使用布局管理器,通常不需要在JButton等大多数组件上使用setLocation, setSizesetVisible

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

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

  4. Java中有两种基本类型的GUI。一个是Swing和。{     另一个是Awt。查看this answer on 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
    
            }
        }
    
    }