Swing和AWT混合很糟糕,但仍然完成,为什么?

2022-09-03 13:36:14

我注意到人们建议不要混合 Swing 和 AWT ,但是我们看到了很多:Components

import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.ImageIcon;
 //AWT imports though only for listeners
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

那么为什么包括Java在内的许多人(因为我从他们的教程中得到了这一)仍然使用AWT导入,尽管我看到它主要用于s。Listener

如何为 、 、 press/slections 等内容添加本机 Swing s/Libraries?ListenerKeyButtonJComboBox

或者我会使用?(尽管这与Java Beans有关)firePropertyChangeListeners()

现在已经让我困惑了一段时间,我的大多数应用程序都有Swing和AWT,据说这很糟糕?


答案 1

Swing 建立在 AWT 之上,具有不同的创建和绘制 UI 组件的理念。混合使用两个框架中的UI组件可能会导致意外的结果,因此不鼓励(正如kleopatra所述,这已被修复)。但是,Swing 仍然使用 AWT 事件队列范例,包括侦听器 - 它不会将它们替换为 Swing 原生的侦听器,因为没有理由这样做。

在应用程序中同时使用 Swing 和 AWT 是常见的做法,警告您不要同时使用 Swing 和 AWT UI 组件。


答案 2

Swing与AWT共享相当多的类,并使用一些相同的实现 - 请注意,javax.swing.JComponent(基本的Swing组件类)实际上继承自java.awt.Component(基本的AWT容器类)

如果你小心的话,混合Swing和AWT实际上并不是一个大问题。主要陷阱是:

  • 如果您混合使用AWT和Swing UI组件,则可能会获得非常不同的外观和感觉
  • Swing组件是“轻量级的”(由Java呈现),而AWT组件是“重量级的”(在主机平台中作为组件实现) - 这意味着如果你把AWT组件放在Swing组件中,你会遇到问题(反过来是可以的)