没有使用JFrame或AWT制作Java窗口

3
首先,我想让您知道,我已经在网上搜索了相关信息,但没有找到任何内容。 我记得曾经看到过一个帖子,但现在找不到了;那是很久以前的事情了。
我想知道如何制作自己的窗口,而不使用JFrame或AWT。 无论我在哪里搜索,都只会显示库和预先制作的代码,但我学不会内部工作原理。 我想知道如何构建一个窗口,而不是使用Java已经提供给我的东西。
Java的好处和坏处是Java为开发人员简化了事情, 所以,这就是为什么我尝试了C语言,搜索汇编代码,并试图找到一种方法来做到这一点,但所有方法都使用了库。
因此,我想知道,这是否可能? 不需要所有的窗口,只需要基础部分甚至屏幕上的像素,但某些东西将不包括使用更多的库或专门为此构建的类,所有人都使用它,只是因为这是他们唯一熟悉的东西。
感谢每个能帮助我并回答我的问题的人 :)

2
Java依赖于来自多个不同操作系统的功能可用性,可用的AWT、Swing和JavaFX框架将出现在操作系统之间的复杂性和差异抽象成一个可用的包,开发人员不再需要关心窗口是如何创建的,只需要确保它以特定方式运行。如果您想创建自己的框架,唯一的解决方案是使用JNI/JNA。这将引出一个问题:“您将如何绘制到此窗口?” - MadProgrammer
2
这个问题引发了更多的问题。如果你想要这样做,那么为什么要使用Java?为什么不使用像C/Objective C/Swift这样的语言,利用操作系统级别提供的本地库直接访问系统?除非你要编写自己的操作系统,否则你总是会通过一些API/库层进行操作,这就是重点。 - MadProgrammer
@MadProgrammer 即使在 C 中,我也只看到了库,没有找到没有库的方法。只要我能理解其内部结构并不会在不知道自己在做什么的情况下使用类/库,我也不介意选择另一种语言。 - user2635439
2
但这正是我的观点,窗口是由操作系统提供的,它为开发人员提供了创建此功能的库。操作系统管理事件通知/消息处理过程,并提供开发人员/窗口实际绘制的手段。即使您编写了自己的操作系统,也会受到硬件驱动程序库的限制... - MadProgrammer
@MadProgrammer 好的,那我会使用操作系统库,但即使如此,我仅看到创建窗口的简单代码,只需提供宽度、高度和标题。我该如何“绘制”自己的窗口,而不是使用已经为我的准备好的窗口? - user2635439
显示剩余4条评论
2个回答

3
在Java中,我们依赖于对本地操作系统的绑定。AWT、Swing、JavaFX、SWT等抽象框架的原因是这一过程并不简单,特别是如果你想以某种有意义的方式绘制到这些表面上,而且考虑到可用操作系统的不同要求,这种复杂性会更加增强。
取决于你实际想要实现什么,将决定你将采取哪种方法,例如...

你可以...

使用一个JWindow或无装饰的JFrame。这为您提供了一个可用的绘图表面和一个连接到准备好的事件队列(消息循环)。
这两个窗口向您呈现一个没有装饰的矩形。当处理这些类型的窗口时,您可以直接提供自己的装饰或通过自定义外观来提供。

你可以...

直接使用JNI(native)绑定到操作系统,这将使您能够要求操作系统创建自己的窗口。这意味着您需要负责确定如何绘制到窗口、如何处理针对您的窗口的来自操作系统的消息(事件)以及所有其他考虑因素。
请查看 JNA Win32WindowDemo.java 或者如果你真的想玩得有趣,你也可以看看... 作为一些附加到本地图形库的绑定。

-1

你可以使用消息对话框。我知道我曾经制作了一个完全依赖于它们运行的程序。

这是一个石头剪刀布游戏程序,我之前做的程序完全基于选项面板运行。

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;

    }
    }

}


这不是我的本意,我想创建一个窗口并清楚自己在做什么,而不是使用给我的课程而不知道自己在做什么。 - user2635439

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接