【问题标题】:JButtons are not appearing at the West side of the applicationJButton 没有出现在应用程序的西侧
【发布时间】:2022-07-27 20:32:43
【问题描述】:

当我试图运行我的程序时,它总是一个错误。 5 个 JButton 没有出现在 MainFrame 的西部(左侧)。我为 JButtons 使用了 BoxLayout,以便它可以从上到下显示,并将 FirstPanel 类调用到 MainFrame,以便我可以将它定位在西侧。它应该是这样的,但我的应用程序没有运行。请帮助我如何实现这一目标

MainFrame.java

public class MainFrame extends JFrame {
    TitlePanel title;
    FirstPanel first;
    
 
    
    public MainFrame() {
        
        title = new TitlePanel();
        add(title, BorderLayout.NORTH);
        
        first = new FirstPanel();
        add(first, BorderLayout.WEST);
 
        
    
        setSize(5000,5000);
    setVisible(true);
    this.pack();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
    }
    
    
    
    public static void main(String[] args) {
        new MainFrame();
    }
}

第一面板.java

   public class FirstPanel extends JPanel {
   JButton b1;
   JButton b2;
   JButton b3;
   JButton b4;
   JButton b5;
   FirstPanel fp;
    
    public FirstPanel() {

       fp = new FirstPanel();
       BoxLayout layout = new BoxLayout(fp, BoxLayout.Y_AXIS);
       fp.setLayout(layout);
       
       b1 = new JButton();
       b2 = new JButton();
       b3 = new JButton();
       b4 = new JButton();
       b5 = new JButton();
       
       fp.add(b1);
       fp.add(b2);
       fp.add(b3);
       fp.add(b4);
       fp.add(b5);
    }
    
    
}

这是我得到的错误

Exception in thread \"main\" java.lang.StackOverflowError
    at java.awt.Component.setFont(Component.java:1907)
    at java.awt.Container.setFont(Container.java:1753)
    at javax.swing.JComponent.setFont(JComponent.java:2748)
    at javax.swing.LookAndFeel.installColorsAndFont(LookAndFeel.java:208)
    at javax.swing.plaf.basic.BasicPanelUI.installDefaults(BasicPanelUI.java:66)
    at javax.swing.plaf.basic.BasicPanelUI.installUI(BasicPanelUI.java:56)
    at javax.swing.JComponent.setUI(JComponent.java:660)
    at javax.swing.JPanel.setUI(JPanel.java:153)
    at javax.swing.JPanel.updateUI(JPanel.java:126)
    at javax.swing.JPanel.<init>(JPanel.java:86)
    at javax.swing.JPanel.<init>(JPanel.java:109)
    at javax.swing.JPanel.<init>(JPanel.java:117)
    at FirstPanel.<init>(FirstPanel.java:26)
    at FirstPanel.<init>(FirstPanel.java:28)
  • 你读过关于布局的官方挥杆教程吗? docs.oracle.com/javase/tutorial/uiswing/layout/box.html
  • 但我的应用程序没有运行方法?你得到一个错误还是什么?
  • minimal reproducible example 请 .. 确保该示例是最小的、可编译的和可按原样运行的。显示的代码无法编译 - 用普通的 JLabel 替换不相关的(所以正确地省略了!)TitlePane。
  • @kleopatra 是的,这是我的问题,它没有运行,因为它有错误。我已经编辑了我的帖子并包含了我得到的错误
  • 您在构造函数中调用FirstPanel 的构造函数,这给了您无限递归。 fp = new FirstPanel(); --> fp = this;

标签: java swing layout-manager boxlayout


【解决方案1】:

最好先调用pack,然后让JFrame 可见。

pack();
setVisible(true);

主要用途还有:

SwingUtilities.invokeLater(() -> new MainFrame());

或者我喜欢的:

SwingUtilities.invokeLater(() -> new MainFrame().setVisible(true));

这确保了正确的线程。

错误是在 FirstPanel 中有一个 FirstPanel fp。这是一个无限嵌套的对象。因此从未完全创造。

   BoxLayout layout = new BoxLayout(this, BoxLayout.Y_AXIS);
   setLayout(layout);
   ...
   add(b1);

人们还经常看到只为变量创建一个匿名 JPanel 并使用它。在像“FirstPanel”这样的无名的情况下,这是有道理的。但是“ButtonPanel”之类的没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多