当前位置: 首页 > 面试题库 >

Java AWT / SWT / Swing:如何计划GUI?

贾兴学
2023-03-14
问题内容

我已经实现了一些带有小型图形用户界面的应用程序。没什么复杂的,但是我遇到了一些问题,这些问题导致组件无法显示或无法正常运行。

现在我的问题是:

您如何计划这些用户界面?当您需要进行更改时该怎么办?您如何调试奇怪的行为?

这几乎适用于所有类型的GUI设计。当然,使用Microsoft Visual Studio具有很大的优势,因为您几乎获得了在设计器中看到的东西。

是否存在 优秀 的AWT开源设计器?已经环顾四周,没有发现任何真正聪明的东西。

编辑: 到目前为止,我还手动创建了所有GUI。当然,这是更简洁的代码,但有时很难找到布局错误。如果Visual Studio by
MS能够创建近似干净的代码,那么其他人为什么不呢?

我听说过一些Eclipse Visual设计器。那个已经准备好生产了吗?


问题答案:

我不是GUI建设者的忠实拥护者:他们通常会自动生成大量的代码,然后将您的整个开发团队锁定为使用一个IDE。而且,此代码通常不可读(请检查在Netbeans下使用Matisse时生成的代码)。

我对GUI设计/调试的建议是:

  • main在每个面板(或“顶级”组件)实现中添加一个方法,使其他开发人员可以轻松确定组件的外观。
  • 赞成使用Actions over ActionListeners并在每个JComponents中注册这些动作ActionMap。这允许它们被“提取”并添加到UI的其他部分(例如JToolBar),同时它们的状态仍由“所有权” JComponent(即松散耦合)控制。
  • 使用assert来确保所有UI组件修改都在Event Dispatch线程上进行;例如assert SwingUtilities.isEventDispatchThread()
  • 要调试奇怪的布局行为,请考虑将组件的背景涂成红色!
  • 集中捕获和报告工作流事件和异常。例如,我通常实现一个TaskManager在UI的状态栏中注册的类。任何后台处理(在SwingWorkers 内执行)都会通过传递给Task创建的句柄TaskManager。与工作Interracting(通过调用setDescription(String)setThrowable(Throwable)cancel())导致要更新的状态栏。这也将导致玻璃窗格显示为“全局”任务…但是,所有窗格都与单个SwingWorkers分离/隐藏了。
  • 不要使用Observer/ Observable班,而是青睐ChangeListenerPropertyChangeListener或传播事件自己定制的监听器实现。 Observer传递一个Objectas事件,迫使客户端代码使用instanceof检查类型并执行向下转换,使代码不可读并且使类之间的关系不那么清楚。
  • 即使在表只有一列的情况下,也建议使用JTableover JListJList它的API中有一些讨厌的功能,包括您需要为其提供原型值以正确计算其大小这一事实。
  • 永远不要使用DefaultTableModel它,因为它通常会导致您将“模型”数据存储在两个位置:在实际的业务对象中以及位于2D数组中DefaultTableModel。相反,只需子类AbstractTableModel-这 很容易 做到,并且意味着您的实现可以简单地委派给List存储您的数据的数据结构(例如)。


 类似资料:
  • 我有一个spring boot应用程序,我需要每20秒刷新一次,所以我创建了这个: 它工作得很好,但当我向数据库中添加行时,在它为空之前,我想再次将计时器重置为20秒,有办法吗?

  • 如何在spring boot应用程序中测试计划的作业任务?

  • 我正在使用ScheduledExecutorService并对其进行初始化(ScheduledExecutorService scheduledThreadPool=Executors.NewScheduledThreadPool(20);)这样我就不会每次都创建新线程。然后,我使用计划“executorService.schedule(new Runnable(),20,timeUnit.sec

  • 在此之前我问了一个问题。我的服务conifg是: 我编写了一个扩展mediator交易文件。该类返回文件名并向服务发送请求。服务没有输入消息。我要每天13:30的服务。我尝试添加新的计划任务。但是它不能工作?谁能告诉我如何设置这个计划任务? 我也不知道如何设置“固定服务器”。

  • 我遇到了两个不同的问题一个是一般的Graphics2D,另一个是具体的repaint()方法。 首先是repaint()问题。我有一个基于用户选择的时间间隔更新的图表,时间间隔可以从1秒到几分钟不等。问题是一旦调用了repaint()方法,它就会在代码的每一次迭代中不断地回忆自己,而不仅仅是在我想要的时候。有人知道为什么会这样吗?如何阻止它?我试着把我的代码放在一个带有标志的if语句中,但是一旦标

  • 我们有一个程序,客户声称文件没有在应该生成的时候生成,只是在一天中很晚才出现。 我想知道这是否是因为任务调度程序的安排。 任务计划在每天下午12:23开始,然后无限期地每5分钟执行一次。 考虑到日程安排,并将其设置为每天运行,在00:00:00-12:23:00的时间内会发生什么? 前一天的日程是否因为“无限期”的设定而一直运行到第二天? 或者,由于任务设置为每天运行,前一天的计划是否在00:00