慕桂英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。
當然,正確的解決方案是盡可能避免使用空布局。
添加回答
舉報
0/150
提交
取消