簡體   English   中英

何時使用JFrame或JPanel

[英]When to use JFrame or JPanel

我是Java GUI編程的新手,對於何時使用哪些工具有一些疑問。

運行我的應用程序時,我會出現一個JFrame並使用內容面板向用戶顯示3個按鈕。 我希望每個按鈕顯示不同的屏幕,但不要在單獨的窗口中打開。 為此,我目前正在處置當前的JFrame並使用新內容創建一個新的JFrame。 這是我的問題。

  1. 我應該為每個按鈕單擊創建一個新的JPanel而不是創建一個新的JFrame嗎? 如果對這個問題的回答是一個見解,是否有公認的最佳實踐?

  2. 當關閉JFrame或JPanel時,何時適合使用setVisible(false)與.dispose()?

  1. 您可以使用CardLayout切換到完全不同的組件視圖,也可以定義不同的JPanels(保持或創建新的JPanels取決於它們與之交互或組成的設計),並從中添加和刪除它們。 JFrame根據需要。 但是CardLayout是為此設計的,因此我建議先研究一下。

    創建新的JFrame應該會使用戶感到困惑,尤其是如果您不跟蹤框架在其監視器上的先前位置或用戶設置的自定義大小時。 我還可以想象,在下一幀出現之前,一幀消失會發生某種閃爍。

  2. 設置完所有屬性並添加了要添加的所有組件后,應在JFrame上調用setVisible(true)。 在方法文檔中可以看到setVisible()的一部分是它將對齊所有組件,因此,如果調用它,然后在添加組件之后,則可能只會看到部分組件可見。

    在通常情況下,您實際上根本不需要調用setVisible(false)或dispose()。

我也會嘗試解釋一下。

JFrame-用於表示窗口應具有的內容。 這包括邊框(可調整大小的y / n?),標題欄(應用程序名稱或其他消息),控件(允許的最小化/最大化?)以及各種系統事件(例如“窗口關閉”)的事件處理程序(允許應用程序退出嗎?)。

JPanel-用於將其他元素收集在一起的通用類。 這對於使用視覺布局或所提供的布局管理器之一(例如gridbaglayout等)更為重要。例如,您的文本框大於保留的區域。 將文本框放在滾動窗格中,然后將該窗格放入JPanel。 然后,當您放置JPanel時,就布局而言,它將更加易於管理。

切換到另一個屏幕后,按鈕是否應該留在JFrame上? 如果是,請對ContentPane使用BorderLayout並將3個按鈕在自己的JPanel上添加到BorderLayout.NORTH。 將3個JPanel用於您的自定義屏幕,並將它們添加到BorderLayout.CENTER。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ThreeButtonExample extends JFrame {

  private JPanel current;
  private JPanel screen1 = new JPanel();
  private JPanel screen2 = new JPanel();
  private JPanel screen3 = new JPanel();

  public ThreeButtonExample(String title) {
    super(title);
    setMinimumSize(new Dimension(400, 300));

    getContentPane().setLayout(new BorderLayout());

    JPanel buttonPane = new JPanel();

    JButton btnScreen1 = new JButton("Screen 1");
    JButton btnScreen2 = new JButton("Screen 2");
    JButton btnScreen3 = new JButton("Screen 3");

    btnScreen1.setActionCommand("Screen 1");
    btnScreen2.setActionCommand("Screen 2");
    btnScreen3.setActionCommand("Screen 3");

    buttonPane.add(btnScreen1);
    buttonPane.add(btnScreen2);
    buttonPane.add(btnScreen3);

    screen1.setBackground(Color.red);
    screen2.setBackground(Color.green);
    screen3.setBackground(Color.blue);

    btnScreen1.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        changePanel(e);
      }
    });

    btnScreen2.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        changePanel(e);
      }
    });

    btnScreen3.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        changePanel(e);
      }
    });

    getContentPane().add(buttonPane, BorderLayout.NORTH);
    current = screen1;
    getContentPane().add(screen1, BorderLayout.CENTER);

    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  }

  public void changePanel(ActionEvent e) {
    getContentPane().remove(current);
    switch (e.getActionCommand()) {
      case "Screen 1":
        getContentPane().add(screen1, BorderLayout.CENTER);
        current = screen1;
        break;
      case "Screen 2":
        getContentPane().add(screen2, BorderLayout.CENTER);
        current = screen2;
        break;
      case "Screen 3":
        getContentPane().add(screen3, BorderLayout.CENTER);
        current = screen3;
        break;
    }
    this.revalidate();
    this.repaint();
  }

  public static void main(String[] args) {
    ThreeButtonExample tbe = new ThreeButtonExample("3 Button Test");
    tbe.pack();
    tbe.setVisible(true);
  }

}

暫無
暫無

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

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