如何在应用程序中使用javax.swing组件?(How do I use javax.swing components in an application?)

免责声明:我是Java的新手,但我已经构建了13年的.NET应用程序。

我正在尝试构建这个Java应用程序,它为辅导做一些基本的计算。 说实话,这不是一个大的计划,但我甚至无法将它带到Hello, World! 州! 我有一个要求让它变得困难:

GUI应该使用javax.swing组件jButton,jLabel,jTextField,jTextArea,jFrame和jPanel构建。

因此,我下载了NetBeans 7.3并JavaFX in Swing应用程序中创建了一个JavaFX in Swing 。 默认代码显然有效,但它使用Button而不是JButton

private void createScene() {
    Button btn = new Button();
    btn.setText("Say 'Hello World'");
    btn.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            System.out.println("Hello World!");
        }
    });
    StackPane root = new StackPane();
    root.getChildren().add(btn);
    fxContainer.setScene(new Scene(root));
}

因此,当我将其更改为使用JButton我还必须更改root构建的类型。 在我撞到墙壁的时候,我发现了一个使用JRootPane示例 (不直接相关),我认为这可能会取代StackPane 。 所以我重构了这样的代码:

private void createScene() {
    JButton btn = new JButton();
    btn.setText("Say 'Hello World'");
    JRootPane root = new JRootPane();
    root.getContentPane().add(btn);
    fxContainer.setScene(new Scene(root));
}

并且该代码很好,除了fxContainer.setScene(new Scene(root)); 因为root不是Parent

仅供参考,应用程序类实现JApplet并具有如下所示的main init

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
            } catch (Exception e) {
            }

            JFrame frame = new JFrame("Tutoring Calculator");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JApplet applet = new TutoringCalculator();
            applet.init();

            frame.setContentPane(applet.getContentPane());

            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);

            applet.start();
        }
    });
}

@Override
public void init() {
    fxContainer = new JFXPanel();
    fxContainer.setPreferredSize(new Dimension(JFXPANEL_WIDTH_INT, JFXPANEL_HEIGHT_INT));
    add(fxContainer, BorderLayout.CENTER);
    // create JavaFX scene
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            createScene();
        }
    });
}

我如何满足上述要求? 我真的以错误的方式处理这件事吗?

SSCCE

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tutoringcalculator;

import java.awt.BorderLayout;
import java.awt.Dimension;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JRootPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

/**
 *
 * @author Owner
 */
public class TutoringCalculator extends JApplet {

    private static final int JFXPANEL_WIDTH_INT = 300;
    private static final int JFXPANEL_HEIGHT_INT = 250;
    private static JFXPanel fxContainer;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                } catch (Exception e) {
                }

                JFrame frame = new JFrame("Tutoring Calculator");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JApplet applet = new TutoringCalculator();
                applet.init();

                frame.setContentPane(applet.getContentPane());

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                applet.start();
            }
        });
    }

    @Override
    public void init() {
        fxContainer = new JFXPanel();
        fxContainer.setPreferredSize(new Dimension(JFXPANEL_WIDTH_INT, JFXPANEL_HEIGHT_INT));
        add(fxContainer, BorderLayout.CENTER);
        // create JavaFX scene
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                createScene();
            }
        });
    }

    private void createScene() {
        JButton btn = new JButton();
        btn.setText("Say 'Hello World'");
        JRootPane root = new JRootPane();
        root.getContentPane().add(btn);
        fxContainer.setScene(new Scene(root));
    }
}

Disclaimer: I am very new to Java, but I've been building .NET applications for 13 years.

I'm trying to build this Java application that does some basic calculations for tutoring. It's honestly not that big of a program, but I can't even get it to the Hello, World! state! I have a requirement that's making it difficult:

GUI should be built using javax.swing components jButton, jLabel, jTextField, jTextArea, jFrame, and jPanel.

So, I downloaded NetBeans 7.3 and created a JavaFX in Swing application. The default code obviously works but it uses Button instead of JButton:

private void createScene() {
    Button btn = new Button();
    btn.setText("Say 'Hello World'");
    btn.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            System.out.println("Hello World!");
        }
    });
    StackPane root = new StackPane();
    root.getChildren().add(btn);
    fxContainer.setScene(new Scene(root));
}

so I when I change it to use a JButton I have to also change the type the root is built from. While banging my head against the wall I found an example here (not directly related) that used the JRootPane and I thought that might work in place of the StackPane. So I refactored the code like this:

private void createScene() {
    JButton btn = new JButton();
    btn.setText("Say 'Hello World'");
    JRootPane root = new JRootPane();
    root.getContentPane().add(btn);
    fxContainer.setScene(new Scene(root));
}

and that code is fine except for fxContainer.setScene(new Scene(root)); because root isn't a Parent.

FYI, the application class implements JApplet and has a main and init that looks like this:

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
            } catch (Exception e) {
            }

            JFrame frame = new JFrame("Tutoring Calculator");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JApplet applet = new TutoringCalculator();
            applet.init();

            frame.setContentPane(applet.getContentPane());

            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);

            applet.start();
        }
    });
}

@Override
public void init() {
    fxContainer = new JFXPanel();
    fxContainer.setPreferredSize(new Dimension(JFXPANEL_WIDTH_INT, JFXPANEL_HEIGHT_INT));
    add(fxContainer, BorderLayout.CENTER);
    // create JavaFX scene
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            createScene();
        }
    });
}

How can I fulfill the requirement stated above? Am I really going about this whole thing the wrong way?

SSCCE

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tutoringcalculator;

import java.awt.BorderLayout;
import java.awt.Dimension;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JRootPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

/**
 *
 * @author Owner
 */
public class TutoringCalculator extends JApplet {

    private static final int JFXPANEL_WIDTH_INT = 300;
    private static final int JFXPANEL_HEIGHT_INT = 250;
    private static JFXPanel fxContainer;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                } catch (Exception e) {
                }

                JFrame frame = new JFrame("Tutoring Calculator");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JApplet applet = new TutoringCalculator();
                applet.init();

                frame.setContentPane(applet.getContentPane());

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                applet.start();
            }
        });
    }

    @Override
    public void init() {
        fxContainer = new JFXPanel();
        fxContainer.setPreferredSize(new Dimension(JFXPANEL_WIDTH_INT, JFXPANEL_HEIGHT_INT));
        add(fxContainer, BorderLayout.CENTER);
        // create JavaFX scene
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                createScene();
            }
        });
    }

    private void createScene() {
        JButton btn = new JButton();
        btn.setText("Say 'Hello World'");
        JRootPane root = new JRootPane();
        root.getContentPane().add(btn);
        fxContainer.setScene(new Scene(root));
    }
}

原文:
2022-05-01 13:05

满意答案

Xavier,欢迎代码优先!

是的,代码优先是一种很好的方法,承诺太多了。 但现在你已经赶上了。 微软(或据我所知,除此之外)没有聪明的想法,他提出了一种平滑的方式来智能地改变表而不会危及数据和可能的架构。

2年前,实施策略是放弃并重新构建数据库。 这是无法忍受的,因为我们中的许多人没有SU访问权限,而且已经停止了。

为了我从代码中找到的所有优点,我首选DB。 虽然无法轻松保存数据,但注释可以通过好友类进行。

微软已经提出了一些聪明的迁移策略。 我强烈建议你阅读这两篇文章。 代码项目第二名:

1) http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx

2) http://www.codeproject.com/Articles/504720/EntityplusFrameworkplusCodeplusFirstplusMigrations

无论您决定继续使用Code-First,它们都应该具有启发性。 我听起来像一个评论家,但我在一个人的优势和另一个人的稳定性之间徘徊。

最后,我认为你不应该保留2个dbcontexts。 您的POCO应在1个上下文中合并。


Xavier, welcome to code-first!

Yes, code-first was a brilliant approach that promised soooo much. But now you've hit the catch. There's no clever mind at Microsoft (or outside as far as I know) who has come up with a smooth way to alter tables intelligently without endangering the data and possibly schema.

2 Years ago, the implementation strategy was to drop and re-build the DB. That was just intolerable as many of us didn't have SU access and were stopped in our tracks.

For all the advantages I found from code first, I prefer DB first. While data can't be preserved easily, annotations can through buddy classes.

Microsoft has come up with some clever Migration Strategies. I strongly suggest you read both articles. Code Project 2nd:

1) http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx

2) http://www.codeproject.com/Articles/504720/EntityplusFrameworkplusCodeplusFirstplusMigrations

whether you decide to continue with Code-First, they should be enlightening. I sound like a critic but I'm torn between advantages of one and stability of the other.

Finally, I don't think you should preserve 2 dbcontexts. Your POCOs should be consolidated under 1 context.

相关问答

更多

ASP.NET身份DbContext混淆(ASP.NET Identity DbContext confusion)

我将使用继承自IdentityDbContext的单个Context类。 这样,您可以让上下文知道您的类与IdentityUser和IdentityDbContext的角色之间的任何关系。 IdentityDbContext中的开销很少,它基本上是一个带有两个DbSets的常规DbContext。 一个用于用户,一个用于角色。 I would use a single Context class inheriting from IdentityDbContext. This way you can...

使用DbContext添加信息 - ASP.NET MVC(Adding information using DbContext - ASP.NET MVC)

我认为您的问题是因为您没有将ArticleSubject列表保存到您的数据库中。 您需要先将它们添加到ArticleSubjects DbSet中,然后调用上下文的SaveChanges方法: context.ArticleSubjects.AddRange(articleSubjects); context.SaveChanges(); 现在,如果您使用迁移 ,则在模型更改的情况下,您不会丢弃数据库,因此您可能希望使用@Sam变体来避免重复。 另外,为了执行自定义初始化程序,您必须通过Data...

我的DbContext如何处理?(How is my DbContext being disposed?)

当您使用IoC容器时,您永远不应该调用容器管理的新服务。 在此示例中,您不应使用: using(var context = new MyContext()) _messageRepo = new MessageRepository(context); _idRepo = new IdentityRepository(context); 应该注入您的依赖项(例如,通过构造函数)。 如何使用AutoFac注册您的存储库? 也许你的存储库configurard是单身? 当存储库被重用于第二个http请...

在ASP.NET应用程序中注入.InPerRequestScope是否必须使用DbContext?(Is it mandatory for DbContext to be injected .InPerRequestScope in ASP.NET application?)

是的,这是强制性的。 你的问题是这样的: 线程A加载一个实体 线程B修改该实体 线程A的下一个请求使用第一个请求中的缓存实体,忽略更改 Yes, it is mandatory. Your problem works like this: Thread A loads an entity Thread B modifies that entity The next request to Thread A uses the cached entity from the first request, ...

DBContext类ASP.Net MVC(DBContext class ASP.Net MVC)

如果您使用Code First方法,则可以更改Movies属性的名称。 实体框架使用类名(在本例中为class Movie )来计算表名。 默认情况下,它使用以下约定:从类名创建复数并尝试在数据库中查找此类表。 关于数据库名称:即使没有连接字符串,EF也会尝试创建数据库,但它会给它一个不同的名称(例如WebApplication1.MovieDBContext )。 If you are usign Code First approach you can change name of Movies...

获取实体的DbContext(Get DbContext for Entities)

所以我猜你使用的是EDMX设计器提供的默认代码生成器 - 它将使用ObjectContext和基于EntityObject的重量级实体。 如果你想使用DbContext,你必须: 关闭默认代码生成 - 在属性窗口中删除EDMX文件的自定义工具 下载并安装DbContext T4生成器 (您可以直接从Visual Studio中的扩展管理器获取它) 在EF设计器中,从设计器表面的上下文菜单中选择“ 添加代码生成项” (不在实体上) 现在EF将为你的项目添加两个.tt文件 - 一个负责为你的EDMX文...

ASP.NET MVC - DbContext的良好实践(ASP.NET MVC - DbContext good practices)

150实体不是一个巨大的DbContext,但它高于EF在第一个DbContext的初始化中开始出现性能问题的大小。 如果您可以在逻辑上将实体分成负责区域(称为有界上下文),那么您可以考虑使用多个DbContext。 此外,您的应用是否需要使用所有这些实体? 如果没有,您可以简化一些事情。 另请注意,您需要至少EF6才能有效地工作,以前版本的Entity Framework存在多个上下文的问题。 使用多个上下文时也必须小心。 许多人遇到麻烦是因为他们从一个上下文中获取实体,然后在另一个上下文中调用...

如何从MVC业务对象引用Entity Framework DbContext?(How to refer to Entity Framework DbContext from MVC business objects?)

依赖注入肯定听起来像你在这之后。 我的偏好是ninject,所以下面是我如何用EF做这个的一个例子。 安装Ninject.MVC3(在nuget上可用) 转到\ app_start \ NinjectWebCommon.cs(由上面的包添加)并将以下内容添加到RegisterServices方法 kernel.Bind<MyContext>().ToSelf().InRequestScope(); //binding in the context in request scope, this wi...

如何在ASP.NET MVC应用程序区域中使用不同的Entity Framework DbContext?(How to use different Entity Framework DbContext in the Area of ASP.NET MVC application?)

Xavier,欢迎代码优先! 是的,代码优先是一种很好的方法,承诺太多了。 但现在你已经赶上了。 微软(或据我所知,除此之外)没有聪明的想法,他提出了一种平滑的方式来智能地改变表而不会危及数据和可能的架构。 2年前,实施策略是放弃并重新构建数据库。 这是无法忍受的,因为我们中的许多人没有SU访问权限,而且已经停止了。 为了我从代码中找到的所有优点,我首选DB。 虽然无法轻松保存数据,但注释可以通过好友类进行。 微软已经提出了一些聪明的迁移策略。 我强烈建议你阅读这两篇文章。 代码项目第二名: 1)...

使用Entity Framework DbContext的类库(Class library using Entity Framework DbContext)

确保每个Web.config中都有相同的连接字符串,并且它们指向同一个数据库。 请注意AttachDbFilename相对路径将指向不同的目录。 我打赌你的连接字符串看起来像这样: <connectionStrings> <add name="MonPFEContext" connectionString=".\SQLExpress;AttachDbFilename=|DataDirectory|MonPFEContext.mdf; Database=MonPFEContext;Trust...

相关文章

更多

Custom SOLR Search Components - 2 Dev Tricks

I've been building some custom search components fo ...

Professional Android 4 Application Development

Developers, build mobile Android apps using Android ...

Chapter 9 - Securing Your Application -- Professional ASP.NET MVC 1.0

Overview Let's face it: security isn't sexy. Most ...

Bentley.STAAD.RCDC.V8i.04.01.01.03 1CD

1、Bentley Multiframe Advanced V8i SS3 17.00.02.10 W ...

《Java 2 图形设计卷I:AWT》(Graphic Java 1.2 Mastering the JFC Volume I:AWT )扫描版[PDF]

中文名: Java 2 图形设计卷I:AWT 原名: Graphic Java 1.2 Mast ...

HTML5应用缓存(application cache)【HTML5教程 - 第十二篇】

HTMl5引入了application cache概念。意思是你可以缓存一个web应用,然后在没有互联 ...

Hadoop I/O系统介绍

看过很多Hadoop介绍或者是学习的帖子和文章,发现介绍Hadoop I/O系统的很少。很多文章都会介 ...

有没有基于Swing的开源工具,支持组件拖动效果

就像在工作流设计器上的那些应用一样,支持划线,支持组件拖动效果,对Swing研究不是很深,请教各位大侠 ...

Who AM I Casting Crowns自我简介

基督教 赞美诗歌 Hymns Lyrics MP3 中文版 英文版 中英对照 音频提取(自动播放): ...

最新问答

更多

您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)

将diff文件复制到存储库的根目录,然后执行以下操作: git apply yourcoworkers.diff 有关apply命令的更多信息, apply 见其手册页 。 顺便说一下:一个更好的方法是通过文件交换整个提交文件是发送者上的命令git format-patch ,然后在接收器上加上git am ,因为它也传送作者信息和提交信息。 如果修补程序应用程序失败,并且生成diff的提交实际上在您的备份中,则可以使用尝试在更改中合并的apply程序的-3选项。 它还适用于Unix管道,如下

将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)

尝试将第二行更改为snprintf(buf1, sizeof buf1, "%.2f", balance1); 。 另外,为什么要声明用该特定表达式分配缓冲区的存储量? EDIT @LưuVĩnhPhúc在下面的评论中提到我的原始答案中的格式说明符将舍入而不是截断,因此根据如何在不使用C舍入的情况下截断小数,您可以执行以下操作: float balance = 200.56866; int tmp = balance1 * 100; float balance1 = tmp / 100.0; c

OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)

这是简单的解决方案 在你需要写的控制器中 BackendMenu::setContext('Archetypics.Team', 'website', 'team'); 请参阅https://octobercms.com/docs/backend/controllers-views-ajax#navigation-context BackendMenu::setContext('Author.Plugin name', 'Menu code', 'Sub menu code'); 你需要在r

页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)

每当发出请求时ASP都会创建一个新的Page对象,并且一旦它将响应发送回用户就不会保留对该Page对象的引用,因此只要你找不到某种方法来保持生命自己引用该Page对象后,一旦发送响应, Page和只能通过该页面访问的所有对象才有资格进行垃圾回收。 ASP creates a new Page object whenever a request is made, and it does not hold onto the reference to that Page object once it

codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)

要在生产服务器中调试这个,你可以临时放 error_reporting(E_ALL); 并查看有哪些其他错误阻止正确的重定向。 您还应该检查生产服务器发送的响应标头。 它是否具有“缓存”,是否需要重新验证标头等 to debug this in production server, you can temporary put error_reporting(E_ALL); and see what other errors are there that prevents the proper

在计算机拍照在哪里进入

打开娥的电脑.在下面找到视频设备点击进去就可以了...

使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)

你是对的。 第一次输入后,换行符将保留在输入缓冲区中。 第一次读取后尝试插入: cin.ignore(); // to ignore the newline character 或者更好的是: //discards all input in the standard input stream up to and including the first newline. cin.ignore(numeric_limits::max(), '\n'); 您必须为#inc

No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)

for (int k = 0; k > 10; k++) { System.out.println(k); } k不大于10,所以循环将永远不会执行。 我想要什么是k<10 ,不是吗? for (int k = 0; k < 10; k++) { System.out.println(k); } for (int k = 0; k > 10; k++) { System.out.println(k); } k is not greater than 10, so loop

单页应用程序:页面重新加载(Single Page Application: page reload)

优点是不注销会避免惹恼用户,以至于他们会想要杀死你:-)。 说真的,如果每次刷新页面时应用程序都会将我注销(或者在新选项卡中打开一个链接),我再也不会使用该应用程序了。 好吧,不要这样做。 确保身份验证令牌存储在刷新后的某个位置,即不在某些JS变量中,而是存储在cookie或本地存储中。 The advantage is that not logging off will avoid pissing off your users so much that they'll want to kill

在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)

EXECUTE IMMEDIATE 'SELECT '||field_val_temp ||' FROM tableb WHERE function_id = :func_val AND rec_key = :rec_key' INTO field_val USING 'STDCUSAC' , yu.rec_key; 和, EXECUTE IMMEDIATE 'UPDATE tablec SET field_val_'||i||' = :field_val' USI