图形工件出现在 JPanel 中

Graphics artifacts appear here in JPanel

在我的自定义 JPanel 中出现图形伪影。我不知道为什么,因为我在我所有的定制画中都使用了 super.paintComponent() 。



  1. 这是创建时的样子。



2. 这是我点击升级按钮时的样子。




这是代码。



菜单


import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FontFormatException;
import java.awt.Graphics;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

import java.awt.GridBagLayout;

import javax.swing.JPanel;

import java.awt.GridBagConstraints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;


public class Menu {

    static JFrame frame;
    public static double scale = 1.5;
    private static int WIDTH = 300, HEIGHT = 400;
    public static Font fontTerminal;
    private JPanel menuPanel;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Menu window = new Menu();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     * @throws IOException 
     */
    public Menu() throws IOException {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     * @throws IOException 
     */
    private void initialize() throws IOException {
        fontTerminal = new Font("Consolas", 1, 1);
        try {
            fontTerminal = Font.createFont(Font.TRUETYPE_FONT, new File("res/terminal.ttf"));
        } catch (FontFormatException e1) {
            e1.printStackTrace();
        }  


        frame = new JFrame();
        frame.setResizable(false);
        frame.setBounds(100, 100, WIDTH, HEIGHT);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GridBagLayout gridBagLayout = new GridBagLayout();
        gridBagLayout.columnWidths = new int[]{0, 0};
        gridBagLayout.rowHeights = new int[]{0, 0};
        gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
        gridBagLayout.rowWeights = new double[]{1.0, Double.MIN_VALUE};
        frame.getContentPane().setLayout(gridBagLayout);

        menuPanel = new BackgroundPanel();
        menuPanel.setLayout(null);
        GridBagConstraints gbc_menuPanel = new GridBagConstraints();
        gbc_menuPanel.fill = GridBagConstraints.BOTH;
        gbc_menuPanel.gridx = 0;
        gbc_menuPanel.gridy = 0;
        frame.getContentPane().add(menuPanel, gbc_menuPanel);

        GameButton newgameButton = new GameButton();
        int ngButtWidth = 194, ngButtHeight = 71; 
        newgameButton.setBounds((frame.getWidth()/2) - (ngButtWidth/2), (frame.getHeight()/2) - (ngButtHeight/2), ngButtWidth, ngButtHeight);
        newgameButton.setBackground( new Color(0,0,0,0));
        menuPanel.add(newgameButton);
        newgameButton.setLayout(new BorderLayout(0, 0));

        JLabel newgameLbl = new GLabel("New Game", newgameButton, SwingConstants.CENTER);
        newgameLbl.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                GameWindow gp = new GameWindow();
                frame.setVisible(false);
            }
        });
        newgameLbl.setFont(fontTerminal.deriveFont(19f));
        newgameLbl.setForeground(new Color(0,0,0));
        newgameButton.add(newgameLbl, BorderLayout.CENTER);

        GameButton creditsButton = new GameButton();
        creditsButton.setBackground(new Color(0, 0, 0, 0));
        creditsButton.setBounds(56, 262, 194, 71);
        menuPanel.add(creditsButton);
        creditsButton.setLayout(new BorderLayout(0, 0));

        JLabel creditsLabel = new GLabel("Credits", creditsButton, SwingConstants.CENTER);
        creditsLabel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                Credits credits = new Credits();
                credits.setVisible(true);
            }
        });
        creditsLabel.setForeground(Color.BLACK);
        creditsLabel.setFont(null);
        creditsLabel.setBackground(new Color(0, 0, 0, 0));
        creditsLabel.setFont(fontTerminal.deriveFont(19f));
        creditsButton.add(creditsLabel);
    }
}


游戏窗口


    import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;









import javax.swing.UIManager.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.JPanel;

import java.awt.Insets;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JLabel;

import java.awt.GridLayout;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.JTabbedPane;

import net.miginfocom.swing.MigLayout;

import java.awt.FlowLayout;

import javax.swing.JTable;


public class GameWindow {

    private JFrame frame;
    private Font fontTerminal;
    private JPanel workerPanel1;
    private GProgressbar Bar1;
    private GameButton upgradeWorker1;
    private JLabel upgradeWorker1_1;
    private JPanel workerPanel2;
    private GProgressbar Bar2;
    private GameButton upgradeWorker2;
    private JPanel workerPanel3;
    private GProgressbar Bar3;
    private GameButton upgradeWorker3;
    private JPanel workerPanel4;
    private GProgressbar Bar4;
    private GameButton upgradeWorker4;
    private JPanel upgradesPanel;
    private JLabel upgradeWorker2_1;
    private JLabel upgradeWorker3_1;
    private JLabel upgradeWorker4_1;
    private JPanel specialPanel;
    private JPanel upgradesButton;
    private JTable table, table2;

    /**
     * Create the application.
     */
    public GameWindow() {
        initialize();
        this.frame.setVisible(true);
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            // If Nimbus is not available, you can set the GUI to another look and feel.
        }
        fontTerminal = Menu.fontTerminal;



        frame = new JFrame();
        frame.setResizable(false);
        frame.setBounds(100, 100, 306, 430);
        //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GridBagLayout gridBagLayout = new GridBagLayout();
        gridBagLayout.columnWidths = new int[]{0, 0};
        gridBagLayout.rowHeights = new int[]{0, 0};
        gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
        gridBagLayout.rowWeights = new double[]{1.0, Double.MIN_VALUE};
        frame.getContentPane().setLayout(gridBagLayout);

        frame.addWindowListener( new WindowAdapter() { 
            @Override
            public void windowClosing(WindowEvent e) {
                frame.setVisible(false);
                frame.dispose();
                Menu.frame.setVisible(true);
            }}); 

        GamePanel gamePanel = new GamePanel();
        gamePanel.setLayout(null);
        GridBagConstraints gbc_menuPanel = new GridBagConstraints();
        gbc_menuPanel.fill = GridBagConstraints.BOTH;
        gbc_menuPanel.gridx = 0;
        gbc_menuPanel.gridy = 0;
        frame.getContentPane().add(gamePanel, gbc_menuPanel);

                                upgradesPanel = new JPanel();
                                upgradesPanel.setBounds(23, 221, 253, 174);
                                upgradesPanel.setBackground(new Color(0,0,0,0));
                                gamePanel.add(upgradesPanel);

                                workerPanel1 = new JPanel();
                                workerPanel1.setBackground(new Color(0,0,0,0));
                                GridBagLayout gbl_workerPanel1 = new GridBagLayout();
                                gbl_workerPanel1.columnWidths = new int[]{119, 118, 0};
                                gbl_workerPanel1.rowHeights = new int[]{36, 0};
                                gbl_workerPanel1.columnWeights = new double[]{0.0, 0.0, Double.MIN_VALUE};
                                gbl_workerPanel1.rowWeights = new double[]{0.0, Double.MIN_VALUE};
                                workerPanel1.setLayout(gbl_workerPanel1);

                                        Bar1 = new GProgressbar();
                                        Bar1.setStringPainted(true);
                                        GridBagConstraints gbc_Bar1 = new GridBagConstraints();
                                        gbc_Bar1.fill = GridBagConstraints.BOTH;
                                        gbc_Bar1.insets = new Insets(0, 0, 0, 5);
                                        gbc_Bar1.gridx = 0;
                                        gbc_Bar1.gridy = 0;
                                        workerPanel1.add(Bar1, gbc_Bar1);

                                        upgradeWorker1 = new GameButton();
                                        GridBagConstraints gbc_upgradeWorker1 = new GridBagConstraints();
                                        gbc_upgradeWorker1.fill = GridBagConstraints.BOTH;
                                        gbc_upgradeWorker1.gridx = 1;
                                        gbc_upgradeWorker1.gridy = 0;
                                        workerPanel1.add(upgradeWorker1, gbc_upgradeWorker1);

                                        upgradeWorker1_1 = new GLabel("Upgrade", upgradeWorker1, SwingConstants.CENTER);
                                        upgradeWorker1_1.addMouseListener(new MouseAdapter() {
                                            @Override
                                            public void mouseClicked(MouseEvent e) {
                                                //upgrade worker 1
                                            }
                                        });
                                        upgradeWorker1.setLayout(new BorderLayout(0, 0));
                                        upgradeWorker1_1.setForeground(new Color(0,0,0));
                                        upgradeWorker1.add(upgradeWorker1_1);

                                workerPanel2 = new JPanel();
                                workerPanel2.setBackground(new Color(0, 0, 0, 0));
                                GridBagLayout gbl_panel = new GridBagLayout();
                                gbl_panel.columnWidths = new int[]{119, 118, 0};
                                gbl_panel.rowHeights = new int[]{36, 0};
                                gbl_panel.columnWeights = new double[]{0.0, 0.0, Double.MIN_VALUE};
                                gbl_panel.rowWeights = new double[]{0.0, Double.MIN_VALUE};
                                workerPanel2.setLayout(gbl_panel);


                                Bar2 = new GProgressbar();
                                Bar2.setStringPainted(true);
                                GridBagConstraints gbc_Bar2 = new GridBagConstraints();
                                gbc_Bar2.fill = GridBagConstraints.BOTH;
                                gbc_Bar2.insets = new Insets(0, 0, 0, 5);
                                gbc_Bar2.gridx = 0;
                                gbc_Bar2.gridy = 0;
                                workerPanel2.add(Bar2, gbc_Bar2);

                                upgradeWorker2 = new GameButton();
                                GridBagConstraints gbc_upgradeWorker2 = new GridBagConstraints();
                                gbc_upgradeWorker2.fill = GridBagConstraints.BOTH;
                                gbc_upgradeWorker2.gridx = 1;
                                gbc_upgradeWorker2.gridy = 0;
                                workerPanel2.add(upgradeWorker2, gbc_upgradeWorker2);
                                upgradeWorker2.setLayout(new BorderLayout(0, 0));

                                upgradeWorker2_1 = new GLabel("Upgrade", upgradeWorker2, SwingConstants.CENTER);
                                upgradeWorker2_1.setForeground(Color.BLACK);
                                upgradeWorker2_1.addMouseListener(new MouseAdapter() {
                                    @Override
                                    public void mouseClicked(MouseEvent e) {
                                        //upgrade worker 2
                                    }
                                });
                                upgradeWorker2.setLayout(new BorderLayout(0, 0));
                                upgradeWorker2_1.setFont(fontTerminal.deriveFont(15f));
                                upgradeWorker2.add(upgradeWorker2_1);

                                workerPanel3 = new JPanel();
                                workerPanel3.setBackground(new Color(0, 0, 0, 0));
                                GridBagLayout gbl_workerPanel3 = new GridBagLayout();
                                gbl_workerPanel3.columnWidths = new int[]{119, 118, 0};
                                gbl_workerPanel3.rowHeights = new int[]{36, 0};
                                gbl_workerPanel3.columnWeights = new double[]{0.0, 0.0, Double.MIN_VALUE};
                                gbl_workerPanel3.rowWeights = new double[]{0.0, Double.MIN_VALUE};
                                workerPanel3.setLayout(gbl_workerPanel3);

                                Bar3 = new GProgressbar();
                                Bar3.setStringPainted(true);
                                GridBagConstraints gbc_Bar3 = new GridBagConstraints();
                                gbc_Bar3.fill = GridBagConstraints.BOTH;
                                gbc_Bar3.insets = new Insets(0, 0, 0, 5);
                                gbc_Bar3.gridx = 0;
                                gbc_Bar3.gridy = 0;
                                workerPanel3.add(Bar3, gbc_Bar3);

                                upgradeWorker3 = new GameButton();
                                GridBagConstraints gbc_upgradeWorker3 = new GridBagConstraints();
                                gbc_upgradeWorker3.fill = GridBagConstraints.BOTH;
                                gbc_upgradeWorker3.gridx = 1;
                                gbc_upgradeWorker3.gridy = 0;
                                workerPanel3.add(upgradeWorker3, gbc_upgradeWorker3);
                                upgradeWorker3.setLayout(new BorderLayout(0, 0));

                                upgradeWorker3_1 = new GLabel("Upgrade", upgradeWorker3, SwingConstants.CENTER);
                                upgradeWorker3.add(upgradeWorker3_1);

                                workerPanel4 = new JPanel();
                                workerPanel4.setBackground(new Color(0, 0, 0, 0));
                                GridBagLayout gbl_workerPanel4 = new GridBagLayout();
                                gbl_workerPanel4.columnWidths = new int[]{119, 118, 0};
                                gbl_workerPanel4.rowHeights = new int[]{36, 0};
                                gbl_workerPanel4.columnWeights = new double[]{0.0, 0.0, Double.MIN_VALUE};
                                gbl_workerPanel4.rowWeights = new double[]{0.0, Double.MIN_VALUE};
                                workerPanel4.setLayout(gbl_workerPanel4);

                                Bar4 = new GProgressbar();
                                Bar4.setStringPainted(true);
                                GridBagConstraints gbc_Bar4 = new GridBagConstraints();
                                gbc_Bar4.fill = GridBagConstraints.BOTH;
                                gbc_Bar4.insets = new Insets(0, 0, 0, 5);
                                gbc_Bar4.gridx = 0;
                                gbc_Bar4.gridy = 0;
                                workerPanel4.add(Bar4, gbc_Bar4);

                                upgradeWorker4 = new GameButton();
                                GridBagConstraints gbc_upgradeWorker4 = new GridBagConstraints();
                                gbc_upgradeWorker4.fill = GridBagConstraints.BOTH;
                                gbc_upgradeWorker4.gridx = 1;
                                gbc_upgradeWorker4.gridy = 0;
                                workerPanel4.add(upgradeWorker4, gbc_upgradeWorker4);
                                upgradeWorker4.setLayout(new BorderLayout(0, 0));

                                upgradeWorker4_1 = new GLabel("Upgrade", upgradeWorker4, SwingConstants.CENTER);
                                upgradeWorker4.add(upgradeWorker4_1);


                                GroupLayout gl_upgradesPanel = new GroupLayout(upgradesPanel);
                                gl_upgradesPanel.setHorizontalGroup(
                                    gl_upgradesPanel.createParallelGroup(Alignment.LEADING)
                                        .addGroup(gl_upgradesPanel.createSequentialGroup()
                                            .addContainerGap()
                                            .addGroup(gl_upgradesPanel.createParallelGroup(Alignment.LEADING)
                                                .addComponent(workerPanel1, GroupLayout.PREFERRED_SIZE, 238, GroupLayout.PREFERRED_SIZE)
                                                .addComponent(workerPanel2, GroupLayout.PREFERRED_SIZE, 238, GroupLayout.PREFERRED_SIZE)
                                                .addComponent(workerPanel3, GroupLayout.PREFERRED_SIZE, 238, GroupLayout.PREFERRED_SIZE)
                                                .addComponent(workerPanel4, GroupLayout.PREFERRED_SIZE, 238, GroupLayout.PREFERRED_SIZE))
                                            .addContainerGap(15, Short.MAX_VALUE))
                                );
                                gl_upgradesPanel.setVerticalGroup(
                                    gl_upgradesPanel.createParallelGroup(Alignment.LEADING)
                                        .addGroup(gl_upgradesPanel.createSequentialGroup()
                                            .addContainerGap()
                                            .addComponent(workerPanel1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                                            .addPreferredGap(ComponentPlacement.RELATED)
                                            .addComponent(workerPanel2, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                                            .addPreferredGap(ComponentPlacement.RELATED)
                                            .addComponent(workerPanel3, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                                            .addPreferredGap(ComponentPlacement.RELATED)
                                            .addComponent(workerPanel4, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                                            .addContainerGap(20, Short.MAX_VALUE))
                                );
                                upgradesPanel.setLayout(gl_upgradesPanel);

                                specialPanel = new JPanel();
                                specialPanel.setBackground(new Color(0,0,0,0.2f));
                                specialPanel.setBounds(6, 6, 288, 203);
                                gamePanel.add(specialPanel);
                                specialPanel.setLayout(null);

                                String[] columnNames = {"Upgrades", ""};
                                Object[][] data =
                                {
                                    {"Vozík +2",    "2000$"},
                                    {"Kalhoty +3",  "15000$"},
                                    {"Šperháky +4", "50000$"},
                                    {"Auto *2",     "200000$"},
                                };

                                DefaultTableModel model = new DefaultTableModel(data, columnNames){
                                     @Override
                                     public boolean isCellEditable(int row, int column) {
                                           if(column != 1) return false;
                                           else return true;
                                        }
                                };

                                table = new JTable( model );

                                Action upgradeMultiplier = new AbstractAction()
                                {
                                    int count = 0;
                                    public void actionPerformed(ActionEvent e)
                                    {
                                        /*
                                         * 
                                        JTable table = (JTable)e.getSource();
                                        int modelRow = Integer.valueOf( e.getActionCommand() );                
                                        String sPrice = (String) table.getModel().getValueAt(modelRow, 1);
                                        int price = Integer.parseInt(sPrice.substring(0,sPrice.length()-1));    
                                        String sMultip = (String) table.getModel().getValueAt(modelRow, 0);
                                        if(sMultip.lastIndexOf("*") != -1) {
                                            int multip = Integer.parseInt(sMultip.substring(sMultip.lastIndexOf("*")+1,sMultip.length()));
                                            if(player.money.getMoney() >= price) {
                                                player.money.deduct(price);
                                                worker.multiplyMultiplier(multip);
                                                ((DefaultTableModel)table.getModel()).removeRow(modelRow);  
                                            }
                                        } else if(sMultip.lastIndexOf("+") != -1) {
                                            int multip = Integer.parseInt(sMultip.substring(sMultip.lastIndexOf("+")+1,sMultip.length()));
                                            if(player.money.getMoney() >= price) {
                                                player.money.deduct(price);
                                                worker.plusMultiplier(multip);
                                                ((DefaultTableModel)table.getModel()).removeRow(modelRow);
                                            }
                                        }
                                        progressBar1.setString(worker.getProfit()+"$");
                                        lblMultiplier.setText(worker.multiplier+"x");
                                        *
                                        */
                                    }
                                };

                                ButtonColumn buttonColumn = new ButtonColumn(table, upgradeMultiplier , 1);
                                buttonColumn.setMnemonic(KeyEvent.VK_D);

                                table.setBounds(8, 55, 272, 142);
                                specialPanel.add(table);


                                String[] columnNames2 = {"Upgrades", ""};
                                Object[][] data2 =
                                {
                                    {"Special +1",  "2000$"},
                                    {"Special +3",  "15000$"},
                                    {"Special +4", "50000$"},
                                    {"SPecial *2",  "200000$"},
                                };

                                DefaultTableModel model2 = new DefaultTableModel(data2, columnNames2){
                                     @Override
                                     public boolean isCellEditable(int row, int column) {
                                           if(column != 1) return false;
                                           else return true;
                                        }
                                };

                                table2 = new JTable( model2 );

                                Action specialUpgrade = new AbstractAction()
                                {
                                    int count = 0;
                                    public void actionPerformed(ActionEvent e)
                                    {
                                        /*
                                         * 
                                        JTable table = (JTable)e.getSource();
                                        int modelRow = Integer.valueOf( e.getActionCommand() );                
                                        String sPrice = (String) table.getModel().getValueAt(modelRow, 1);
                                        int price = Integer.parseInt(sPrice.substring(0,sPrice.length()-1));    
                                        String sMultip = (String) table.getModel().getValueAt(modelRow, 0);
                                        if(sMultip.lastIndexOf("*") != -1) {
                                            int multip = Integer.parseInt(sMultip.substring(sMultip.lastIndexOf("*")+1,sMultip.length()));
                                            if(player.money.getMoney() >= price) {
                                                player.money.deduct(price);
                                                worker.multiplyMultiplier(multip);
                                                ((DefaultTableModel)table.getModel()).removeRow(modelRow);  
                                            }
                                        } else if(sMultip.lastIndexOf("+") != -1) {
                                            int multip = Integer.parseInt(sMultip.substring(sMultip.lastIndexOf("+")+1,sMultip.length()));
                                            if(player.money.getMoney() >= price) {
                                                player.money.deduct(price);
                                                worker.plusMultiplier(multip);
                                                ((DefaultTableModel)table.getModel()).removeRow(modelRow);
                                            }
                                        }
                                        progressBar1.setString(worker.getProfit()+"$");
                                        lblMultiplier.setText(worker.multiplier+"x");
                                        *
                                        */
                                    }
                                };

                                ButtonColumn buttonColumn2 = new ButtonColumn(table, specialUpgrade , 1);
                                buttonColumn2.setMnemonic(KeyEvent.VK_D);

                                table2.setBounds(8, 55, 272, 142);
                                table2.setVisible(false);
                                specialPanel.add(table2);

                                upgradesButton = new GameButton();
                                upgradesButton.setBounds(8, 6, 121, 43);
                                specialPanel.add(upgradesButton);
                                upgradesButton.setBackground(new Color(0,0,0,0));
                                upgradesButton.setLayout(new BorderLayout(0, 0));

                                GLabel label4 = new GLabel("Upgrades", (GameButton) upgradesButton, SwingConstants.CENTER);
                                label4.addMouseListener(new MouseAdapter() {
                                    @Override
                                    public void mouseClicked(MouseEvent arg0) {
                                        table.setVisible(true);
                                        table2.setVisible(false);
                                    }
                                });
                                upgradesButton.add(label4);

                                JPanel specialsButton = new GameButton();
                                specialsButton.setBounds(159, 6, 121, 43);
                                specialPanel.add(specialsButton);
                                specialsButton.setBackground(new Color(0,0,0,0));
                                specialsButton.setLayout(new BorderLayout(0, 0));

                                GLabel lblSpecials = new GLabel("Specials", (GameButton) specialsButton, SwingConstants.CENTER);
                                lblSpecials.addMouseListener(new MouseAdapter() {
                                    @Override
                                    public void mouseClicked(MouseEvent e) {
                                        table.setVisible(false);
                                        table2.setVisible(true);
                                    }
                                });
                                specialsButton.add(lblSpecials);
    }
}


GamePanel 扩展了 JPanel


    import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;


public class GamePanel extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        try {
            final BufferedImage image = ImageIO.read(new File("./res/gameBackground.jpg"));
            g.drawImage(image, 0, 0, 300, 400, this);   
        } catch (IOException e) {
            e.printStackTrace();
        }   
    }
}


    import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JProgressBar;

public class GProgressbar extends JProgressBar {

    private static final long serialVersionUID = 1L;


    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
    }
}


GameButton 扩展 JPanel


    import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class GameButton extends JPanel {

    private static final long serialVersionUID = 1L;

    boolean entered = false;
    boolean pressed = false;
    GameButton that = this;

    public GameButton() {
        this.setOpaque(true);

        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                that.entered = true;
                that.repaint();
            }
            @Override
            public void mouseExited(MouseEvent e) {
                that.entered = false;
                that.repaint();
            }
            @Override
            public void mouseClicked(MouseEvent e) {

            }
            @Override
            public void mousePressed(MouseEvent e) {
                that.pressed = true;
                that.repaint();
            }
            @Override
            public void mouseReleased(MouseEvent e) {
                that.pressed = false;
                that.repaint();
            }
        });
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.setColor(new Color(0,0,0,0));
        g.fillRect(0, 0, WIDTH, HEIGHT);

        if(!entered) {
            try {
                final BufferedImage image = ImageIO.read(new File("./res/button.gif"));
                g.drawImage( image, 0, 0, this.getWidth(), this.getHeight(), this);
            } catch(IOException e) {
                e.printStackTrace();
            }
        } else if(pressed){
            try {
                final BufferedImage image = ImageIO.read(new File("./res/buttonpressed.gif"));
                g.drawImage( image, 0, 0, this.getWidth(), this.getHeight(), this);
            } catch(IOException e) {
                e.printStackTrace();
            }           
        } else {
            try {
                final BufferedImage image = ImageIO.read(new File("./res/buttonactive.gif"));
                g.drawImage( image, 0, 0, this.getWidth(), this.getHeight(), this);
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }
}


GLabel 扩展了 JLabel


    import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JLabel;


public class GLabel extends JLabel{

    GameButton that;


    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(new Color(0,0,0,0));
        g.fillRect(0, 0, WIDTH, HEIGHT);
    }

    public GLabel(String s, GameButton that, int center) {
        this.setText(s);
        this.that = that;
        this.setHorizontalAlignment(center);

        setForeground(Color.BLACK);
        setFont(Menu.fontTerminal.deriveFont(15f));
        setBackground(new Color(0,0,0,0));

        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                that.entered = true;
                that.repaint();
            }
            @Override
            public void mouseExited(MouseEvent e) {
                that.entered = false;
                that.repaint();
            }
            @Override
            public void mouseClicked(MouseEvent e) {
            }
            @Override
            public void mousePressed(MouseEvent e) {
                that.pressed = true;
                that.repaint();
            }
            @Override
            public void mouseReleased(MouseEvent e) {
                that.pressed = false;
                that.repaint();
            }
        });
    }   
}


您似乎为“workerPanel1”设置了完全透明的 JPanel。
因此,背景显示在 JPanel 后面。

而不是:

workerPanel1.setBackground(new Color(0,0,0,0))

使用:
workerPanel1.setBackground(new Color(0,0,0))
(等同于:new Color(0,0,0,255)

编辑:
如果您希望保持透明面板,可以使用 JPanel#setOpaque(false) 来实现。
当 opaque 为 false 时,面板根本不绘制其背景,您必须记住面板后面显示的内容。
目前,你有两个按钮显示在它后面,所以你可以设置 Visible(false) 它们或在这个面板处于活动状态时删除它们。

I want to make the background fully transparent.

那么你只需要:

component.setOpaque( false );

如果您需要背景的部分透明度,那么您将得到伪像,因为您将打破与 Swing 组件和不透明的绘画契约 属性。查看 Backgrounds With Transparency 了解更多信息和此问题的解决方案。