简体   繁体   English

JButton由图像绘制

[英]JButtons are painted over by an image

I'm trying to make a main menu for the board game risk. 我正在尝试制作棋盘游戏风险的主菜单。 There's a custom background image, and ideally I would like the buttons to appear over the image. 有一个自定义的背景图片,理想情况下,我希望按钮显示在图片上方。 However when I run my code, only the button called "New Game" appears, and the other buttons will appear if you hover the mouse over them. 但是,当我运行代码时,仅会出现一个名为“ New Game”的按钮,而如果将鼠标悬停在其他按钮上,则会出现其他按钮。 I have tried just about everything (there are similar problems on here) but can't seem to fix the problem. 我已经尝试了几乎所有内容(此处存在类似的问题),但似乎无法解决问题。 Maybe it has something to do with my code? 也许与我的代码有关? I appreciate any help/suggestions! 感谢您的帮助/建议!

package View;


import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.SpringLayout;

/**
* These classes set up the GUI of the Risk program.
* The main menu, dialog for setting player count, dialog for name/color       settings for each 
 * player, the Risk game board, and a menu used during a Risk game session are    included.

 **/
public class Menu extends JFrame {  

    private JPanel mainPanel;


    private JButton newGameButton;
    private JButton loadGameButton;
    private JButton quitButton;
    private JButton ruleButton;

    private String newGameButtonName = "newGameBtn";
    private String loadGameButtonName = "loadGameBtn";
    private String quitButtonName = "quitBtn";
    private String ruleButtonName = "rulebtn";

    //private SpringLayout mainLayout;
     private static BufferedImage img;

    /**
     * Constructs the main menu.
     **/
    public Menu() 
    {
        add( mainMenu( ) );
        //setTitle("Risk: UConn Edition");
        setPreferredSize(new Dimension(640, 700));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);



        toFront();
        pack();

        setVisible(true);


    }

    /**
     * creates the buttons for the jPanel
     * 
     * @return
     */
    private JPanel mainMenu()
    {
        // Creates the panel
        mainPanel = new JPanel();
        // Sets Layout
        //mainLayout = new SpringLayout();
       mainPanel.setLayout(null);

        // Creates buttons
        newGameButton = new JButton("New Game");
        newGameButton.setBounds(20,300,150,50);
        newGameButton.setOpaque(false);
        newGameButton.setContentAreaFilled(false);
        newGameButton.setForeground(Color.RED);
        newGameButton.setBackground(Color.BLUE);

        loadGameButton = new JButton("Load Game");
        loadGameButton.setBounds(20,400,150,50);
        //loadGameButton.setOpaque(false);
        //loadGameButton.setContentAreaFilled(false);
        loadGameButton.setForeground(Color.RED);

        quitButton = new JButton("Quit");
        quitButton.setBounds(490,400,150,50);
        quitButton.setOpaque(false);
        quitButton.setContentAreaFilled(false);
        quitButton.setForeground(Color.RED);

        ruleButton = new JButton("Rules");
        ruleButton.setBounds(490,300,150,50);
        ruleButton.setOpaque(false);
        ruleButton.setContentAreaFilled(false);
        ruleButton.setForeground(Color.RED);

        // Sets button commands
        newGameButton.setActionCommand(newGameButtonName);
        loadGameButton.setActionCommand(loadGameButtonName);
        quitButton.setActionCommand(quitButtonName);

        // Adds buttons to mainPanel
        mainPanel.add(newGameButton);
        mainPanel.add(loadGameButton);
        mainPanel.add(quitButton);
        mainPanel.add(ruleButton);
    //  add(mainPanel);

        return mainPanel;
    }
    private Image createImage(){
        try {
            img = ImageIO.read(
                    Menu.class.getResource("../resource/riskUconn.jpg"));


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return img;
      }
    /**
     * paint method
     */
    @Override
    public void paint (Graphics g)  {

        Image img = createImage();
        g.drawImage(img, 20,20,this);
        super.paint(g);


      }


    // Action listeners for Menu
    protected void riskViewActionListeners(ActionListener evt)
    {
        newGameButton.addActionListener(evt);
        loadGameButton.addActionListener(evt);
        quitButton.addActionListener(evt);
    }



    public static void main(String [] args){
        Menu m = new Menu();


    }
}

Painting components doesn't always notify the parent or child components. 绘画组件并不总是通知父组件或子组件。 Instead of overriding paint , try overriding paintComponent and paint your background there, this is what paintComponent is really meant for, painting the background. 代替覆盖paint ,尝试覆盖paintComponent并在那里绘制背景,这是paintComponent真正的目的,就是绘制背景。

You should avoid overriding paint of top level containers. 您应该避免覆盖顶层容器的paint
Most top level containers have a series of layers, including the JRootPane , contentPane and even a glassPane , all of which will paint over the top of the a frame. 大多数顶级容器都有一系列的层,包括JRootPanecontentPane甚至是glassPane ,所有这些层都将在框架的顶部绘制。

Instead, create a custom component, which extends from something like JPanel and use it as you base component. 而是创建一个自定义组件,该组件从JPanel类扩展而来,并将其用作基础组件。 You can override it's paintComponent and paint the background within it. 您可以覆盖它的paintComponent并在其中绘制背景。 Then add this component to your frame, maybe even making it the content pane. 然后将此组件添加到您的框架中,甚至可以使其成为内容窗格。

Remember, if a component is opaque, it will cover any child components 请记住,如果组件是不透明的,它将覆盖所有子组件

You should also avoid loading resources from within any paint method (especially continuously reloading them) as this can have a serve affect on the performance of your program. 您还应避免从任何绘画方法中加载资源(尤其是连续不断地重新加载资源),因为这可能会对程序的性能产生影响。 Painting should paint as fast as it can. 绘画应尽可能快地绘画。

For example and example 举个 例子

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM