Trình nghe Java GUI không có AWT


81

Tôi là một nhà phát triển Java mới bắt đầu, chỉ học từ các hướng dẫn trên internet. Tôi đang tìm hiểu các ứng dụng GUI toàn màn hình. Hôm qua tôi đã được thông báo rằng tôi không nên sử dụng AWT trong các chương trình của mình, vì nó đã lỗi thời. Tôi đã biết về các thành phần nhẹ và nặng, vấn đề chính là chuột và bàn phím nghe. Tại sao AWT lại lỗi thời? Làm thế nào để tạo một chương trình mà không có AWT (thêm người nghe vào JComponents, v.v.) (loại Swing nào có thể thay thế AWT)?


Tôi chưa bao giờ nghe nói về những người nghe khác ngoài AWT. Rất vui được biết điều đó.
LouwHopley

3
@Nideo: Thưởng thức 'đôi tai' của bạn với hơn 20 người nghe trong javax.swing.eventgói . ;)
Andrew Thompson

@Andrew, cảm ơn! : P Có lý do gì để sử dụng bộ nghe swing hơn là bộ nghe AWT không?
LouwHopley

Câu trả lời:


43

Bạn đang giải thích sai thông tin được cung cấp cho bạn. Bạn nên tránh sử dụng các thành phần Swing với các thành phần AWT . Bạn có thể sử dụng Swing với cấu trúc trình nghe AWT, trình quản lý bố cục, v.v. và thực tế là không thể không làm như vậy.


34

Đã có một số câu trả lời hay, nhưng tôi muốn đề cập đến một khía cạnh hơi khác. Những thứ mà Swing cung cấp ngoài AWT.

Các thành phần

Swing hỗ trợ các tài liệu theo kiểu JEditorPane& JTextPane& ở một mức độ hạn chế bằng cách sử dụng HTML trong một số tài liệu khác JComponents. AWT không hỗ trợ các tài liệu được tạo kiểu trong bất kỳ thành phần nào.

AWT không cung cấp cấu trúc dựa trên cây như JTree, không có cấu trúc dạng bảng như JTable, không có phiên bản của JToolBar.

AWT không có tương đương (mà tôi có thể tìm thấy hoặc nhớ lại) cho JColorChooser& không có đối với lớp tiện ích đơn giản - JOptionPane.

Người nghe

Như đã đề cập trong nhận xét, hãy xem hơn 20 người nghe bổ sung / thay thế trong javax.swing.eventgói.

Giao diện và cảm nhận dễ chịu

Các thành phần xoay có thể được đặt thành một giao diện cụ thể tại thời điểm chạy, bao gồm cả PLAF bản địa.

Xem ảnh chụp màn hình trên Ví dụ về bố cục lồng nhau để biết thêm một số mẫu.

Bố cục

Ngoài rất nhiều bố cục AWT, Swing cung cấp:

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

Khác


Có lẽ còn nhiều điều mà tôi đã bỏ lỡ trong phần mô tả ngắn gọn đó, nhưng điểm mấu chốt là Swing là một bộ công cụ GUI hoàn toàn mới hơn và được kích hoạt nhiều hơn.

Swing được xây dựng dựa trên chủ yếu dựa vào các lớp trong AWT.


7

Swing của Java sử dụng ActionListists, là một phần của gói AWT. Nếu bạn muốn sử dụng swing, bạn phải sử dụng một số dạng của AWT ActionListener. Đó chỉ là cách mọi thứ đang diễn ra. Tôi không đề nghị sử dụng Java cho các guis phức tạp, nhưng tôi cũng không muốn nói rằng AWT đã lỗi thời, vì không có sự thay thế trực tiếp. Vì vậy, chỉ cần tiếp tục và sử dụng AWT.

Thay vào đó, bạn có thể xem xét JOGL, nhưng đó là nhiều hơn nếu bạn đang cố gắng tạo ra thứ gì đó theo định hướng trò chơi.


2

Đây là một ví dụ nhỏ có thể chứng minh, việc sử dụng gói javax.swing.Action bạn cũng nên tham khảo java doc cho gói javax.swing.event, tôi nghĩ bạn đang tìm thấy điều đó. . .

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

Bạn đúng rồi. Cả Java AWT và Java Spring đều đã lỗi thời. Sử dụng JavaFX để thay thế.
Và, như một bài bình luận, tôi thất vọng với Java, rằng nó được cho là "viết một lần chạy ở mọi nơi", khi bây giờ hóa ra là "phải tiếp tục viết lại ứng dụng của bạn ba tháng một lần" vì các bản phát hành Java mới phá vỡ mã trước đó, và gói mới thay thế gói cũ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.