JButton只显示鼠标悬停

时间:2013-01-21 01:12:45

标签: java image swing background jbutton

我正在制作“Tron”游戏,而对于我的菜单,我使用绘画方法为菜单绘制背景。一切都很好,除了3个JButton“隐藏”在背景后面,直到我把鼠标放在它上面然后它出现。如果有办法让按钮保持可见,我将不胜感激!

我的代码:

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Menu extends JFrame {
    private static final long serialVersionUID = 1L;
    String name;
    Image bk;
    public Menu() {
        super("TRON");
        // Set the size of window
        setSize(800, 800);
        // Set the default operation for the window
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        // Set a background
        ImageIcon ibk = new ImageIcon("background.jpg");
        bk = ibk.getImage();
        // Set a new panel
        JPanel p = new JPanel(new GridBagLayout());
        // Make buttons!
        JButton b = new JButton("Play!");
        JButton b2 = new JButton("High Scores");
        JButton b3 = new JButton("Exit");
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new GameFrame();
            }
        });
        b2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new hsview();
            }
        });
        b3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        // Set the GridBagConstraints to organize the layout
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets (15, 15, 15, 15);
        // Use gbc to space out each button
        gbc.gridx = (0);
        gbc.gridy = (0);
        // Add them to the panel then to JFrame
        p.add(b, gbc);
        gbc.gridx = (0);
        gbc.gridy = (1);
        p.add(b2, gbc);
        gbc.gridx = (0);
        gbc.gridy = (2);
        p.add(b3, gbc);
        // Add to the frame at the bottom
        add(p, BorderLayout.SOUTH);
    }
    // Background stuff
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawImage(bk, 0, 0, null);
    }
}

2 个答案:

答案 0 :(得分:2)

Swing使用“分层”概念进行绘画......

paint来电paintComponentpaintBorderpaintChildren。通过覆盖paint并且无法调用super.paint,您已阻止组件绘制各个图层。

在Swing中,最好使用paintComponent来提供自定义绘制,这允许您在可能添加到组件的任何其他组件下面绘制。

enter image description here

public class TestPaint01 {

  public static void main(String[] args) {
    new TestPaint01();
  }

  public TestPaint01() {
    EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        try {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception ex) {
        }

        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TestPane());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

      }
    });
  }

  public class TestPane extends JPanel {

    private Image backgroundImage;

    public TestPane() {
      try {
        BufferedImage background = ImageIO.read(new File("/path/to/image.jpg"));
        //backgroundImage = background.getScaledInstance(-1, background.getHeight() / 4, Image.SCALE_SMOOTH);
        backgroundImage = background;
      } catch (IOException ex) {
        ex.printStackTrace();
      }
      setLayout(new GridBagLayout());
      add(new JButton("Hello"));
    }

    @Override
    public Dimension getPreferredSize() {
      return backgroundImage == null ? super.getPreferredSize() : new Dimension(backgroundImage.getWidth(this), backgroundImage.getHeight(this));
    }

    @Override
    protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      int x = (getWidth() - backgroundImage.getWidth(this)) / 2;
      int y = (getHeight() - backgroundImage.getHeight(this)) / 2;
      g.drawImage(backgroundImage, x, y, this);
    }

  }

}

您可能会发现A Closer look at the Paint MechanismPainting in AWT and Swing信息丰富。

答案 1 :(得分:0)

我认为您需要为您的框架调用pack()方法和此显示。我认为pack()方法会将您的组件设置为显示。

以下列出了JFrame教程的步骤。

How to Make Frames

//1. Create the frame.
JFrame frame = new JFrame("FrameDemo");

//2. Optional: What happens when the frame closes?
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//3. Create components and put them in the frame.
//...create emptyLabel...
frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);

//4. Size the frame.
frame.pack();

//5. Show it.
frame.setVisible(true);
相关问题