簡體   English   中英

如何在Java AWT中使面板在框架內可見?

[英]How do I make a panel visible inside frame in Java AWT?

我正在研究Java AWT以創建GUI應用程序。 我正在使用以下代碼,無法在面板內部看到面板。 這是我的代碼:

        import java.awt.*;
        import java.awt.event.*;

        /**
         *
         * @author kiran
         */
        public class UserInterface
        {
            Frame UI;
            private static double UIWidth, UIHeight;



            /**
             * Constructs User Interface
             */
            public UserInterface()
            {
                UI = new Frame("frame");
                Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                UIWidth = screenSize.getWidth();
                UIHeight = screenSize.getHeight();
                buildFrame();
                buildMessageInputArea();
            }
            /**
             * returns the width of the UI
             * @return returns the width of the UI
             */
            public static double getUIWidth()
            {
                return UIWidth;
            }

            /**
             * returns the width of the UI
             * @return returns the width of the UI
             */
            public static double getUIHeight()
            {
                return UIHeight;
            }

            /**
             * Builds the frame
             */
            private void buildFrame()
            {
                UI.setSize((int)UIWidth,(int)UIHeight*96/100);
                UI.setVisible(true);
                UI.setLayout(new FlowLayout());
                UI.addWindowListener(new Actions());
            }

            private void buildMessageInputArea()
            {
                Panel current = new TextAreaPanel().getPanel();
                current.setVisible(true);
                UI.add(current);

            }
        }

        class TextAreaPanel extends Frame
        {
            private Panel textAreaPanel;
            TextArea msgInputArea;

            public TextAreaPanel()
            {
                textAreaPanel = new Panel();
                msgInputArea = new TextArea(1000,(int)UserInterface.getUIWidth() * 80/100);
            }

            private void addTextArea()
            {
                textAreaPanel.add(msgInputArea);
            }

            public Panel getPanel()
            {
                return textAreaPanel;
            }

    }

    class Actions extends WindowAdapter
    {
        @Override
        public void windowClosing(WindowEvent c)
        {
            System.exit(0);
        }
    }

如何使面板在框架內部可見?

如何在Java AWT中使面板在框架內可見?

如所示,該代碼存在兩個基本問題,可以通過更改以下內容來解決:

  1. 在頂層容器上調用setVisible(true)之前,將面板/文本區域添加到GUI。

    盡管可以在使容器可見后將其添加到容器中,但是它們需要特殊處理,在這種情況下沒有必要。

  2. 將文本區域添加到面板!

這是通過添加main(String[])方法(實現了這兩個更改)以及對代碼其他方面的更多說明性注釋而使代碼變成最小,完整和可驗證的示例的代碼。

import java.awt.*;
import java.awt.event.*;

public class UserInterface {

    Frame UI;
    private static double UIWidth, UIHeight;

    public static void main(String[] args) {
        Runnable r = () -> {
            new UserInterface();
        };
        EventQueue.invokeLater(r);
    }

    /**
     * Constructs User Interface
     */
    public UserInterface() {
        UI = new Frame("frame");
        // setting a GUI to full screen while accounting for the task
        // bar can be achieved in a single line of code.
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        UIWidth = screenSize.getWidth();
        UIHeight = screenSize.getHeight();
        // these need to be called in the reverse order to ensure the 
        // components are added before the GUI is set visible.
        buildMessageInputArea();
        buildFrame();
    }

    /**
     * returns the width of the UI
     *
     * @return returns the width of the UI
     */
    public static double getUIWidth() {
        return UIWidth;
    }

    /**
     * returns the width of the UI
     *
     * @return returns the width of the UI
     */
    public static double getUIHeight() {
        return UIHeight;
    }

    /**
     * Builds the frame
     */
    private void buildFrame() {
        UI.setSize((int) UIWidth, (int) UIHeight * 96 / 100);
        UI.setVisible(true); 
        UI.setLayout(new FlowLayout());
        UI.addWindowListener(new Actions());
    }

    private void buildMessageInputArea() {
        Panel current = new TextAreaPanel().getPanel();
        current.setVisible(true);
        UI.add(current);
    }
}

// does not need to be a fram
//class TextAreaPanel extends Frame {
class TextAreaPanel {

    private Panel textAreaPanel;
    TextArea msgInputArea;

    public TextAreaPanel() {
        textAreaPanel = new Panel();
        // these number represent columns and rows, not pixels!
        //msgInputArea = new TextArea(1000, (int) UserInterface.getUIWidth() * 80 / 100);
        msgInputArea = new TextArea(40, 60);
        // add the text area to the panel!
        textAreaPanel.add(msgInputArea);
    }

    /** not called by anything else
    private void addTextArea() {
        textAreaPanel.add(msgInputArea);
    }
    **/

    public Panel getPanel() {
        return textAreaPanel;
    }
}

// This can be achieved in a single line of code
class Actions extends WindowAdapter {

    @Override
    public void windowClosing(WindowEvent c) {
        System.exit(0);
    }
}

要添加/擴展@mKorbel和@camickr的評論:

  1. 為什么要使用AWT? 有很多充分的理由,請參見此答案 ,以放棄AWT組件而支持Swing。
  2. 請參見組成而不是繼承
  3. 在GUI中使用static方法比解決方法更容易引起問題。 使用對象實例調用該方法的代碼,應將大多數(如果不是全部)標記為靜態的方法減少為非靜態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM