2015-04-02 2 views
0

Я пытаюсь создать главное меню для игры в настольную игру. Есть пользовательское фоновое изображение, и в идеале я хотел бы, чтобы кнопки отображались над изображением. Однако, когда я запускаю свой код, появляется только кнопка с названием «Новая игра», а остальные кнопки отображаются, если вы наводите на них курсор мыши. Я пробовал практически все (здесь есть похожие проблемы), но, похоже, не может решить проблему. Может быть, это как-то связано с моим кодом? Я ценю любую помощь/предложения!JButtons нарисовано изображением

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(); 


} 

}

ответ

2

компонента живопись не всегда уведомляет родительские или дочерние компоненты. Вместо того, чтобы переопределять paint, попробуйте переопределить paintComponent и нарисуйте свой фон там, вот что paintComponent действительно предназначен для рисования фона.

Вы должны избегать переопределения paint контейнеров верхнего уровня.
Большинство контейнеров верхнего уровня имеют ряд слоев, в том числе JRootPane, contentPane и даже glassPane, каждый из которых будет красить верхнюю часть рамки.

Вместо этого создайте пользовательский компонент, который простирается от чего-то вроде JPanel и использует его в качестве базового компонента. Вы можете переопределить его paintComponent и нарисовать фон внутри него. Затем добавьте этот компонент в свой фрейм, возможно, даже сделав его панель содержимого.

Помните, что если компонент является непрозрачным, он будет охватывать все дочерние компоненты

Вы также должны избегать загрузки ресурсов из любого метода краски (особенно постоянно перезаряжать их), поскольку это может иметь служить влияет на производительность вашей программы. Живопись должна рисоваться так быстро, как только может.

Для example и example

+0

ОП использует 'JFrame', хотя. – johnchen902

+0

Если я пытаюсь использовать paintComponent, это дает мне ошибку «Метод paintComponent (Graphics) типа Menu должен переопределять или реализовывать метод супертипа« так что если я делаю super.paintComponent (g), который дает мне ошибку «Метод paintComponent (Графика) не определена для типа JFrame ", потому что я использовал JFrame, как указано в @ johnchen902. – user2938241

+0

@ johnchen902 Еще хуже, проверьте обновление – MadProgrammer

Смежные вопросы