亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有空布局的 JPanel 類不顯示組件

具有空布局的 JPanel 類不顯示組件

慕桂英4014372 2023-07-13 13:46:30
因此,我創建了一個“CustomPanel”類的對象,該對象創建一個帶有 GridLayout 的 JPanel 和其中的標簽,然后將其添加到我的 JFrame 中。它可以很好地顯示標簽“HELLO”,但是當我將 jpanel 的布局管理器更改為 (null) 時,它不會顯示任何內容。我知道,我知道使用空布局是一種非常糟糕的做法,但我只想知道為什么它不顯示組件。主要類別:import javax.swing.JFrame;public class MainMenu extends javax.swing.JFrame{    private static void createAndShowGUI() {        //Create and set up the window.        JFrame frame = new JFrame();        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        //Size the window.        frame.setSize(500, 500);        CustomPanel panel = new CustomPanel();        frame.getContentPane().add(panel);        frame.setVisible(true);    }    public static void main(String[] args) {        javax.swing.SwingUtilities.invokeLater(new Runnable() {            public void run() {                createAndShowGUI();            }        });    }}帶有 GridLayout 的 CustomPanel 類(效果很好):import java.awt.GridLayout;import javax.swing.JLabel;import javax.swing.JPanel;public class CustomPanel extends JPanel{    public CustomPanel() {        initUI();    }    public final void initUI() {        // create the panel and set the layout        JPanel main = new JPanel();        main.setLayout(new GridLayout());        // create the labels        JLabel myLabel = new JLabel("HELLO");        // add componets to panel        main.add(myLabel);        this.add(main);    }}具有空布局的 CustomPanel 類(這不起作用):import javax.swing.JLabel;import javax.swing.JPanel;public class CustomPanel extends JPanel{    public CustomPanel() {        initUI();    }    public final void initUI() {        // create the panel and set the layout        JPanel main = new JPanel();        main.setLayout(null);        // create the labels        JLabel myLabel = new JLabel("HELLO");        myLabel.setBounds(10, 10, myLabel.getPreferredSize().width, myLabel.getPreferredSize().height);        // add componets to panel        main.add(myLabel);        this.add(main);    }}jlabel 在 jpanel 內正確設置,因此它應該顯示在 jframe 的左上角,但事實并非如此。是什么原因造成的?我錯過了什么?
查看完整描述

1 回答

?
搖曳的薔薇

TA貢獻1793條經驗 獲得超6個贊

問題是,當您不使用正確的布局管理器時,主 JPanel 的首選大小為 0,0,并且不會在其所在的容器內顯示。保存主 JPanel 的 CustomPanel 使用 FlowLayout 并將使用其包含的組件的首選大小來幫助調整這些組件的大小和位置,但由于 main 沒有布局,因此將 JLabel 添加到 main 不會增加首選大小,因為它應該是 - 另一個使用布局的原因,CustomPanel 會將 main 顯示為一個無大小的點。您當然可以通過給 main 一個首選大小來解決這個問題main.setPreferredSize(...),但是這樣你就會用一個拼湊來解決一個拼湊——這不好。另一種可能的解決方案是將 CustomPanel 的布局更改為其他可能擴展它所包含的主 JPanel 的布局,也許為 CustomPanel 提供一個 BorderLayout。在這種情況下,以默認方式將 main 添加到 CustomPanel 會將主 JPanel 放置到 BorderLayout.CENTER 位置,將其展開以填充 CustomPanel,并且可能會看到 JLabel。

當然,正確的解決方案是盡可能避免使用空布局。


查看完整回答
反對 回復 2023-07-13
  • 1 回答
  • 0 關注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號