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)的主要内容,如果未能解决你的问题,请参考以下文章
我的 Blazor 服务器应用程序在一台本地计算机上的 Azure B2c 登录时遇到空引用错误,但在另一台本地计算机上没有,有啥想法吗?