- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
标题说明了一切...我和我的 friend 正在这样做,我们不知道为什么 Ball.java 实际上没有在 gamePanel 中制作球,然后制作 GUI。顺便说一句,这是 8 球台球。这是代码:
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
public class Final2 implements ActionListener {
JPanel titlePanel, gamePanel, buttonPanel;
JLabel titleLabel, turnLabel, oneTypeLabel, twoTypeLabel;
JButton newGameButton;
int turn;
String oneType,twoType;
public JPanel createContentPane() {
turn = 0;
oneType = "";
twoType = "";
JPanel totalGUI = new JPanel();
totalGUI.setLayout(null);
titlePanel = new JPanel();
titlePanel.setLayout(null);
titlePanel.setLocation(10,0);
titlePanel.setSize(500,100);
totalGUI.add(titlePanel);
titleLabel = new JLabel("8-ball Pool");
titleLabel.setLocation(25,10);
titleLabel.setSize(100,20);
titleLabel.setHorizontalAlignment(0);
titleLabel.setForeground(Color.red);
titlePanel.add(titleLabel);
gamePanel = new gamePanel();
gamePanel.setLayout(null);
gamePanel.setLocation(200,250);
gamePanel.setSize(864,432); //this needs to be turned into 864x432 later
gamePanel.setBorder(BorderFactory.createLineBorder(Color.black));
totalGUI.add(gamePanel);
buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());
buttonPanel.setLocation(900,40);
buttonPanel.setSize(200,40);
totalGUI.add(buttonPanel);
turnLabel = new JLabel("" + turn);
turnLabel.setHorizontalAlignment(0);
titlePanel.add(turnLabel);
oneTypeLabel = new JLabel(oneType);
oneTypeLabel.setHorizontalAlignment(0);
oneTypeLabel.setForeground(Color.red);
buttonPanel.add(oneTypeLabel);
twoTypeLabel = new JLabel(twoType);
twoTypeLabel.setHorizontalAlignment(0);
twoTypeLabel.setForeground(Color.blue);
buttonPanel.add(twoTypeLabel);
newGameButton = new JButton("New Game");
newGameButton.addActionListener(this);
buttonPanel.add(newGameButton);
return totalGUI;
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == newGameButton) {
}
}
public static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("8-ball Pool!");
//Create and set up the content pane.
Final gui = new Final();
frame.setContentPane(gui.createContentPane());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1000, 1500);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
} }
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
public class gamePanel extends JPanel {
private boolean setup = true;
public gamePanel() { setOpaque(true); setBackground(Color.GREEN);
}
public void paintComponent(Graphics g) { /* Graphics2D g2 = (Graphics2D) g; Ellipse2D circle = new Ellipse2D.Double(100 - 18,100
-18,18,18); g2.setColor(Color.BLUE); g2.draw(circle); Rectangle2D rect = new Rectangle2D.Double(100 - 18,100 -5,18,5);
g2.setColor(Color.WHITE); g2.draw(rect); */
super.paintComponent(g); //column 1 //1 /*
g.setColor(Color.BLACK); g.drawOval(624,206,20,20);
g.setColor(Color.YELLOW); g.fillOval(625,207,18,18);
//column 2 //14 g.setColor(Color.BLACK);
g.drawOval(644,196,20,20); g.setColor(Color.GREEN);
g.fillOval(645,197,18,18);
//4 g.setColor(Color.BLACK); g.drawOval(644,216,20,20);
g.setColor(Color.MAGENTA); g.fillOval(645,217,18,18);
g.setColor(Color.WHITE); g.fillRect(645 + 7,217,5,18);
//column 3 //5 g.setColor(Color.BLACK); g.drawOval(664,186,20,20);
g.setColor(Color.ORANGE.darker()); g.fillOval(665,187,18,18);
g.setColor(Color.WHITE); g.fillRect(665 + 7,187,5,18);
//8 g.setColor(Color.BLACK); g.drawOval(664,206,20,20);
g.setColor(Color.BLACK); g.fillOval(665,207,18,18);
//13 g.setColor(Color.BLACK); g.drawOval(664,226,20,20);
g.setColor(Color.ORANGE.darker()); g.fillOval(665,227,18,18);
//column 4 //11 g.setColor(Color.BLACK);
g.drawOval(684,176,20,20); g.setColor(Color.RED);
g.fillOval(685,177,18,18); g.setColor(Color.WHITE); g.fillRect(685
+ 7,177,5,18);
//2 g.setColor(Color.BLACK); g.drawOval(684,196,20,20);
g.setColor(Color.BLUE); g.fillOval(685,197,18,18);
//12 g.setColor(Color.BLACK); g.drawOval(684,216,20,20);
g.setColor(Color.MAGENTA); g.fillOval(685,217,18,18);
//9 (looks suspiciously like solid yellow) g.setColor(Color.BLACK);
g.drawOval(684,236,20,20); g.setColor(Color.YELLOW);
g.fillOval(685,237,18,18); g.setColor(Color.WHITE); g.fillRect(685
+ 7,237,5,18);
//column 5 //7 g.setColor(Color.BLACK);
g.drawOval(704,166,20,20);
g.setColor(Color.ORANGE.darker().darker().darker().darker());
g.fillOval(705,167,18,18);
//10 g.setColor(Color.BLACK); g.drawOval(704,186,20,20);
g.setColor(Color.BLUE); g.fillOval(705,187,18,18);
g.setColor(Color.WHITE); g.fillRect(705 + 7,187,5,18);
//15 g.setColor(Color.BLACK); g.drawOval(704,206,20,20);
g.setColor(Color.ORANGE.darker().darker().darker().darker());
g.fillOval(705,207,18,18); g.setColor(Color.WHITE); g.fillRect(705
+ 7,207,5,18);
//3 g.setColor(Color.BLACK); g.drawOval(704,226,20,20);
g.setColor(Color.RED); g.fillOval(705,227,18,18);
//6 g.setColor(Color.BLACK); g.drawOval(704,246,20,20);
g.setColor(Color.GREEN); g.fillOval(705,247,18,18);
g.setColor(Color.WHITE); g.fillRect(705 + 7,247,5,18);
//the almighty cue ball g.setColor(Color.BLACK);
g.drawOval(304,206,20,20); g.setColor(Color.WHITE);
g.fillOval(305,207,18,18); */ if (setup) {
setup = false;
//column 1
//1
Ball ball1 = new Ball(1,624,206);
this.add(ball1);
this.update(this.getGraphics()); //this breaks everything yay
//column 2
//6
Ball ball6 = new Ball(6,644,196);
//12
Ball ball12 = new Ball(12,644,216);
//column 3
//13
Ball ball13 = new Ball(13,664,186);
//8
Ball ball8 = new Ball(8,664,206);
//5
Ball ball5 = new Ball(5,664,226);
//column 4
//11
Ball ball11 = new Ball(11,684,176);
//2
Ball ball2 = new Ball(2,684,196);
//4
Ball ball4 = new Ball(4,684,216); }
} }
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;
import java.awt.Color;
public class Ball extends gamePanel {
private int xcor,ycor;
private int rxcor,rycor,radius;
private int num;
public Ball(int n,int x,int y) {
num = n;
xcor = x;
ycor = y;
radius = 9;
this.setVisible(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
boolean isStriped = (num 8);
int color = num%8;
if (color == 0) {
if (isStriped) {
//8ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.BLACK);
g.fillOval(xcor+1,ycor+1,18,18);
}
else {
//cue ball is 16
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.WHITE);
g.fillOval(xcor+1,ycor+1,18,18);
}
}
else {
if (color == 1) {
if (isStriped) {
//9ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.WHITE);
g.fillOval(xcor+1,ycor+1,18,18);
g.setColor(Color.YELLOW);
g.fillOval(xcor+8,ycor+1,5,18);
}
else {
//1ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.YELLOW);
g.fillOval(xcor+1,ycor+1,18,18);
}
}
else {
if (color == 2) {
if (isStriped) {
//10ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.WHITE);
g.fillOval(xcor+1,ycor+1,18,18);
g.setColor(Color.BLUE);
g.fillOval(xcor+8,ycor+1,5,18);
}
else {
//2ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.BLUE);
g.fillOval(xcor+1,ycor+1,18,18);
}
}
else {
if (color == 3) {
if (isStriped) {
//11ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.WHITE);
g.fillOval(xcor+1,ycor+1,18,18);
g.setColor(Color.RED);
g.fillOval(xcor+8,ycor+1,5,18);
}
else {
//3ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.RED);
g.fillOval(xcor+1,ycor+1,18,18);
}
}
else{
if (color == 4) {
if (isStriped) {
//12ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.WHITE);
g.fillOval(xcor+1,ycor+1,18,18);
g.setColor(Color.MAGENTA);
g.fillRect(xcor+8,ycor+1,5,18);
}
else {
//4ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.MAGENTA);
g.fillRect(xcor+1,ycor+1,18,18);
}
}
else {
if (color == 5) {
if (isStriped) {
//13ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.WHITE);
g.fillOval(xcor+1,ycor+1,18,18);
g.setColor(Color.ORANGE.darker());
g.fillRect(xcor+8,ycor+1,5,18);
}
else {
//5ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.ORANGE.darker());
g.fillOval(xcor+1,ycor+1,18,18);
}
}
else {
if (color == 6) {
if (isStriped) {
//14ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.WHITE);
g.fillOval(xcor+1,ycor+1,18,18);
g.setColor(Color.GREEN);
g.fillOval(xcor+8,ycor+1,5,18);
}
else {
//6ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.GREEN);
g.fillOval(xcor+1,ycor+1,18,18);
}
}
else {
if (color == 7) {
if (isStriped) {
//15ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.WHITE);
g.fillOval(xcor+1,ycor+1,18,18);
g.setColor(Color.ORANGE.darker().darker().darker().darker());
g.fillOval(xcor+8,ycor+1,5,18);
}
else {
//7ball
g.setColor(Color.BLACK);
g.drawOval(xcor,ycor,20,20);
g.setColor(Color.ORANGE.darker().darker().darker().darker());
g.fillOval(xcor+1,ycor+1,18,18);
}
}
}
}
}
}
}
}
}
}
}
最佳答案
事情是这样的。您不希望将一堆 JPanel
作为球。您应该只使用一个 JPanel
进行绘制,并仅为所有球使用该一个 paintComponent
方法。所以你的 Ball 类根本不需要扩展任何东西。 Ball 类应该只是保存数据的模型,例如 RGB 颜色。您还应该在球类中使用一个绘制方法,该方法采用Graphics
对象作为参数,并绘制球
public class Ball {
int R, G, B;
boolean striped;
int x, y;
public Ball(int R, int G, int B, boolean striped) {
this.R = R:
this.G = G;
this.B = B;
this.striped = striped;
}
public void drawBall(Graphics g) {
if (isStriped) {
// draw the ball with the values from this class
}
else {
// draw the ball with the values from this class
}
}
}
然后在您进行实际绘图的类中,您想要一个 Ball
对象列表
public class TablePanel extends JPanel {
List<Ball> balls = new ArrayList<Ball>();
public TablePanel(){
makeBalls();
}
public void makeBalls(){
balls.add(new Ball(213, 2, 255, true);
// add more balls
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Ball ball : balls) {
ball.drawBall(g);
}
}
}
你可以看到我所做的只是使用方法ball.drawBall(g);
。球就会出现。但您还需要指定球的 x
和 y
位置。然后,当您需要为球设置动画时,只需更改它们的 x
和 y
字段即可。
这是一个例子
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class SorryPoolTable extends JPanel{
List<ABall> balls = new ArrayList<ABall>();
public SorryPoolTable(){
makeBalls();
}
public void makeBalls(){
balls.add(new ABall(213, 2, 255, true, 125, 25));
balls.add(new ABall(65, 34, 25, true, 150, 135));
balls.add(new ABall(124, 211, 45, true, 160, 180));
balls.add(new ABall(35, 123, 255, true, 200, 200));
balls.add(new ABall(45, 222, 255, true, 50, 200));
balls.add(new ABall(65, 92, 155, true, 125, 175));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (ABall ball : balls) {
ball.drawBall(g);
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 300);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
JFrame frame = new JFrame("Sorry Pool Table");
frame.add(new SorryPoolTable());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
class ABall {
int R, G, B;
boolean striped;
int x, y;
public ABall(int R, int G, int B, boolean striped, int x, int y) {
this.R = R;
this.G = G;
this.B = B;
this.striped = striped;
this.x = x;
this.y = y;
}
public void drawBall(Graphics g) {
g.setColor(new Color(R, G, B));
g.fillOval(x, y, 20, 20);
}
}
<小时/>
更新
MouseMotionListener
示例。这是一个非常简单的例子。棍子不旋转或什么都没有。看看Graphics2D tutorial有关如何实现此目的的更复杂的详细信息
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class PoolStick extends JPanel{
int x = 100;
int y = 100;
public PoolStick() {
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
Point p = e.getPoint();
x = (int)p.getX();
y = (int)p.getY();
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillRect(x, y, 5, 200);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 300);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
JFrame frame = new JFrame("Sorry Pool Table");
frame.add(new PoolStick());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
关于java - 如何使用 GUI - 使用 PaintComponent() 初始化 GUI,然后添加基于鼠标的 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21336141/
我有一个无 GUI 的服务器(没有任何桌面环境或 Ubuntu 服务器的新鲜 Debian,没有 X 服务器,先验)。 我考虑安装 docker 并拉取一个基于官方 Ubuntu 的容器,并在其上添加
我正在构建一个带有临时用户名系统的简单聊天服务器。当屏幕弹出时,首先会出现一个简单的屏幕,询问您的用户名。你可以放入任何你想要的东西,这纯粹是暂时的(我也在尝试)。代码告诉程序继续,将用户名保存到代码
我想将来自其他类的图像显示到 QLabel 中,但要通知 GUI 有一个新的框架可用。我需要从非 GUI 类和非 GUI 线程发出信号。 有什么办法吗? 最佳答案 signal 可以从任何继承QObj
我正在用 Java 编写一个图形用户界面,它有一些按钮,其中一个按钮是选项。我想要它,所以当您单击选项时,它会将 gui 更改为我的选项 gui,而不是在另一个窗口中打开它。 我该怎么做? 最佳答案
标题说明了一切...我和我的 friend 正在这样做,我们不知道为什么 Ball.java 实际上没有在 gamePanel 中制作球,然后制作 GUI。顺便说一句,这是 8 球台球。这是代码: 驱
我正在使用 GUI 构建器,我想知道是否有一种简单的方法可以通过当前主窗口打开寄存器窗口(引用下面的页面)。我正在尝试通过菜单栏来执行此操作。 我一整天都在尝试,因为 GUI Builder 生成了一
我有一个程序使用了许多隐藏的 GUI 组件。例如,所有菜单项和打印机对话框/组件(仅占用至少 50 毫秒)。总的来说,我猜整个程序启动的大约 300 毫秒(或 40%)要归功于所有隐藏的东西。 我想做
我对 GUI 构建比较陌生。 我想制作一个带有按钮(我已经有了)的 GUI,用户可以按下该按钮并选择一个图像,然后动态地将该图像加载到面板中的 GUI 中。我希望每次用户浏览图像时图像都动态变化。 到
我有两年使用 Java 和 Visual Studio 进行企业应用程序编程的经验,而且我是 Python 和 wxPython 的新手。所以我的问题是:wxPython 能否为我提供足够丰富的 GU
这是我启动 mkvtoolnix-gui 时遇到的错误: mkvtoolnix-gui: symbol lookup error: mkvtoolnix-gui: undefined symbol:
我在初始屏幕上有一些最近使用的存储库,我想删除它们,因为我不再使用它们了。如何删除它们? 操作系统 = Windows 7 我查看了注册表并搜索了 git 目录,但找不到最近使用列表的存储位置。 最佳
我正在尝试在 matlab、GUI 中用户输入点作为输入和它们之间的连接。 我有 5 个 matlab 文件 - screen1.m、screen2.m、screen3.m、screen4.m、glo
我用java制作了一个客户端/服务器程序,我已经按照我想要的方式使用cmd完美地工作了,现在我正在尝试将代码的客户端转换为GUI,但是我在打印时遇到问题客户端消息并从文本字段和服务器消息读取客户端输入
我正在制作一种 CRUD 应用程序(Java GUI,MYSQL)我应该: 将数据从数据库加载到List(例如),然后将List加载到GUI 将数据从数据库加载到对象(具有 SQL 表等属性)和对象到
我正在开发一个有 5 个图形用户界面窗口的 Java 应用程序,其中一个是问候窗口或主窗口,我已经完成了所有逻辑部分的工作,我已经完成了 99.99%,唯一剩下的就是我如何以这种方式编码,当我点击一个
我目前正在开发 GUI。 我选择将我的 GUI 基于 bluej 项目 - Scribble。 当您创建 ScribbleGUI 对象时,DrawDemo 类会创建一个同时自动打开的 Canvas 。
在这里阅读了很多关于多进程、管道等的内容后,我还没有找到答案,但如果它已经存在,我深表歉意。 我有一个外围硬件,我正在尝试为其创建一个 GUI。我想让 GUI 使用来自外围设备的数据不断更新,同时仍保
我想做的是将 GUI 从一个单独文件中的类链接到另一个类。我的第一个类是一个主菜单,它将显示一些链接到另一个窗口的按钮。第二个类显示不同的窗口,但我现在遇到的问题是我不知道如何链接第一个类中的按钮来调
我的 GUI 代码中有一个奇怪的行为。如果用户在短时间内产生大量事件,则可能会发生正在运行的事件处理程序方法被另一个事件处理程序方法中断。由于一切都在同一个线程(GUI 线程)中运行,所以一切都应该按
这是一个涉及风格的问题。我正在寻找可以帮助我解决常见 GUI 设计问题 的想法。该应用程序是在 Winforms 中完成的,宁愿使用 WPF,该应用程序已经完成,但我是一个完美主义者,在与其他人合作时
我是一名优秀的程序员,十分优秀!