- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试用 Java 编写一个简单的 GUI 骰子游戏,名为 HighLow。基本上,用户从 50 英镑的初始余额开始,他们可以选择三种不同的投注金额,如果他们选择“低”,则骰子必须落在 2、3、4、5 或 6 上,并支付 1:1,如果他们选择选择“高”,骰子必须落在 8、9、10、11 或 12 上,赔率为 1:1。如果他们选择 7,则骰子必须落在 7 上,赔率为 4:1。有两个骰子,因此两个骰子的值都应该相加。这不是我问题的重点,只是想我会澄清这一点,以便您了解游戏的重点。
我对面板、事件处理和类似的事情完全陌生,所以我目前正在学习,但在尝试解决这个问题时遇到了一些困难。我有五个类: Dice.java 由 getFaceValue() 和 throwDie() 方法组成,用于模拟骰子的随机 throw 。 DiceFace.java 创建带有点/点的骰子。 DiceFaceViewer.java 是框架类。 DiceFaceComponent 是两个骰子的组件,GamePanel 是所有 JButton 和 JComboBox 等所在的面板。
这就是我到目前为止所做的:创建一个框架,将面板与按钮等粘在一起,并将骰子图像添加到框架中。我想要的是每当我单击“ throw 骰子”按钮时,骰子就会以随机的面重新绘制到框架上。如果我打开和关闭窗口,它现在所做的就是生成一个随机面孔。
骰子
import java.util.Random;
public class Dice {
// Instance variables
private int faceValue;
private int sides;
private Random generator;
public Dice(int s) {
generator = new Random();
sides = s;
faceValue = generator.nextInt(sides) + 1;
}
// Simulates the throw of a die landing on a random face.
public int throwDie() {
return faceValue = (int)(Math.random() * sides) + 1;
}
// Returns the current face value of the die
public int getFaceValue() {
return faceValue;
}
// Set face value of die
public void setValue(int v) {
faceValue = v;
}
}
骰子脸
import java.awt.*;
import java.awt.geom.*;
public class DiceFace {
// Holds the seven possible dot positions on a standard die
private Ellipse2D.Double[] dots = new Ellipse2D.Double[7];
private Rectangle box;
private int xLeft;
private int yTop;
private int side;
private int diceValue;
public DiceFace(int s, int x, int y, int v) {
side = s; // Dimension of dice face
xLeft = x; // xPos
yTop = y; // yPos
diceValue = v; // Pip value
}
public void draw(Graphics2D g2) {
box = new Rectangle(xLeft, yTop, side, side);
makeDots();
// Black background
g2.setColor(Color.BLACK);
g2.fill(box);
// White dots on black
g2.setColor(Color.WHITE);
// Draw dots
if (diceValue == 1)
g2.fill(dots[0]);
else if (diceValue == 2) {
g2.fill(dots[1]); g2.fill(dots[2]);
}
else if (diceValue == 3) {
g2.fill(dots[0]); g2.fill(dots[1]); g2.fill(dots[2]);
}
else if (diceValue == 4) {
g2.fill(dots[1]); g2.fill(dots[2]);
g2.fill(dots[3]); g2.fill(dots[4]);
}
else if (diceValue == 5) {
g2.fill(dots[0]); g2.fill(dots[1]);
g2.fill(dots[2]); g2.fill(dots[3]); g2.fill(dots[4]);
}
else if (diceValue == 6) {
g2.fill(dots[1]); g2.fill(dots[2]); g2.fill(dots[3]);
g2.fill(dots[4]); g2.fill(dots[5]); g2.fill(dots[6]);
}
}
public void makeDots() {
int w = side/6; // Dot width
int h = side/6; // Dot height
dots[0] = new Ellipse2D.Double(xLeft + (2.5 * side)/6,
yTop + (2.5 * side)/6, h, w);
dots[1] = new Ellipse2D.Double(xLeft + (3.75 * side)/6,
yTop + (3.75 * side)/6, h, w);
dots[2] = new Ellipse2D.Double(xLeft + (1.25 * side)/6,
yTop + (1.25 * side)/6, h, w);
dots[3] = new Ellipse2D.Double(xLeft + (1.25 * side)/6,
yTop + (3.75 * side)/6, h, w);
dots[4] = new Ellipse2D.Double(xLeft + (3.75 * side)/6,
yTop + (1.25 * side)/6, h, w);
dots[5] = new Ellipse2D.Double(xLeft + (1.25 * side)/6,
yTop + (2.5 * side)/6, h, w);
dots[6] = new Ellipse2D.Double(xLeft + (3.75 * side)/6,
yTop + (2.5 * side)/6, h, w);
}
}
DiceFaceViewer
import java.awt.*;
import javax.swing.*;
public class DiceFaceViewer {
public static void main(String[] args) {
// Create frame
JFrame frame = new JFrame();
// Set frame attributes
frame.getContentPane().setPreferredSize(new Dimension(360, 320));
frame.pack();
frame.setTitle("High Low");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
// Set location of frame to centre screen
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
int w = frame.getSize().width;
int h = frame.getSize().height;
int x = (dim.width-w)/2;
int y = (dim.height-h)/2;
frame.setLocation(x, y);
DiceFaceComponent component = new DiceFaceComponent();
frame.add(component);
// Add panel to frame
GamePanel panel = new GamePanel();
frame.add(panel, BorderLayout.NORTH);
frame.setVisible(true);
}
}
DiceFaceComponent
import java.awt.*;
import javax.swing.*;
public class DiceFaceComponent extends JComponent {
// Instance variables
private int faceValue1;
private int faceValue2;
public DiceFaceComponent() {
faceValue1 = new Dice(6).getFaceValue();
faceValue2 = new Dice(6).getFaceValue();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
// Recover Graphics2D
Graphics2D g2 = (Graphics2D) g;
DiceFace dice1 = new DiceFace(75, 66, 160, faceValue1); // s, x, y, v
dice1.draw(g2);
repaint();
DiceFace dice2 = new DiceFace(75, 219, 160, faceValue2);
dice2.draw(g2);
repaint();
}
}
游戏面板
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GamePanel extends JPanel {
private int balance = 50;
public GamePanel() {
// Components
JRadioButton highButton = new JRadioButton("High");
JRadioButton lowButton = new JRadioButton("Low");
JRadioButton sevensButton = new JRadioButton("Sevens");
// Button group
ButtonGroup bg = new ButtonGroup();
bg.add(highButton);
bg.add(lowButton);
bg.add(sevensButton);
add(highButton);
add(lowButton);
add(sevensButton);
// Array to hold bet amounts
String betAmounts[] = {"£10", "£5", "£1"};
// Bets combo box
JComboBox bets = new JComboBox(betAmounts);
add(bets);
// Balance
JLabel bal = new JLabel(" Balance: £" + balance);
add(bal);
// Throw dice button
final JButton throwButton = new JButton("Throw Dice");
add(throwButton, FlowLayout.RIGHT);
class Action implements ActionListener {
Dice dice = new Dice(6);
public void actionPerformed(ActionEvent e) {
dice.throwDie();
dice.getFaceValue();
}
}
throwButton.addActionListener(new Action());
}
}
最佳答案
不要在任何paint
方法中调用重绘。这将导致重绘管理器安排另一个重绘事件,最终消耗您的 CPU 并停止您的编程。
而是为更新潜水面值的 Action 监听器调用repaint
。
骰子和骰子 DiceFaceComponent
之间也没有任何联系,它永远不会知道应该绘制什么值。
此外,在您的 DiceFace
类中,我不会在每次抽奖时重新创建“点”,这只是一种浪费。相反,在构造函数中创建它们。
对于 paintComponent
方法也是如此,不必费心重新创建 DiceFace,只需在构造类时创建两个引用并根据需要更新它们的面值即可。
我会使用Dice
作为将所有不同元素联系在一起的基本模型。通过使用诸如 ChangeListerner
之类的东西,Dice
可以通知各个组件发生了更改,从而允许它们更新屏幕
关于java - 如何在 Java 中使用 JButton 重新绘制组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13109532/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!