我有一个程序,基本上应该是一些游戏的标题屏幕。背景是一个 GIF(我不确定这是否会导致问题),我需要一些 JButtons
来让我运行实际的游戏。问题是 JButton
有时只在我将鼠标悬停在它上面时显示(并且是瞬间),否则它是不可见的。它工作得很好,进入游戏等等,它只是隐形的。
我已经尝试查看问题是否出在我使用 GIF 以及 paintComponent()
方法这一事实上,但是,当我使用时它并没有出现使用了 JPEG。
代码如下:
public class TestingGrounds extends JFrame{
//declarations
JButton snakeButton;
JPanel snakeButtonPanel;
JFrame window;
Container con;
TitleScreenHandler tsHandler = new TitleScreenHandler();
//constructor
public TestingGrounds(){
//main JFrame
window = new JFrame("Title Screen");
window.add(new ImagePanel());
window.setResizable(false);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setSize(1831, 1030);
window.setVisible(true);
window.setLocationRelativeTo(null);
window.setLayout(null);
con = window.getContentPane();
//panel for the button to go to the snake game
snakeButtonPanel = new JPanel();
snakeButtonPanel.setBounds(100,100,600,150);
//button to go to snake game
snakeButton = new JButton("Snake");
snakeButton.setBackground(Color.BLACK);
snakeButton.setForeground(Color.WHITE);
snakeButton.setFont(new Font("Times New Roman", Font.ITALIC, 30));
snakeButton.addActionListener(tsHandler);
snakeButton.setFocusPainted(false);
//adding button to panel
snakeButtonPanel.add(snakeButton);
//adding panel to container
con.add(snakeButtonPanel);
//setting the panel as visible
snakeButtonPanel.setVisible(true);
}
//main method for running constructor
public static void main(String[] args) {
new TestingGrounds();
}
//what to do if the button is pressed
public class TitleScreenHandler implements ActionListener {
public void actionPerformed(ActionEvent event){
//goes to main game screen if start button is pressed
new SnakeGame();
}
}
}
//class for using the gif
class ImagePanel extends JPanel {
Image image;
public ImagePanel() {
image = Toolkit.getDefaultToolkit().createImage("C:/Users/eklut/Desktop/Coding/ICS4U1/src/graphicsstuff/snek/source.gif");
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
}
抱歉,我知道代码量很大,但我觉得我必须展示所有代码,因为我不确定问题出在哪里。
我原以为按钮会显示在 gif 上,但它似乎恰恰相反
最佳答案
此 MCVE 包含如此多的更改,最好仔细阅读代码并查看注释。
请注意,代码使用动画 GIF 作为 BG。我会说这是用来明确证明它是 GIF,但事实是示例图像页面仅包含动画 GIF。考虑到 PNG 将支持半透明和比 GIF 更多的颜色,这种格式对其他任何东西都没有太大好处。
import java.awt.*;
import java.awt.event.*;
import java.net.MalformedURLException;
import javax.swing.*;
import java.net.URL;
//public class TestingGrounds extends JFrame {
public class TestingGrounds {
//declarations
JButton snakeButton;
JPanel snakeButtonPanel;
JFrame window;
TitleScreenHandler tsHandler = new TitleScreenHandler();
//constructor
public TestingGrounds() {
//main JFrame
window = new JFrame("Title Screen");
try {
JPanel imagePanel = new ImagePanel();
imagePanel.setLayout(new BorderLayout());
window.add(imagePanel);
//window.setResizable(false);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Don't guess sizes needed. They will be wrong on other
// PLAFs or platforms.
//window.setSize(850, 600);
// should be last
//window.setVisible(true);
window.setLocationRelativeTo(null);
//window.setLayout(null);
//con = window.getContentPane();
//panel for the button to go to the snake game
snakeButtonPanel = new JPanel(new GridBagLayout());
snakeButtonPanel.setOpaque(false);
//snakeButtonPanel.setBounds(100, 100, 600, 150);
//button to go to snake game
snakeButton = new JButton("Snake");
snakeButton.setMargin(new Insets(10,40,10,40));
snakeButton.setBackground(Color.BLACK);
snakeButton.setForeground(Color.WHITE);
snakeButton.setFont(new Font("Times New Roman", Font.ITALIC, 30));
snakeButton.addActionListener(tsHandler);
snakeButton.setFocusPainted(false);
//adding button to panel
snakeButtonPanel.add(snakeButton);
//adding panel to container
//con.add(snakeButtonPanel);
// Adding the container to imagePanel
imagePanel.add(snakeButtonPanel);
//setting the panel as visible
snakeButtonPanel.setVisible(true);
window.pack();
window.setVisible(true);
} catch (MalformedURLException ex) {
ex.printStackTrace();
}
}
//main method for running constructor
public static void main(String[] args) {
new TestingGrounds();
}
//what to do if the button is pressed
public class TitleScreenHandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
//goes to main game screen if start button is pressed
//new SnakeGame();
JOptionPane.showMessageDialog(snakeButton, "Snake Game");
}
}
}
//class for using the gif
class ImagePanel extends JPanel {
Image image;
public ImagePanel() throws MalformedURLException {
image = Toolkit.getDefaultToolkit().createImage(
new URL("/image/OtTIY.gif"));
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 1);
try {
mt.waitForAll();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
@Override
public Dimension getPreferredSize() {
// this allows us to pack() the window around the image
return (new Dimension(image.getWidth(this), image.getHeight(this)));
}
}
关于java - JButton 无法通过 GIF 正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56084084/