【问题标题】:'BoxLayout Can't be Shared' with .add [duplicate]'BoxLayout不能与.add共享'[重复]
【发布时间】:2019-09-26 05:45:46
【问题描述】:

我正在尝试为 java swing 程序编写一些代码,但我的程序抛出错误。我查看了有类似问题的帖子,但没有一个适用于这种情况。我究竟做错了什么?

我已将面板重新排列成更合乎逻辑的格式,但没有帮助。

这是我的代码,问题已在 cmets 中指出。每个缩进都是另一个面板级别。

BaseballStats()
{
JFrame myFrame = new JFrame();          
FlowLayout myLayout = new FlowLayout(); 
myFrame.setLayout(myLayout);      

    // configure JFrame with basic settings
myFrame.setTitle("JFrame Window");      
myFrame.setSize(400,200);
myFrame.setLocation(200, 300);
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel myPanel = (JPanel)myFrame.getContentPane();
    myPanel.setSize(200,200);
    myPanel.setLayout(new BorderLayout());      

        JPanel topmiddlePanel = new JPanel();
        topmiddlePanel.setLayout(new BoxLayout(topmiddlePanel, BoxLayout.Y_AXIS));

            JPanel game1panel = new JPanel();
            game1panel.setLayout(new BoxLayout(topmiddlePanel, BoxLayout.X_AXIS));
            game1panel.setAlignmentX(Component.TOP_ALIGNMENT);

                JLabel G1Label = new JLabel("Game 1 hits:");
                G1Label.setAlignmentX(Component.LEFT_ALIGNMENT);
     //problem here ---->// game1panel.add(G1Label);
                JSpinner G1Spinner = new JSpinner(new SpinnerNumberModel(1,1,5,1));
                G1Spinner.setAlignmentX(Component.RIGHT_ALIGNMENT);
                game1panel.add(G1Spinner);
                topmiddlePanel.add(game1panel);

            JPanel game2panel = new JPanel();
            game2panel.setLayout(new BoxLayout(topmiddlePanel, BoxLayout.X_AXIS));
            game2panel.setAlignmentX(Component.TOP_ALIGNMENT);

                JLabel G2Label = new JLabel("Game 2 hits:");
                G2Label.setAlignmentX(Component.LEFT_ALIGNMENT);
                game2panel.add(G2Label);
                JSpinner G2Spinner = new JSpinner(new SpinnerNumberModel(1,1,5,1));
                G2Spinner.setAlignmentX(Component.RIGHT_ALIGNMENT);
                game2panel.add(G2Spinner);
                topmiddlePanel.add(game2panel);

            JPanel game3panel = new JPanel();
            game3panel.setLayout(new BoxLayout(topmiddlePanel, BoxLayout.X_AXIS));
            game3panel.setAlignmentX(Component.CENTER_ALIGNMENT);

                JLabel G3Label = new JLabel("Game 3 hits:");
                G3Label.setAlignmentX(Component.LEFT_ALIGNMENT);
                game3panel.add(G3Label);
                JSpinner G3Spinner = new JSpinner(new SpinnerNumberModel(1,1,5,1));
                G3Spinner.setAlignmentX(Component.RIGHT_ALIGNMENT);
                game3panel.add(G3Spinner);
                topmiddlePanel.add(game3panel);

            JPanel game4panel = new JPanel();
            game4panel.setLayout(new BoxLayout(topmiddlePanel, BoxLayout.X_AXIS));
            game4panel.setAlignmentX(Component.BOTTOM_ALIGNMENT);

                JLabel G4Label = new JLabel("Game 4 hits:");
                G4Label.setAlignmentX(Component.LEFT_ALIGNMENT);
                game4panel.add(G4Label);
                JSpinner G4Spinner = new JSpinner(new SpinnerNumberModel(1,1,5,1));
                G4Spinner.setAlignmentX(Component.RIGHT_ALIGNMENT);
                game4panel.add(G4Spinner);
                topmiddlePanel.add(game4panel);

            JPanel game5panel = new JPanel();
            game5panel.setLayout(new BoxLayout(topmiddlePanel, BoxLayout.X_AXIS));
            game5panel.setAlignmentX(Component.BOTTOM_ALIGNMENT);

                JLabel G5Label = new JLabel("Game 5 hits:");
                G5Label.setAlignmentX(Component.LEFT_ALIGNMENT);
                game5panel.add(G5Label);
                JSpinner G5Spinner = new JSpinner(new SpinnerNumberModel(1,1,5,1));
                G5Spinner.setAlignmentX(Component.RIGHT_ALIGNMENT);
                game3panel.add(G5Spinner);
                topmiddlePanel.add(game5panel);

        myPanel.add(topmiddlePanel, BorderLayout.CENTER);

它应该产生一个整体面板,带有 3 个辅助面板(其中 2 个未显示)。显示的面板应该在一个盒子布局中有 5 个辅助面板。每个 THOSE 面板都有一个标签和一个流中的微调器。

感谢您的帮助!

【问题讨论】:

  • 欢迎来到 StackOverflow!如果您尝试尽可能减少代码,贡献者会更容易帮助您。例如,在我看来,从game2panel 开始的所有内容都无法证明您的问题。另外,您是否尝试在发布之前搜索类似的问题?我想你可能会在这篇文章中找到正确的答案:stackoverflow.com/questions/761341/…。如果那里提出的解决方案没有帮助,请尝试解释您的问题有何不同。祝你好运。
  • 我承认这是一个非常相似的问题,但另一个问题更多源于代码中 this 的使用。

标签: java swing layout-manager boxlayout


【解决方案1】:

BoxLayout 有点特殊,因为布局需要给出它正在布局的组件实例。 'BoxLayout can't be shared' 异常始终表明 BoxLayout 实例已使用某个组件创建,但随后作为布局添加到其他组件。

在您的情况下,相关行是:

    JPanel topmiddlePanel = new JPanel();
    JPanel game1panel = new JPanel();
    game1panel.setLayout(new BoxLayout(topmiddlePanel, BoxLayout.X_AXIS));

看到BoxLayout 是用topmiddlePanel 实例化的,但随后在game1panel 中设置为布局?

我不会提供更正的代码,因为我不确定在这种情况下您到底想做什么,但正确的解决方案必须是以下形式:

x.setLayout(new BoxLayout(x, ...))

【讨论】:

  • 好吧,这行得通,但现在我的面板真的很不稳定。我的旋转器很大,其中一些与其他旋转器在同一条线上。有没有办法为超过 3 个对象使用盒子布局?
  • 是的,我感觉您在使用该代码时会遇到更多问题...首先,您是否注意到您在面板 3 上添加了微调器 5:game3panel.add(G5Spinner);。这显然是不正确的,并且可能会解释您关于“其中一些在同一行”的评论。 BoxLayout 可以用于 3 个以上的对象吗?当然可以,这样做并没有什么特别之处。
  • 关于您的微调器比预期大的事实,我认为这可能是在这些对象上设置调用 setPreferredDimensions() 的情况。我还鼓励您先查看有关 BoxLayout 的 Java 教程:docs.oracle.com/javase/tutorial/uiswing/layout/box.html
  • 但是,如果您仍然无法解决您的问题,那么考虑提出一个新问题会更合适(即更符合 StackOverflow 的做法)。确保您首先尽可能减少示例(阅读stackoverflow.com/help/mcve),并在发布之前查看有关此主题的任何其他 SO 问题。您当前结果的屏幕截图也可能有所帮助。祝你好运。
  • 最后一件事……一旦问题得到解决(即您最初提出的问题),请考虑关闭它。这样做的首选方法是接受最能帮助您进步的答案(请参阅stackoverflow.com/help/accepted-answer)。如果您自己找到了解决方案,那么为了其他 SO 用户的利益,我们鼓励您回答自己的问题。作为最后的手段,如果问题尚未解决但不再相关,您也可以点击问题下方的“关闭”。
猜你喜欢
  • 2015-07-20
  • 2019-04-06
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 2014-08-20
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多