JButton 出现在一台计算机上,但不出现在其他计算机上(BorderLayout)

Posted

技术标签:

【中文标题】JButton 出现在一台计算机上,但不出现在其他计算机上(BorderLayout)【英文标题】:JButton Appears on One Computer, But Not Others (BorderLayout) 【发布时间】:2014-03-28 07:34:16 【问题描述】:

我是 Swing 的新手。我正在使用 Eclipse IDE 构建一个带有 JScrollPane 的 JFrame。 JScrollPane 内部是 Border Layout 中的 JPanel。我尝试使用下面的代码向 JFrame 添加一个 JButton(称为“submitAnswers”),但由于某种原因,该按钮仅出现在我的计算机上的帧末尾,但没有出现在其他计算机上(我的朋友在他的Mac,我在像我这样的单独的 Windows 操作系统上尝试过)。我尝试过的一些建议的解决方案以及其他无效的解决方案包括:

使用 pack() 方法。 原因:由于 JPanel 的首选尺寸在高度上比 JFrame 长得多(因此我使用了 JScrollPane),打包 JFrame 只会导致文本不可见在桌面上。 在内容 JPanel 上放置按钮。 原因:我不知道。它只是不会出现在另一台台式计算机或我朋友的 mac 计算机上。 使用 BorderLayout.SOUTH 而不是 BorderLayout.PAGE_END。 原因:绝对没有变化。该按钮在我的计算机上仍然可见,但在其他计算机上不可见。 直接在 JFrame 上放置按钮。原因:我不知道。

另外,我的 JFrame 嵌套在一个静态方法中;因此,我只包含了我遇到问题的特定方法的相关代码。

以前有人遇到过这个问题吗?非常感谢您的洞察力。

代码:

    public static void createTestPage() 

    JFrame testFrame = new JFrame("testing...1,2,3");

    //Customizes icon to replace java icon
    try 
        testFrame.setIconImage(ImageIO.read(new File("src/icon.png")));
     catch (IOException e1) 
        // TODO Auto-generated catch block
        e1.printStackTrace();
    

    //Centers location of introFrame to center of desktop
    Dimension screenDimensions = Toolkit.getDefaultToolkit().getScreenSize();
    testFrame.setLocation(screenDimensions.width / 16,screenDimensions.height / 14);

    //Size and display the introFrame.
    Insets insets = testFrame.getInsets();

    //Format size of screen itself
    testFrame.setSize(1200 + insets.left + insets.right,
                  400 + insets.top + 250 + insets.bottom);

    //Temporarily set screen so that it cannot be resized
    testFrame.setResizable(false);

    //Set background color of testFrame
    testFrame.getContentPane().setBackground(new Color(75, 0, 130));

    testFrame.setLayout(new BorderLayout());

    //Set layout of testFrame
    testFrame.setLayout(new BorderLayout(10, 1));

    //Test content
    JPanel testContentPanel = new JPanel();
    testContentPanel.setBackground(new Color(75, 0, 130));
    testContentPanel.setSize(new Dimension(900,2060));
    testContentPanel.setPreferredSize(new Dimension(900, 2060));

    //Test content pane layout
    testContentPanel.setLayout(new BoxLayout(testContentPanel, BoxLayout.PAGE_AXIS));

    //Create panel to hold instructions text
    JPanel instructionsPanel = new JPanel();
    instructionsPanel.setBackground(new Color(75, 0, 130));
    instructionsPanel.setLayout(new BorderLayout(10,1));

    //Create JPanel for submit answers button
    JPanel submitAnswersPanel = new JPanel(new BorderLayout());
    submitAnswersPanel.setBackground(new Color(75, 0, 130));
    submitAnswersPanel.setVisible(true);

    //Create button to submit personality test answers
    JButton submitAnswers = new JButton("Submit Answers");
    submitAnswers.setVisible(true);
    submitAnswers.setBorder(new EmptyBorder(10, 400, 10, 400));

    //Add submitAnswers button to panel
    submitAnswersPanel.add(submitAnswers);

    //Add submitAnswersPanel to test content panel
    testContentPanel.add(submitAnswersPanel);


        //Create scroll pane to allow for scrollable test (contents cannot fit one page)
    JScrollPane testScrollPane = new JScrollPane();
    testScrollPane.setViewportView(testContentPanel);

    //Get rid of horizontal scroll bar and add vertical scrollbar
    testScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    testScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

    //Speed up scrolling
    testScrollPane.getVerticalScrollBar().setUnitIncrement(16);

    testFrame.add(testScrollPane);

    //Experiment to show button
    testFrame.setVisible(true);
    

【问题讨论】:

请编辑您的问题以包含一个mctre 来展示您所描述的问题;为保持一致性,请使用UIManager 图标,如here 所示。 testContentPanel.setPreferredSize(new Dimension(900, 2060)); 1) Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于精确放置或确定组件的大小。要为强大的 GUI 组织组件,请改用布局管理器或 combinations of them,以及 white space 的布局填充和边框。 2) 这比我的屏幕还高! 每当您有一个带有 BorderLayout 的面板时,请确保在添加组件时使用特定位置,例如 BorderLayout.SOUTH。目前,您有 'submitAnswersPanel.add(submitAnswers);` 没有指定按钮应该出现在布局中的哪个位置。 另外,我会将 testContentPanel 直接传递给 JScrollPane 构造函数。 (如果这些建议中的任何一个解决了您的问题,请告诉我,我会将它们添加为答案) 试试'testFrame.getContentPane().add(testScrollPane);'和'testFrame.getContentPane().setLayout(new BorderLayout());' (将 getContentPane() 添加到两者) 【参考方案1】:

我已经稍微重构了您的代码,以便使用方法来创建 GUI 的各个组件。可以找到完整代码at this ideone link

当我第一次将您的代码复制到我的机器上时,我看到的是唯一可见的是按钮。所以我用自己的方法创建了所有组件,然后使用Border Layout将它们添加到框架和面板中。然后,这使我能够将说明放在 NORTH 部分,将按钮放在 SOUTH 部分,然后主要位将放在 CENTER 部分。

关于这些部分需要注意的一点:(来自文档)

组件根据其首选大小和容器大小的约束进行布局。 NORTH 和 SOUTH 组件可以水平拉伸; EAST 和 WEST 组件可以垂直拉伸; CENTER 组件可以水平和垂直拉伸以填充剩余的空间。

因此,您应该将要缩放大小的组件添加到 CENTER 部分。

我的主要方法现在看起来像这样:

public static void main(final String[] args) 
    final JButton submitAnswers = createSubmitAnswersButton();
    final JPanel instructionsPanel = createInstructionsPanel();

    final JPanel testContentPanel = createContentPanel();
    testContentPanel.add(instructionsPanel, BorderLayout.NORTH);
    testContentPanel.add(submitAnswers, BorderLayout.SOUTH);

    final JScrollPane scrollingContentPane = createScrollPaneFor(testContentPanel);

    final JFrame testFrame = createJFrame();
    testFrame.add(scrollingContentPane, BorderLayout.CENTER);

    testFrame.setVisible(true);

【讨论】:

您好 Dan,感谢您建议的格式。我通过制作所有边框布局并将按钮放在 BorderLayout.SOUTH 和 BorderLayout.NORTH 中的说明来编辑代码,并将大约 4 个 JLabel、8 个 JRadioButtons 和 4 个 JTables 放在 BorderLayout.CENTER 中。但是,我仍然遇到同样的问题,甚至更多。首先,该按钮仅出现在我的计算机上,而不出现在另一台台式计算机上。其次,只有最后 2 个单选按钮出现在中心。我的代码如下。 Frame 上的内容窗格是一个单独的面板。它可以使用 BorderLayout 容纳 5 个组件。然后这些组件可以是 JPanel,而 JPanel 又可以容纳更多组件。如果将 JTable 添加到框架的 BorderLayout.CENTER 中,然后将另一个 JTable 添加到框架的同一区域,则最终会丢失组件。您需要将它们添加到单独的面板和滚动窗格中,然后嵌套它们以实现所需的显示。或者使用其他布局管理器,例如GroupLayout 我已经用这个嵌套面板的东西举了一个例子at this ideone link 非常感谢 Dan 的宝贵帮助。现在一切都正确格式化除了按钮仍然不可见。我使用了与您在该 ideone 链接中与我共享的完全相同的格式方案。我使用 BorderLayout.SOUTH 将按钮放在 testContentPanel 上。运行程序时是否显示按钮? 是的,但它位于窗口底部,因此您需要滚动才能找到它。

以上是关于JButton 出现在一台计算机上,但不出现在其他计算机上(BorderLayout)的主要内容,如果未能解决你的问题,请参考以下文章

尝试保存时 VBA 宏抛出错误(但仅在一台计算机上)

我的 Blazor 服务器应用程序在一台本地计算机上的 Azure B2c 登录时遇到空引用错误,但在另一台本地计算机上没有,有啥想法吗?

Redis 没有自动启动

超出速率限制 - 仅在一台计算机上使用

如何修复仅在一台计算机上运行的 Exe 文件

域用户设置只能在一台计算机上登录杜绝安全隐患