Java 不管我做什么,杰拉贝尔都不会出现
我尝试了很多不同的方法来让JLabel展示出来,但我不明白为什么它不起作用。我尝试过调整它的大小,虽然这不是我想做的,我也尝试过其他课程,但我更愿意坚持这一个,它开始变得非常令人沮丧。如果你有任何想法,请帮忙。但请尽量保持简单,并解释清楚,因为我对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
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()
toJLabel 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()
toJLabel onePlayer=newjlabel(“我是标签”)代码>我得到这个输出
还有
while (true) { // Main Game loop
onePlayer.setText("One Player");
game.repaint();
game.customUpdate();
}
有可能会破坏你的程序,你不能保证你的main
方法在哪个线程中被调用,你不应该做出假设
首先创建一个自定义组件,从像JPanel
这样的东西开始扩展,并覆盖它的paintComponent
方法,将自定义绘制放在那里。事实上,您应该为游戏的每个状态(菜单、运行、设置等)设置一个面板
将这些添加到您的框架中(可能使用卡片布局