Java 不管我做什么,杰拉贝尔都不会出现

Java 不管我做什么,杰拉贝尔都不会出现,java,intellij-idea,jlabel,Java,Intellij Idea,Jlabel,我尝试了很多不同的方法来让JLabel展示出来,但我不明白为什么它不起作用。我尝试过调整它的大小,虽然这不是我想做的,我也尝试过其他课程,但我更愿意坚持这一个,它开始变得非常令人沮丧。如果你有任何想法,请帮忙。但请尽量保持简单,并解释清楚,因为我对java还是相当陌生的。我只去了大约三四个月。这是我的密码: package com.thefallenpaladin; import javax.swing.*; import java.awt.*; import java.awt.event.K

我尝试了很多不同的方法来让JLabel展示出来,但我不明白为什么它不起作用。我尝试过调整它的大小,虽然这不是我想做的,我也尝试过其他课程,但我更愿意坚持这一个,它开始变得非常令人沮丧。如果你有任何想法,请帮忙。但请尽量保持简单,并解释清楚,因为我对java还是相当陌生的。我只去了大约三四个月。这是我的密码:

package com.thefallenpaladin;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

/**
 * Created by darkp_000 on 11/4/2015.
 */
@SuppressWarnings("serial")
public class Game extends JPanel implements KeyListener,MouseListener {

    public boolean mainMenu = true;

    public int winWidth = 700;  //Window Stats
    public int winHeight = 600;

    public int buttonOneX = 60; // Button Stats
    public int buttonOneY = 240;
    public int buttonOneW = 100;
    public int buttonOneH = 75;
    public boolean buttonOne = false;

    public int mouseX; // not set because it is set in mouseClicked
    public int mouseY;

    public static void main(String[] args) {
        Game game = new Game();

        JFrame window = new JFrame("I hate this");
        JLabel onePlayer = new JLabel();
        onePlayer.setLocation(0,0/*game.buttonOneX +         game.buttonOneX/2,game.buttonOneY + game.buttonOneY/2*/);
        window.add(game);

        window.setFocusable(true);
        window.setResizable(false);
        window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        window.setSize(700,600); //TODO
        window.setVisible(true);

        game.requestFocusInWindow();
        game.add(onePlayer);
        game.addKeyListener(game);
        game.addMouseListener(game);


        window.setLocationRelativeTo(null);

        while(true) { // Main Game loop
            onePlayer.setText("One Player");
            game.repaint();
            game.customUpdate();
        } 
    }

    public void customUpdate() {
        if(mouseX > buttonOneX && mouseX < buttonOneX+buttonOneX && mouseY >     buttonOneY && mouseY < buttonOneY+buttonOneY && mainMenu) {
            buttonOne = true;
            System.out.print("Starting Game");
        }
    }

    public void paint(Graphics g) {
        if(mainMenu) {
            g.setColor(Color.CYAN); // Set main menu
            g.fillRect(0,0,winWidth,winHeight);
            g.setColor(Color.GREEN);
            g.fillRect(buttonOneX,buttonOneY,buttonOneW,buttonOneH);
        }
        if(buttonOne) {
            mainMenu = false;
            g.setColor(Color.GREEN);
            g.fillRect(0,0,winWidth,winHeight);
        }
    }

    public void keyTyped(KeyEvent e) {

    }

    public void keyPressed(KeyEvent e) {
        System.out.println(e);
    }

    public void keyReleased(KeyEvent e) {

    }

    public void mouseClicked(MouseEvent e) {

    }

    public void mousePressed(MouseEvent e) {
//        System.out.println(e);
        mouseX = e.getX();
        mouseY = e.getY();

}

    public void mouseReleased(MouseEvent e) {

    }

    public void mouseEntered(MouseEvent e) {

    }

    public void mouseExited(MouseEvent e) {

    }
    }
package com.thefallenpaladin;
导入javax.swing.*;
导入java.awt.*;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
/**
*由darkp_000于2015年11月4日创建。
*/
@抑制警告(“串行”)
公共类游戏扩展JPanel实现KeyListener、MouseListener{
公共布尔主菜单=真;
public int winWidth=700;//窗口统计信息
公共高度=600;
public int buttonex=60;//按钮统计信息
公共int按钮Y=240;
公共int按钮NONEW=100;
公共信息h=75;
公共布尔按钮none=false;
public int mouseX;//未设置,因为它是在mouseClicked中设置的
公鼠;
公共静态void main(字符串[]args){
游戏=新游戏();
JFrame window=newjframe(“我讨厌这个”);
JLabel onePlayer=新的JLabel();
onePlayer.setLocation(0,0/*game.buttonex+game.buttonex/2,game.buttoney+game.buttoney/2*/);
添加(游戏);
window.setFocusable(true);
window.setresizeable(false);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
window.setSize(700600);//待办事项
window.setVisible(true);
game.requestFocusInWindow();
游戏。添加(一名玩家);
game.addKeyListener(游戏);
游戏。addMouseListener(游戏);
window.setLocationRelativeTo(空);
while(true){//主游戏循环
onePlayer.setText(“一名玩家”);
游戏。重绘();
game.customUpdate();
} 
}
public void customUpdate(){
if(mouseX>buttonOneX&&mouseXbuttonOneY&&mouseY
好吧,你犯了几个基本错误

首先,
jlabeloneplayer=newjlabel()
创建一个没有大小(
0x0
)的空标签,因为默认情况下标签是透明的,所以您不会看到它

接下来,您已经覆盖了顶级容器(
JFrame
)的
paint
,但未能遵守绘制链,从而有效防止任何子组件被绘制

public void paint(Graphics g) {
    if (mainMenu) {
        g.setColor(Color.CYAN); // Set main menu
        g.fillRect(0, 0, winWidth, winHeight);
        g.setColor(Color.GREEN);
        g.fillRect(buttonOneX, buttonOneY, buttonOneW, buttonOneH);
    }
    if (buttonOne) {
        mainMenu = false;
        g.setColor(Color.GREEN);
        g.fillRect(0, 0, winWidth, winHeight);
    }
}
因此,如果我删除您的绘制方法并更改
JLabel onePlayer=new JLabel()
to
JLabel onePlayer=newjlabel(“我是标签”)我得到这个输出

还有

while (true) { // Main Game loop
    onePlayer.setText("One Player");
    game.repaint();
    game.customUpdate();
}
有可能会破坏你的程序,你不能保证你的
main
方法在哪个线程中被调用,你不应该做出假设

首先创建一个自定义组件,从像
JPanel
这样的东西开始扩展,并覆盖它的
paintComponent
方法,将自定义绘制放在那里。事实上,您应该为游戏的每个状态(菜单、运行、设置等)设置一个面板

将它们添加到您的框架中(可能使用
卡片布局
,使您能够轻松地在它们之间切换)

使用
线程
或Swing
计时器
作为主游戏循环,您可以显式创建该循环

请查看,并获取更多详细信息

作为一个“概念性”的例子

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class AwesomeGame {

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

    public AwesomeGame() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new ContentPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public interface NavigationController {
        public void letsPlay();
    }

    public class ContentPane extends JPanel implements NavigationController {

        private CardLayout cardLayout;
        private GamePane gamePane;

        public ContentPane() {
            cardLayout = new CardLayout();
            setLayout(cardLayout);
            add(new MenuPane(this), "TheMenu");
            add((gamePane = new GamePane()), "TheGame");
            cardLayout.show(this, "TheMenu");
        }

        @Override
        public void letsPlay() {
            cardLayout.show(this, "TheGame");
            gamePane.play();
        }

    }

    public class MenuPane extends JPanel {

        public MenuPane(NavigationController navigationController) {
            JLabel label = new JLabel("My Super Dupa Awesome Game!");
            label.setFont(label.getFont().deriveFont(Font.BOLD, 48));
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;

            add(label, gbc);

            JButton play = new JButton("Play Now!");
            play.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    navigationController.letsPlay();
                }
            });
            add(play, gbc);

            setBackground(Color.GREEN);
        }

    }


    public class GamePane extends JPanel {

        public GamePane() {
            setBackground(Color.BLUE);
        }

        public void play() {
            Timer timer = new Timer(500, new ActionListener() {
                int count;
                @Override
                public void actionPerformed(ActionEvent e) {
                    count++;
                    if (count % 2 == 0) {
                        setForeground(Color.BLACK);
                    } else {
                        setForeground(Color.RED);
                    }
                    repaint();
                }
            });
            timer.start();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            String text = "I bet you're blowen away by it's awesomness!";
            FontMetrics fm = g2d.getFontMetrics();
            int x = (getWidth() - fm.stringWidth(text)) / 2;
            int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent();
            g2d.drawString(text, x, y);
            g2d.dispose();
        }

    }
}

好吧,你犯了几个基本的错误

首先,
jlabeloneplayer=newjlabel()
创建一个没有大小(
0x0
)的空标签,因为默认情况下标签是透明的,所以您不会看到它

接下来,您已经覆盖了顶级容器(
JFrame
)的
paint
,但未能遵守绘制链,从而有效防止任何子组件被绘制

public void paint(Graphics g) {
    if (mainMenu) {
        g.setColor(Color.CYAN); // Set main menu
        g.fillRect(0, 0, winWidth, winHeight);
        g.setColor(Color.GREEN);
        g.fillRect(buttonOneX, buttonOneY, buttonOneW, buttonOneH);
    }
    if (buttonOne) {
        mainMenu = false;
        g.setColor(Color.GREEN);
        g.fillRect(0, 0, winWidth, winHeight);
    }
}
因此,如果我删除您的绘制方法并更改
JLabel onePlayer=new JLabel()
to
JLabel onePlayer=newjlabel(“我是标签”)我得到这个输出

还有

while (true) { // Main Game loop
    onePlayer.setText("One Player");
    game.repaint();
    game.customUpdate();
}
有可能会破坏你的程序,你不能保证你的
main
方法在哪个线程中被调用,你不应该做出假设

首先创建一个自定义组件,从像
JPanel
这样的东西开始扩展,并覆盖它的
paintComponent
方法,将自定义绘制放在那里。事实上,您应该为游戏的每个状态(菜单、运行、设置等)设置一个面板

将这些添加到您的框架中(可能使用
卡片布局