- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了使用多个面板的应用程序,所以我选择了cardLayout。问题是,当执行以下代码时,在 UserInterface 方法 SinglePlayer() 中会发生一些奇怪的事情。我使用命令 frame.add(fieldPanel, "card2"); 和 cardLayout.show(frame, "card2"); 但是当执行该代码时,我的整个窗口变为黑色而不是显示 fieldPanel。仅当 while 循环(位于这些行的正下方)完成时,才会显示 fieldPanel。可能是什么问题?
这是代码:
用户界面类:
package view;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import model.Field;
import model.Food;
import model.Snake;
import model.Snake.SnakePoint;
import net.miginfocom.swing.MigLayout;
public class UserInterface extends JFrame{
private JLabel singlePlayer,multiPlayer,quit;
private Container menu;
public JPanel introPanel,fieldPanel;
public CardLayout cardLayout;
private Field field;
private Snake snake1,snake2;
private Food food;
JPanel frame;
Thread mainThread;
public UserInterface(){
cardLayout=new CardLayout();
frame=new JPanel(cardLayout);
// Adjust window
introPanel=new JPanel(new MigLayout());
setSize(740, 515);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setResizable(true);
setTitle("Snake");
setVisible(true);
// Instantiate buttons
singlePlayer=new JLabel();
multiPlayer=new JLabel();
quit=new JLabel();
singlePlayer.setIcon(new ImageIcon("files/singleplayer.jpg"));
multiPlayer.setIcon(new ImageIcon("files/multiplayer.jpg"));
quit.setIcon(new ImageIcon("files/quit.jpg"));
quit.addMouseListener(new Mouse());
singlePlayer.addMouseListener(new Mouse());
multiPlayer.addMouseListener(new Mouse());
// Create menu panel
menu=new JPanel(new MigLayout());
menu.add(singlePlayer,"cell 0 0");
menu.add(multiPlayer,"cell 0 1");
menu.add(quit,"cell 0 2");
// Insert menu to the center
introPanel.add(menu,"push, align center");
// Create card layout
frame.add(introPanel,"card1");
add(frame);
}
public void singlePlayer(){
field=new Field(false);
snake1=new Snake();
food=new Food();
fieldPanel=field.getFieldPanel();
frame.add(fieldPanel, "card2");
cardLayout.show(frame, "card2");
revalidate();
repaint();
for(int i=0; i<field.FIELD_WIDTH;i++){
for(int j=0; j<field.FIELD_HEIGHT;j++){
this.addKeyListener(new KListener());
}
}
while(!snake1.isBodyHit()){
revalidate();
repaint();
redrawField();
redrawFood();
redrawSnake();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
System.out.println("Error in UserInterface run method");
}
if(snake1.head.positionX==field.foodX && snake1.head.positionY==field.foodY){
snake1.increaseSnake();
field.resetFood();
}
snake1.moveSnake();
System.out.println(snake1.direction);
}
}
private class Mouse implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
if(e.getSource()==quit){
System.exit(0);;
} else if(e.getSource()==singlePlayer){
singlePlayer();
} else if(e.getSource()==multiPlayer){
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
if(e.getSource()==singlePlayer){
singlePlayer.setIcon(new ImageIcon("files/singlePlayer2.jpg"));
} else if(e.getSource()==multiPlayer){
multiPlayer.setIcon(new ImageIcon("files/multiPlayer2.jpg"));
} else if(e.getSource()==quit){
quit.setIcon(new ImageIcon("files/quit2.jpg"));
}
}
@Override
public void mouseExited(MouseEvent e) {
if(e.getSource()==singlePlayer){
singlePlayer.setIcon(new ImageIcon("files/singlePlayer.jpg"));
} else if(e.getSource()==multiPlayer){
multiPlayer.setIcon(new ImageIcon("files/multiPlayer.jpg"));
} else if(e.getSource()==quit){
quit.setIcon(new ImageIcon("files/quit.jpg"));
}
}
}
public void redrawSnake(){
SnakePoint temp=snake1.head;
while(temp!=null){
field.fieldLabels[temp.positionX][temp.positionY].setIcon(new ImageIcon("files/snake.jpg"));
temp=temp.next;
}
}
public void redrawField(){
for(int i=0;i<field.FIELD_WIDTH;i++)
for(int j=0;j<field.FIELD_HEIGHT;j++)
field.fieldLabels[i][j].setIcon(new ImageIcon("files/field_gray.jpg"));
}
public void redrawFood(){
for(int i=0;i<field.FIELD_WIDTH;i++)
for(int j=0;j<field.FIELD_HEIGHT;j++)
if( i== field.foodX && j==field.foodY)
field.fieldLabels[i][j].setIcon(new ImageIcon("files/food.jpg"));
}
private class KListener implements KeyListener
{
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_RIGHT){
snake1.direction='s';
} else if(e.getKeyCode()==KeyEvent.VK_LEFT){
snake1.direction='n';
} else if(e.getKeyCode()==KeyEvent.VK_DOWN){
snake1.direction='e';
} else if(e.getKeyCode()==KeyEvent.VK_UP){
snake1.direction='w';
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
}
蛇类: 封装模型;
public class Snake implements Runnable {
public SnakePoint head,tail;
private int length=0;
private static int numberOfSnakes=0;
private static final int initialLength=5;
public char direction;
public int foodX,foodY;
private int score;
@Override
public void run() {
numberOfSnakes++;
}
public SnakePoint getHead(){return head;}
public Snake(){
head=new SnakePoint();
int x=25,y=30;
head.positionX=x;
head.positionY=y;
SnakePoint temp1=new SnakePoint();
head.next=temp1;
temp1.positionX=24;
temp1.positionY=y;
SnakePoint temp2=new SnakePoint();
temp1.next=temp2;
temp2.positionX=23;
temp2.positionY=y;
temp1=temp2;
temp2=new SnakePoint();
temp1.next=temp2;
temp2.positionX=22;
temp2.positionY=y;
temp1=temp2;
temp2=new SnakePoint();
temp1.next=temp2;
temp2.positionX=21;
temp2.positionY=y;
temp2.next=null;
tail=temp2;
direction='e';
length=5;
}
public SnakePoint getPointAt(int position){
SnakePoint temp=head;
for(int i=0; ; i++)
{
if(position==i)
break;
temp=temp.next;
}
return temp;
}
public void moveSnake(){
if(!(direction=='w' && head.positionX==0) &&
!(direction=='e' && head.positionX==44) &&
!(direction=='n' && head.positionY==0) &&
!(direction=='s' && head.positionY==49)){
if(direction=='e'){
SnakePoint newHead=tail;
SnakePoint oneBeforeTail=getPointAt(length-2);
oneBeforeTail.next=null;
tail=oneBeforeTail;
newHead.positionX=head.positionX+1;
newHead.positionY=head.positionY;
newHead.next=head;
head=newHead;
} else if(direction=='w'){
SnakePoint newHead=tail;
SnakePoint oneBeforeTail=getPointAt(length-2);
oneBeforeTail.next=null;
tail=oneBeforeTail;
newHead.positionX=head.positionX-1;
newHead.positionY=head.positionY;
newHead.next=head;
head=newHead;
} else if(direction=='s'){
SnakePoint newHead=tail;
SnakePoint oneBeforeTail=getPointAt(length-2);
oneBeforeTail.next=null;
tail=oneBeforeTail;
newHead.positionX=head.positionX;
newHead.positionY=head.positionY+1;
newHead.next=head;
head=newHead;
} else if(direction=='n'){
SnakePoint newHead=tail;
SnakePoint oneBeforeTail=getPointAt(length-2);
oneBeforeTail.next=null;
tail=oneBeforeTail;
newHead.positionX=head.positionX;
newHead.positionY=head.positionY-1;
newHead.next=head;
head=newHead;
}
} else if(direction=='w' && head.positionX==0){
SnakePoint newHead=tail;
SnakePoint oneBeforeTail=getPointAt(length-2);
oneBeforeTail.next=null;
tail=oneBeforeTail;
newHead.positionX=44;
newHead.positionY=head.positionY;
newHead.next=head;
head=newHead;
} else if(direction=='e' && head.positionX==44){
SnakePoint newHead=tail;
SnakePoint oneBeforeTail=getPointAt(length-2);
oneBeforeTail.next=null;
tail=oneBeforeTail;
newHead.positionX=0;
newHead.positionY=head.positionY;
newHead.next=head;
head=newHead;
} else if(direction=='n' && head.positionY==0){
SnakePoint newHead=tail;
SnakePoint oneBeforeTail=getPointAt(length-2);
oneBeforeTail.next=null;
tail=oneBeforeTail;
newHead.positionX=head.positionX;
newHead.positionY=49;
newHead.next=head;
head=newHead;
} else if(direction=='s' && head.positionY==49){
SnakePoint newHead=tail;
SnakePoint oneBeforeTail=getPointAt(length-2);
oneBeforeTail.next=null;
tail=oneBeforeTail;
newHead.positionX=head.positionX;
newHead.positionY=0;
newHead.next=head;
head=newHead;
}
}
public boolean isBodyHit(){
SnakePoint temp=head.next;
while(temp != null){
if(head.positionX==temp.positionX && head.positionY==temp.positionY){
System.out.println("here");
return true;
}
temp=temp.next;
}
return false;
}
public void increaseSnake(){
length++;
SnakePoint newPoint=new SnakePoint();
if(!(direction=='w' && head.positionX==0) &&
!(direction=='e' && head.positionX==44) &&
!(direction=='n' && head.positionY==0) &&
!(direction=='s' && head.positionY==49)){
if(direction=='w'){
newPoint.positionX=head.positionX+1;
newPoint.positionY=head.positionY;
newPoint.next=head;
head=newPoint;
} else if(direction=='e'){
newPoint.positionX=head.positionX-1;
newPoint.positionY=head.positionY;
newPoint.next=head;
head=newPoint;
} else if(direction=='s'){
newPoint.positionX=head.positionX;
newPoint.positionY=head.positionY+1;
newPoint.next=head;
head=newPoint;
}else if(direction=='n'){
newPoint.positionX=head.positionX;
newPoint.positionY=head.positionY-1;
newPoint.next=head;
head=newPoint;
}
} else if(direction=='w' && head.positionX==0){
newPoint.positionX=44;
newPoint.positionY=head.positionY;
newPoint.next=head;
head=newPoint;
} else if(direction=='e' && head.positionX==44){
newPoint.positionX=0;
newPoint.positionY=head.positionY;
newPoint.next=head;
head=newPoint;
} else if(direction=='n' && head.positionY==0){
newPoint.positionX=head.positionX;
newPoint.positionY=49;
newPoint.next=head;
head=newPoint;
} else if(direction=='s' && head.positionY==49){
newPoint.positionX=head.positionX;
newPoint.positionY=0;
newPoint.next=head;
head=newPoint;
}
}
public int getLength(){ return length;}
public class SnakePoint{
public int positionX,positionY;
public SnakePoint next;
public SnakePoint(){
positionX=0;
positionY=0;
next=null;
}
public void addPoint(SnakePoint parent){
}
}
}
字段类别: 封装模型;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
public class Field extends JFrame {
private JPanel myFieldPanel;
private JPanel leftPanel;
private JPanel centralPanel;
private JPanel rightPanel;
private boolean isMultiPlayer;
private JLabel leftScore,rightScore;
private int score;
public int foodX,foodY;
public JLabel [][] fieldLabels;
public final int FIELD_WIDTH=45,FIELD_HEIGHT=50;
private static final long serialVersionUID = 1L;
public JPanel getFieldPanel(){return myFieldPanel;}
public void resetFood(){
// formula: new Random().nextInt(max - min + 1) + min;
foodX=new Random().nextInt(45 - 0 + 1) + 0;
foodY=new Random().nextInt(49 - 0 + 1) + 0;
}
public Field(boolean type){
myFieldPanel=new JPanel();
this.isMultiPlayer=type;
// Adjust playground and score tables
leftPanel=new JPanel(new MigLayout());
centralPanel=new JPanel(new MigLayout("gap 0, wrap 50"));
centralPanel.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.black));
rightPanel=new JPanel(new MigLayout());
// Set leftPanel
score=0;
leftScore=new JLabel("Player 1 score:\n"+score);
leftPanel.add(leftScore, "dock north");
// Adjust field and central panel
fieldLabels=new JLabel[FIELD_WIDTH][FIELD_HEIGHT];
for(int i=0;i<FIELD_WIDTH;i++){
for(int j=0;j<FIELD_HEIGHT;j++){
// Create each label
fieldLabels[i][j]=new JLabel();
// Paint each label
fieldLabels[i][j].setIcon(new ImageIcon("files/field_gray.jpg"));
// Add each label into layout
centralPanel.add(fieldLabels[i][j]);
}
}
// Adjust rightPanel
rightPanel.add(new JLabel("Player 2 score: "),"dock north");
// Final preparations
myFieldPanel.setLayout(new MigLayout());
myFieldPanel.add(leftPanel, "cell 0 0");
myFieldPanel.add(centralPanel, "cell 1 0");
myFieldPanel.add(rightPanel, "cell 2 0");
resetFood();
}
public boolean IsMultiPlayer(){ return isMultiPlayer;}
}
最佳答案
请阅读有关 Swing 并发性的更多信息:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html
我强烈猜测 singlePlayer()
方法是在事件调度线程中执行的。包含 Thread.sleep(..) 方法的 while
循环会阻止更新 GUI,从而卡住 GUI(或将其绘制为黑色)。
您必须确保 EDT 中执行的所有方法都能快速返回。
关于Java CardLayout 在不相关的循环完成之前不会更改面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28729365/
嗨,我正在使用表单做一个小项目。目前我使用了 netbeans,但我的类变得非常复杂,因为所有 jpanel ie 卡都在一个类中,这是一个框架。我被要求简化。 我的问题是如果我把一个 jpanel
是否有一种优雅的方法可以用指向另一个对象的新引用替换添加到 CardLayout 中的对象的引用。我不知道现在我是否想得好,但我只想得到反馈。 最佳答案 而不是 bankAccPanel 直接添加将其
在我的项目中,我在 JFrame 中有一个 JPanel (bottomPanel) 需要交换,因此我在 BottomPanel 上使用 CardLayout。 在我的父 JFrame 中,我基本上在
我想熟悉 CardLayout,所以我正在制作一个模拟游戏菜单。该菜单应该有三个按钮,但布局部分很简单。 所以,我想做的是用带有三个按钮的菜单启动它。单人游戏按钮应该将用户看到的内容更改为单个按钮,这
我是java初学者。在第二个卡片面板中,用户名和密码对齐不正确。有什么办法可以解决吗?我还想知道使用多个框架的缺点是什么。 import java.awt.*; import java
我正在尝试编写一个简短的程序,它有一个带有标题的主页和 4 个按钮,其中 3 个按钮将离开主屏幕并转到一个新页面,您可以在其中相应地输入信息。我开始使用拖放编辑器,但通过论坛发现我应该使用卡片布局,而
这是我的 SSCE(尽管分为三个单独的类(class))。 启动.java public class Startup { public static void main(String args
每当我感觉自己已经学到了很多关于 Java 的知识时,我就会突然遇到一堵砖墙,让我感觉自己像个十足的白痴。今天的大问题是 CardLayout。至少我终于通过在字段列表中实例化 buttonsCard
我正在使用 Eclipse 和 Window Builder。但是我无法在 Window Builder 中使用卡片布局。所以我开始输入自己的代码,现在我卡在显示第一张卡上,该卡显示正确,但在单击 j
有没有办法告诉使用 CardLayout 的 JPanel 在哪里添加组件? 假设我在框架中央有一个这样的面板,并且我想在该面板内显示 3 个组件。这可能吗? 最佳答案 当然,这很容易。只需将 JPa
我在 CardLayout 中放置了一堆面板,其中第 n 面板取决于 (n - 1)th 面板。由于使用 CardLayout,您必须事先初始化并添加所有面板。因此,它使得管理状态变得比必要的更加困难
我制作了一个简单的程序,几乎可以完成所有操作,除了返回到第一个面板的开关之外。因此,如果我单击“Druck”按钮,它将把钱从一个银行帐户转移到另一个银行帐户,然后切换到第二个面板,其中显示两个帐户的余
我正在关注 YouTube 上关于 CardLayout 的教程。我下载了the original code ,效果很好。但对于我试图制作的程序,我需要一个单独的类来运行应用程序(即仅具有 main
我有一个已经运行并可以运行的游戏,我想为其添加一个标题屏幕。我正在尝试添加 CardLayout 以便在游戏和标题屏幕之间轻松切换。我当前的问题是没有显示任何内容。这是一张图片:/image/AooM
我创建了使用多个面板的应用程序,所以我选择了cardLayout。问题是,当执行以下代码时,在 UserInterface 方法 SinglePlayer() 中会发生一些奇怪的事情。我使用命令 fr
我正在为一个相当简单的棋盘游戏制作我的第一个 GUI。除了游戏 View 之外,我还需要主菜单和其他一些 View 。不幸的是,我的 GUI 看起来比早上更难看,因为整个菜单结构都在一个类中。我使用卡
这是我第一次尝试使用 Cardlayout 运行代码。这是 add 方法的异常(空指针)。不过,我也尝试弄清楚如何设计卡片布局,例如卡片并排或一张在下。我更喜欢后者。我已经尝试更改我的代码并阅读有关类
所以我有一个带有 CardLayout 的 JPanel。正如预期的那样,此 CardLayout 管理框架中面板的切换。切换是通过两个按钮完成的:“后退”和“下一步”。 我想知道当它位于最后一张卡上
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我知道这个问题之前已经被问过,但我似乎无法让答案起作用,也不理解它们。 我想做的是交换按钮单击的面板。这是我的主要功能: public class CreateWindow extends JFram
我是一名优秀的程序员,十分优秀!