在Java中添加canvas后无法关闭窗口

(Can't close window after adding canvas in Java)
public class Screen extends Canvas{
private BufferedImage image;
private int height = Toolkit.getDefaultToolkit().getScreenSize().height-37;
private int width = Toolkit.getDefaultToolkit().getScreenSize().width;
private boolean running = false;
public Screen(){
setSize(width, height);
try {image = ImageIO.read(new File("success.jpg"));}
catch (Exception e) {Utilities.showErrorMessage(this, e);}
setVisible(true);
running = true;
}
public void paint(Graphics g){
while(running){
BufferStrategy bs = getBufferStrategy();
if(bs == null){
createBufferStrategy(3);
return;
}
g = bs.getDrawGraphics();
g.drawImage(image,0,0,width,height, null);
g.dispose();
bs.show();
}
}
}

这是我的Game JFrame中的初步显示屏幕,在开始游戏时添加。 代码运行正常,但在添加画布后,我似乎无法通过正常方式退出程序。 (退出按钮)它在菜单中工作正常,是的,我确实在JFrame中设置了defaultCloseOperation。 关于为什么会这样的任何想法?

public class Screen extends Canvas{
private BufferedImage image;
private int height = Toolkit.getDefaultToolkit().getScreenSize().height-37;
private int width = Toolkit.getDefaultToolkit().getScreenSize().width;
private boolean running = false;
public Screen(){
setSize(width, height);
try {image = ImageIO.read(new File("success.jpg"));}
catch (Exception e) {Utilities.showErrorMessage(this, e);}
setVisible(true);
running = true;
}
public void paint(Graphics g){
while(running){
BufferStrategy bs = getBufferStrategy();
if(bs == null){
createBufferStrategy(3);
return;
}
g = bs.getDrawGraphics();
g.drawImage(image,0,0,width,height, null);
g.dispose();
bs.show();
}
}
}
This is a preliminary display screen within my Game JFrame that is added upon starting the game. Code runs fine but after adding the canvas, I can't seem to exit the program through normal means. (exit button) It worked fine in the menu and yes, I did set the defaultCloseOperation in the JFrame. Any ideas on why this might be?

原文:https://stackoverflow.com/questions/23861048

2020-04-05 22:04

满意答案

这个...
public void paint(Graphics g){
while(running){
BufferStrategy bs = getBufferStrategy();
if(bs == null){
createBufferStrategy(3);
return;
}
g = bs.getDrawGraphics();
g.drawImage(image,0,0,width,height, null);
g.dispose();
bs.show();
}
}

不是应该如何定制绘画。 基本上这是阻止事件队列,这意味着,除了能够响应新的绘制事件,它阻止它处理任何新事件。

在这种情况下,最好创建一个单独的Thread并在该Thread的run方法中执行此操作。

有关详细信息,请查看AWT和Swing中的绘画

This...
public void paint(Graphics g){
while(running){
BufferStrategy bs = getBufferStrategy();
if(bs == null){
createBufferStrategy(3);
return;
}
g = bs.getDrawGraphics();
g.drawImage(image,0,0,width,height, null);
g.dispose();
bs.show();
}
}
Is not how custom painting should be done. Basically what this is blocking the Event Queue, which means, apart from been able to respond to new paint events, it's preventing it from processing any new events.
In this case, it would be better to create a separate Thread and perform this action within that Thread's run method.
Have a look at Painting in AWT and Swing for more details
2014-05-26

相关问答

Bitmap one = Bitmap.createBitmap(bmp);

在上面的代码中, bmp是一个Bitmap,你要从bmp创建另一个Bitmap对象。 删除该行并尝试更改 canvas.drawBitmap(one,0,0,null);

至 canvas.drawBitmap(bmp,0,0,null);

Bitmap one = Bitmap.createBitmap(bmp);

In the above code bmp is a Bitmap and you are cr...

将画布位置设置为absolute 。 还要确保没有填充或包含元素中设置的页边距。 这是我在全屏幕画布演示中

使用的内容。 body, html {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
canvas {
position:absolute;
}

全屏演示 Set the the canvas position to absolute. Also ma...

确实可以将Canvas对象添加到JPanel 。 您的问题在于您的Canvas没有定义的大小。 你需要的是以下两行 canvas.setPreferredSize(new Dimension(1300,300));

/*
*
*/
this.pack();

这会将画布放在panelCanvas边框内,在浅灰色背景上显示黑色垂直线。 It is indeed possible to add a Canvas object to a JPanel. You...

如果您使用的是JFrame,那么您有两种选择: 首先将您自己的组件添加到JPanel,然后将其添加到JFrame。 您可以从JComponent继承,而不是从java.awt.Canvas继承。 然后你必须在paintComponent()方法中完成所有的绘制,而不是仅仅使用paint()(你可以重命名你当前的绘制方法)。 在这两种情况下,您现在都可以使用可从BorderFactory获取的setBorder()方法(在JPanel或组件上)设置边框。 另见: 如何使用边界 If you are ...

尝试这个: canvas.setBounds(0, 0, 500, 600); //instead of 700 for height, your Canvas has height 600

Try this: canvas.setBounds(0, 0, 500, 600); //instead of 700 for height, your Canvas has height 600

虽然不清楚你想要做什么。 但是您需要将MouseMotionListener添加到画布而不是JFrame 。 由于您要向JFrame添加画布,因此应该捕获MouseEvents的canvas 。 因此,你的Wintest应该看起来像这样: public clas

s WinTest extends Canvas {
private static final long serialVersionUID = -369751247370351003L;
public WinTest(int h, in...
获取顶级窗口: public void actionPerformed(ActionEvent e) {
JComponent comp = (JComponent) e.getSource();
Window win = SwingUtilities.getWindowAncestor(comp);
win.dispose();
}

确保JFrame的默认关闭操作已设置为JFrame.DISPOSE_ON_CLOSE (首选)或JFrame.EXIT_ON_CLOSE (不是首选)...

这不是必需的; picture.paint(picture.getGraphics());

如果组件尚未自行绘制,则getGraphics将返回null 。 你应该避免使用这种方法,它只是当前组件图形状态的快照(在你的情况下是什么都没有) 您无法控制绘制过程,这取决于重绘管理器。 您可以通过repaint方法请求更新。 在AWT和Swing中阅读绘画 你应该避免将重量级(帆布)和轻量级组件(JFrame)混合在一起,如果可能的话,你应该坚持使用Swing组件 This is not requir...

不要使用Canvas。 而是扩展JPanel 并覆盖JPanel的paintComponent方法,而不是paint方法(为什么不覆盖方法?你对它们内部绘画的反对意见是什么?)。 谷歌Java Swing绘画教程并通过它们。 这是链接 。 通过在组件上调用getGraphics() ,您将获得一个可能在当时正常工作的短暂图形上下文,但如果发生任何重新绘制(并且这些不在您的控制之下)将无法工作,从而导致程序图形失败或NullPointerException。 你应该避免这样做,除非你迫切需要并知道你...

这个... public void paint(Graphics g){
while(running){
BufferStrategy bs = getBufferStrategy();
if(bs == null){
createBufferStrategy(3);
return;
}
g = bs.getDrawGraphics();
g.drawImage(...

相关文章

当hibernate设置采用JDBC事务,事务上下文设置为thread的时候,将transaction

...

« Java 简介 Java基础语法 » Java开发环境配置 在

...

内容摘要:Canvas 中 clearRect 清除函数;setInterval与clearInter

...

内容摘要:HTML5 Canvas 部分线条事件,JQuery 部分鼠标事件,然后利用这些知识制作一个

...

解决Window环境下启动Hadoop时出现的 java.lang.NoClassDefFoundEr

...

当前屏幕分辨率为1280*1024,IE7下使用 window.open('', '', 'left

...

1、下载redis的window版本 下载地址: https://github.com/Service

...

最近在研究画图的东西,像PicSay这个涂鸦软件,应该是在canvas上进行画的,不知道怎么存储成图片

...

内容摘要:Canvas标签定义,并获得坐标;画矩形,定义颜色,透明度;画直线,定义连接,节点;画圆,定

...

最新问答

如果启用了复制处理程序,请确保将其置于其中一个安全角色之后。 我见过人们做的另一件事是在不同的端口上运行admin。 最好在需要auth的页面上使用SSL,这样你就不会发送明确的密码,因此管理和复制将发生在8443上,而常规查询将在8080上发生。 如果您要签署自己的证书,请查看此有用的SO页面: 如何在特定连接上使用不同的证书? I didn't know that /admin was the context for SOLR admin because /admin does not re

第一:在您的样本中,您有: 但是你在询问 //td[@class=‘CarMiniProfile-TableHeader’] (注意TableHeader中的大写'T')。 xpath区分大小写。 第二:通过查询// td [@ class ='CarMiniProfile-TableHeader'] / td,你暗示你在外部td中有一个'td'元素,而它们是兄弟姐妹。 有很多方法可以在这里获得制作和模型

这是你的答案: http://jsfiddle.net/gPsdk/40/ .preloader-container { position: absolute; top: 0px; right: 0px; bottom: 0px; left: 0px; background: #FFFFFF; z-index: 5; opacity: 1; -webkit-transition: all 500ms ease-out;

问题是,在启用Outlook库引用的情况下, olMailItem是一个保留常量,我认为当您将Dim olMailItem as Outlook.MailItem ,这不是问题,但是尝试设置变量会导致问题。 以下是完整的解释: 您已将olMailItem声明为对象变量。 在赋值语句的右侧,在将其值设置为对象的实例之前,您将引用此Object 。 这基本上是一个递归错误,因为你有对象试图自己分配自己。 还有另一个潜在的错误,如果之前已经分配了olMailItem ,这个语句会引发另一个错误(可能是

我建议使用wireshark http://www.wireshark.org/通过记录(“捕获”)设备可以看到的网络流量副本来“监听”网络上发生的对话。 当您开始捕获时,数据量似乎过大,但如果您能够发现任何看起来像您的SOAP消息的片段(应该很容易发现),那么您可以通过右键单击并选择来快速过滤到该对话'关注TCP Stream'。 然后,您可以在弹出窗口中查看您编写的SOAP服务与Silverlight客户端之间的整个对话。 如果一切正常,请关闭弹出窗口。 作为一个额外的好处,wireshar

Android默认情况下不提供TextView的合理结果。 您可以使用以下库并实现适当的aligntment。 https://github.com/navabi/JustifiedTextView Android Does not provide Justified aligntment of TextView By default. You can use following library and achieve proper aligntment. https://github.com/

你的代码适合我: class apples { public static void main(String args[]) { System.out.println("Hello World!"); } } 我将它下载到c:\ temp \ apples.java。 以下是我编译和运行的方式: C:\temp>javac -cp . apples.java C:\temp>dir apples Volume in drive C is HP_PAV

12个十六进制数字(带前导0x)表示48位。 那是256 TB的虚拟地址空间。 在AMD64上阅读wiki(我假设你在上面,对吗?)架构http://en.wikipedia.org/wiki/X86-64 12 hex digits (with leading 0x) mean 48 bits. That is 256 TB of virtual address space. Read wiki on AMD64 (I assume that you are on it, right?) ar

这将取决于你想要的。 对象有两种属性:类属性和实例属性。 类属性 类属性对于类的每个实例都是相同的对象。 class MyClass: class_attribute = [] 这里已经为类定义了MyClass.class_attribute ,您可以使用它。 如果您创建MyClass实例,则每个实例都可以访问相同的class_attribute 。 实例属性 instance属性仅在创建实例时可用,并且对于类的每个实例都是唯一的。 您只能在实例上使用它们。 在方法__init__中定