Java GUI слушатели без AWT - PullRequest
       37

Java GUI слушатели без AWT

77 голосов
/ 06 июня 2011

Я начинающий Java-разработчик, учусь только на интернет-уроках. Я изучаю полноэкранные графические приложения. Вчера мне сказали, что я не должен использовать AWT в своих программах, потому что он устарел. Я уже знаю о легких и тяжелых компонентах, основная проблема - слушатели мыши и клавиатуры. Почему AWT устарел? Как создать программу без AWT (добавление слушателей в JComponents и т. Д.) (Какие вещи Swing могут заменить AWT)?

Ответы [ 5 ]

42 голосов
/ 06 июня 2011

Вы неверно истолковываете предоставленную вам информацию. Вам следует избегать использования компонентов Swing с компонентами AWT . Можно использовать Swing со структурой слушателя AWT, менеджерами раскладки и т. Д., И на самом деле это невозможно.

34 голосов
/ 06 июня 2011

Были некоторые хорошие ответы, но я хотел бы затронуть немного другой аспект.Вещи, которые Swing предоставляет за пределами AWT.

Компоненты

Swing поддерживает стилизованные документы в JEditorPane & JTextPane и в ограниченной степени с использованием HTML в некоторых других JComponents.AWT не поддерживает стилизованные документы ни в одном компоненте.

AWT не предоставляет древовидную структуру, такую ​​как JTree, нет табличной структуры, такой как JTable, нет версии JToolBar.

image

AWT имеетнет эквивалента (который я могу найти или вспомнить) для JColorChooser и нет для простого служебного класса - JOptionPane.

image

Слушатели

Как уже упоминалось в комментарии, см. 20+ дополнительных / альтернативных слушателей в пакете javax.swing.event.

ПодключаемыйLook & Feel

Компоненты Swing могут быть настроены на особый внешний вид во время выполнения, включая собственный PLAF.

image

См. Снимки экрана в Пример вложенного макета , где можно найти еще несколько образцов.

Макеты

ДополнительноSwing предоставляет множество макетов AWT:

  1. BoxLayout
  2. GroupLayout
  3. OverlayLayout
  4. ScrollPaneLayout
  5. SpringLayout
  6. ViewportLayout

Прочее


Возможно, я пропустил намного большеэто краткое описание, но суть в том, что Swing - это совершенно новый и более включенный инструментарий GUI.

Включение обеих сборок, и в значительной степени зависит от классов в AWT.

7 голосов
/ 06 июня 2011

Java Swing использует ActionListeners, которые являются частью пакета AWT. Если вы хотите использовать Swing, вы должны использовать некоторую форму AWT ActionListener. Так обстоят дела. Я вообще не предлагаю использовать Java для сложных приложений, но я бы не сказал, что AWT устарел, так как прямой замены нет. Таким образом, просто идти вперед и использовать AWT.

В качестве альтернативы, вы можете взглянуть на JOGL, но это больше, если вы пытаетесь создать что-то ориентированное на игру.

2 голосов
/ 17 июня 2014

Это небольшой пример, демонстрирующий использование пакета javax.swing.Action . Вы также должны обратиться к java doc для пакета javax.swing.event . Я думаю, что вы нашли это. , ,

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JToolBar;

class SysOutHelloAction extends AbstractAction {
    private static final Icon printIcon = new ImageIcon("Print.gif");

    SysOutHelloAction() {
        super("Print", printIcon);
        putValue(Action.SHORT_DESCRIPTION, "Hello, World");
    }

    public void actionPerformed(ActionEvent actionEvent) {
        System.out.println("Hello, World");
    }
}

public class SwingActionTester {
    public static void main(String args[]) {
        JFrame frame = new JFrame("Action Sample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final Action printAction = new SysOutHelloAction();
        JMenuBar menuBar = new JMenuBar();
        JMenu menu = new JMenu("File");
        menuBar.add(menu);
        menu.add(new JMenuItem(printAction));
        JToolBar toolbar = new JToolBar();
        toolbar.add(new JButton(printAction));
        JButton enableButton = new JButton("Enable");
        ActionListener enableActionListener = new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                printAction.setEnabled(true);
            }
        };
        enableButton.addActionListener(enableActionListener);
        JButton disableButton = new JButton("Disable");
        ActionListener disableActionListener = new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                printAction.setEnabled(false);
            }
        };
        disableButton.addActionListener(disableActionListener);
        JButton relabelButton = new JButton("Relabel");
        ActionListener relabelActionListener = new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                printAction.putValue(Action.NAME, "Changed Action Value");
            }
        };
        relabelButton.addActionListener(relabelActionListener);
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(enableButton);
        buttonPanel.add(disableButton);
        buttonPanel.add(relabelButton);
        frame.setJMenuBar(menuBar);
        frame.add(toolbar, BorderLayout.SOUTH);
        frame.add(buttonPanel, BorderLayout.NORTH);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
}
0 голосов
/ 30 марта 2018

Вы правы. Java AWT и Java Spring устарели. Вместо этого используйте JavaFX.
И, как комментарий, я разочарован Java, что он должен был «писать один раз везде», когда теперь он «должен продолжать переписывать ваше приложение каждые три месяца», потому что новые выпуски Java нарушают предыдущий код, и новые пакеты заменяют старые.

...