![](/img/trans.png)
[英]LWJGL java.awt.HeadlessException thrown when making a JFrame
[英]Making Java window without JFrame or AWT
首先,我想让你知道我在网上搜索过但找不到任何东西。 我记得我曾经在上面看到一个线程,但再也找不到了; 很久以前了。
我想知道如何在没有 JFrame 或 AWT 的情况下制作我自己的窗口。 我搜索的每个地方都只向我展示了库和预制代码,但我无法了解它在内部是如何工作的。 我想知道如何在没有 Java 已经给我的情况下构建一个窗口。
Java 的好处和坏处是 Java 使开发人员的工作变得容易,所以,这就是为什么我尝试 C,搜索汇编代码并试图找到一种方法来做到这一点,但所有方法都使用库。
那为什么,我想知道,它甚至可能吗? 不需要所有的窗口,只需要它的基础,甚至屏幕上的像素,但不包括使用更多的库或为此构建的类,每个人都使用只是因为这是他们唯一知道的东西.
感谢所有帮助我并回答我的问题的人:)
在 Java 中,我们依赖于与本机操作系统的绑定。 我们有抽象框架的原因,比如 AWT、Swing、JavaFX、SWT 是因为完成这个过程的过程并不简单,特别是如果你真的想以某种有意义的方式在这些表面上绘画,并且当你考虑不同的可用操作系统的要求。
取决于您实际想要实现的目标,将取决于您将采用的方式,例如......
使用JWindow
或未修饰的JFrame
。 这为您提供了一个可用的绘画表面和一个连接到一个现成的事件队列(消息循环)。
这两个窗口向您展示了一个没有装饰的“空”矩形。 在处理这些类型的窗户时,您可以直接或通过自定义外观提供自己的装饰。
直接使用 JNI(本机)绑定到操作系统中,这将允许您要求操作系统创建您自己的窗口。 这意味着您要负责确定将如何绘制到窗口、如何处理来自操作系统的针对您的窗口的消息(事件)以及所有其他注意事项。
看看JNA Win32WindowDemo.java
或者如果你真的想变得时髦,你也可以看看......
作为一些额外的绑定到本地图形库
你可以只使用消息对话框。 我知道我制作了一个完全脱离它们的程序。
这是我不久前制作的一个石头剪刀布程序,它在选项窗格之外运行。
import java.util.Random;
import javax.swing.JOptionPane;
public class AI
{
public static void main(String[] args)
{
Random generator = new Random();
int scan = 0;
String bool = "";
int rps;
String type = "";
int option;
int counter = 0;
String stuff = "";
int cpu = 0;
int foo = 0;
int total = 0;
while (true)
{
while(true)
{
type = JOptionPane.showInputDialog("Choose what game you would like to play. \n best of 3 \n best of 5 \n best of 7 \n first to 10");
stuff = type.toLowerCase();
if (stuff.equals ("best of 3"))
{
option = JOptionPane.showConfirmDialog(null, "Play a best of 3 game?", "Exit", JOptionPane.YES_NO_OPTION);
break;
}
else if (stuff.equals ("best of 5"))
{
option = JOptionPane.showConfirmDialog(null, "Play a best of 5 game?", "Exit", JOptionPane.YES_NO_OPTION);
break;
}
else if (stuff.equals ("best of 7"))
{
option = JOptionPane.showConfirmDialog(null, "Play a best of 7 game?", "Exit", JOptionPane.YES_NO_OPTION);
break;
}
else if (stuff.equals ("first to 10"))
{
option = JOptionPane.showConfirmDialog(null, "Play a game to 10?", "Exit", JOptionPane.YES_NO_OPTION);
break;
}
else
{
continue;
}
}
if (stuff.equals("best of 3"))
foo = 3;
else if (stuff.equals("best of 5"))
foo = 5;
else if (stuff.equals("best of 7"))
foo = 7;
else if (stuff.equals("first to 10"))
foo = 10;
for (int i = 0; i <= foo; i++)
{
while(true)
{
scan = Integer.parseInt(JOptionPane.showInputDialog ("Enter a number between 1 and 3. \n 1: rock\n 2: paper\n 3: scissors"));
if (scan == 1)
{
JOptionPane.showMessageDialog(null,"You chose rock.");
break;
}
else if (scan == 2)
{
JOptionPane.showMessageDialog(null,"You chose paper.");
break;
}
else if (scan == 3)
{
JOptionPane.showMessageDialog(null,"You chose scissors.");
break;
}
else
{
JOptionPane.showMessageDialog(null,"Choose a valid number");
continue;
}
}
rps = generator.nextInt(3) + 1;
String str;
if (rps == 1)
{
str = "The cpu chose rock!";
}
else if (rps == 2)
{
str = "The cpu chose paper!";
}
else
{
str = "The cpu chose scissors!";
}
JOptionPane.showMessageDialog(null,str);
if (rps == 1 && scan == 2)
{
JOptionPane.showMessageDialog(null,"you won!");
counter++;
total++;
}
else if (rps == 2 && scan == 3)
{
JOptionPane.showMessageDialog(null,"you won!");
counter++;
total++;
}
else if (rps == 3 && scan == 1)
{
JOptionPane.showMessageDialog(null,"you won!");
counter++;
total++;
}
else if (rps == scan)
{
JOptionPane.showMessageDialog(null,"Try again!");
continue;
}
else
{
JOptionPane.showMessageDialog(null,"you lose!");
cpu++;
total++;
}
if(stuff.equals("best of 3") && counter == 2 || cpu ==2)
{
break;
}
else if (stuff.equals("best of 5") && counter==3 || cpu == 3)
{
break;
}
else if (stuff.equals("best of 7") && counter == 4 || cpu == 4)
{
break;
}
else if (stuff.equals("first to 10") && counter == 10 || cpu ==10)
{
break;
}
}
bool = JOptionPane.showInputDialog ("do you want play another game? \n Type in yes or no");
if (bool.equals("yes"))
continue;
else if (bool.equals("no"))
break;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.