public class Game_Screen extends JLayeredPane {
private JLabel hangman;
public Game_Screen() {
super();
super.setBounds(0, 0, 1920, 1080);
hangman = new JLabel(new ImageIcon(Game_Screen.class.getResource("/images/hangman10.jpg")));
hangman.setBounds(0, 0, 1920, 1080);
add(hangman, Integer.valueOf(0));
}
}
public class Home_Screen extends Game_Screen {
private JLabel title;
private JLabel score;
private JButton start;
public Home_Screen() {
super();
title = new JLabel("HANGMAN");
title.setBounds(490, 170, 942, 217);
title.setFont(new Font("Press Start", Font.PLAIN, 100));
add(title, Integer.valueOf(1));
score = new JLabel("High Score: 0");
score.setBounds(635, 330, 470, 67);
score.setFont(new Font("Press Start", Font.PLAIN, 30));
add(score, Integer.valueOf(1));
start = new JButton("START");
start.setBounds(635,400,400,120);
start.setBorderPainted(false);
start.setFont(new Font("Press Start", Font.PLAIN, 60));
add(start, Integer.valueOf(1));
}
public void addStartButtonListener(ActionListener a) {
start.addActionListener(a);
}
}
public class HangmanGame extends JFrame {
private Home_Screen home;
private Level_Screen level;
private Win_Screen win;
private Lose_Screen lose;
private Play_Screen play;
public HangmanGame() {
super("Hangman");
home = new Home_Screen();
level = new Level_Screen();
win = new Win_Screen();
lose = new Lose_Screen();
play = new Play_Screen();
add(home);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(new Dimension(1920,1080));
setLayout(null);
setVisible(true);
}
public Home_Screen getHomeScreen() {
return home;
}
public Level_Screen getLevelScreen() {
return level;
}
public Win_Screen getWinScreen() {
return win;
}
public Lose_Screen getLoseScreen() {
return lose;
}
public Play_Screen getPlayScreen() {
return play;
}
}
控制器类
public class Controller {
private HangmanGame game;
public Controller() {
//game = g;
game = new HangmanGame();
game.getHomeScreen().addStartButtonListener(new startButtonListener());
}
class startButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
game.remove(game.getHomeScreen());
game.add(game.getLevelScreen());
}
}
}
我要在这里惹你一点麻烦,坚持住,我相信你会感激的。
一是秋千偷懒。当您对组件或布局进行更改时,您需要告诉Swing您希望对其进行更新。
这意味着,添加或删除组件时,通常会调用revalidate
和repaint
。由于没有大量使用布局管理器,因此可以保留revalidate
。
取而代之的是,我想让事情尽可能地变得愚蠢,所以如果我需要改变事情,并不是每次都完全重写。
相反,在下面的示例中,我在HangmanGame
上使用了CardLayout
并为Home_Screen
提供了一个“委托”,它告诉“开始”何时发生(我不关心如何发生,只是它发生了),然后允许HangmanGame
控制导航。
这通常是一个小事情,你可以争辩说可以使用某种“导航控制器”,但你需要在away中这样做,这确实暴露了实现细节,而且...这是一个混乱的...:p
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
public class Controller {
private HangmanGame game;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Controller();
}
});
}
public Controller() {
//game = g;
game = new HangmanGame();
}
public class HangmanGame extends JFrame {
private Home_Screen home;
private JPanel level;
public HangmanGame() {
super("Hangman");
CardLayout cardLayout = new CardLayout();
home = new Home_Screen(new HomeDelegate() {
@Override
public void startGame() {
cardLayout.show(getContentPane(), "level");
}
});
level = new JPanel();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(new Dimension(1920, 1080));
setLayout(cardLayout);
add(home, "home");
add(level, "level");
setVisible(true);
}
}
public interface HomeDelegate {
public void startGame();
}
public class Home_Screen extends Game_Screen {
private JLabel title;
private JLabel score;
private JButton start;
public Home_Screen(HomeDelegate delegate) {
super();
title = new JLabel("HANGMAN");
title.setBounds(490, 170, 942, 217);
title.setFont(new Font("Press Start", Font.PLAIN, 100));
add(title, Integer.valueOf(1));
score = new JLabel("High Score: 0");
score.setBounds(635, 330, 470, 67);
score.setFont(new Font("Press Start", Font.PLAIN, 30));
add(score, Integer.valueOf(1));
start = new JButton("START");
start.setBounds(635, 400, 400, 120);
start.setBorderPainted(false);
start.setFont(new Font("Press Start", Font.PLAIN, 60));
add(start, Integer.valueOf(1));
start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
delegate.startGame();
}
});
}
}
public class Game_Screen extends JLayeredPane {
private JLabel hangman;
public Game_Screen() {
super();
hangman = new JLabel(new ImageIcon(getClass().getResource("/images/hangman10.png")));
hangman.setBounds(0, 0, 1920, 1080);
add(hangman, Integer.valueOf(0));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(1920, 1080);
}
}
}
我正在尝试将此 JPanel 添加到 JFrame 中,但我看不到他。当我创建新的 java 类并自己制作这个框架时,一切都很好。 来自JFrame表单的代码。 来自 JPanel 的代码: 来自Java类的代码。 我想不出区别在哪里。有人能帮我吗?
我在向JFrame添加JLabel时遇到问题。我使用了一些教程中描述的JPanel,但标签不会在框架中弹出;其他swing组件(如JTextField、JButton等)也存在同样的问题。。绘制直线、矩形等确实可行。我希望有人知道,我在这里犯了什么样的错误: 主方法位于另一个类中: 框架按预期弹出,但JLabel丢失。感谢所有有用的评论。
我有一个关于向Java框架添加组件的问题。 我有一个带有两个按钮的JGroup和一个添加了JTable的JScrollPane。我想将这两个都添加到JFrame中。 我可以将JPanel添加到JFrame,或者将JScrollPane添加到JFrame,并且它们可以正确显示。我很难将它们都添加到JFrame并显示它们。 是否有与JFrames相关的东西不允许这样做?任何帮助都将不胜感激。 编辑 问
我正在创建一个TicTacToe游戏。我把所有带有ActionListeners的后端放在按钮上,将按钮添加到面板,设置框架等等。 然而,当我运行程序时,我的JPanel似乎没有添加到JFrame中。我试过使用不同的布局,仔细检查是否确实放置了。为所有内容添加行,之前的所有帖子似乎都指向了我认为已经涵盖的内容。 如果这真的很直接,我提前道歉。 谢谢你的帮助。
问题内容: 我有两节课 我的主要班级创建了一个框架,我希望另一个班级为其添加内容。一读arroudn告诉我,我应该使用组件来执行此操作,但是当我运行代码时,框架为空。 我的Component类创建一个JLabel 我没有任何编译错误,但是我的JFrame中没有任何文本。 谁能解释我在做什么错? 克里斯 问题答案: 您需要 添加 的。最好扩展而不是扩展,因为它具有默认的布局管理器,并且无需设置组件大
我一直在使用JFrame进行我的项目,但遇到了一个问题。这是我的代码: 还有,这是我的主要。java: 我想做的是向面板添加文本字段和标签。但是,当我运行此代码时,它会显示:结果 如果我在框架中添加标签和文本字段,效果很好。你能帮我解决这个问题吗?非常感谢你。