【问题标题】:How to position a JButton around the screen?如何在屏幕周围定位 JButton?
【发布时间】:2016-02-02 18:50:30
【问题描述】:

我尝试查看许多文档和教程,但似乎没有一个可以一起使用。我只是想为我的朋友和我正在尝试制作的“游戏”制作一个简单的“主菜单”。当没有背景图像存在时,我可以移动按钮,并且我只能获取背景图像但无法移动按钮。 所以我的问题是如何定位 JButtons?

这是我的代码和屏幕截图: What my frame looks like

    package game;
    import java.awt.FlowLayout;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;

    public class MainMenu extends JFrame{

    private JButton singPlay = new JButton("Single Player");
    private JButton twoPlay = new JButton("Two Player");

    public MainMenu()
    {   
        JFrame frame = new JFrame("TestTEST");
        JPanel panel = new JPanel();

        frame.setSize(400,500);
        frame.setLocation(700,300);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new JLabel(new ImageIcon("C:\\Users\\Austin\\Pictures\\Landscape.jpg")));

        frame.setLayout(new FlowLayout());
        frame.add(singPlay);
        frame.add(twoPlay);

        frame.setSize(399,499);
        frame.setSize(400, 500);
    }

    public static void main(String[] args)
    {
        new MainMenu();

    }
}

【问题讨论】:

  • 您希望按钮放置在哪里?
  • 我希望按钮位于中心,垂直方向如下面所述的 camikr,我尝试查看文档,但无法让它与我的代码一起使用。

标签: java swing jframe jbutton


【解决方案1】:

现在您正在使用 JLabel 作为内容窗格,这没有多大意义。

您应该扩展JPanel 并覆盖paintComponent() 以自己绘制背景,而不是将背景放入JLabelHere 是一个很好的自定义绘画教程。

一旦你有你的背景JPanel,把你的JButtons 放在里面,并将它用作你的内容窗格。

之后,如果您希望手动定位 JButtons,那么您可能正在寻找 null layout

【讨论】:

  • 实际上,如果您不想调整背景图像的大小并且知道标签不会使用子组件来计算首选大小,那么 JLabel 并不是一个坏主意。在简单的情况下它会简单得多,而不是我在使用自定义组件时遇到问题。空布局也很少是解决方案,并且引入了更多的工作,然后他们解决了
【解决方案2】:

JFrame.setContentFrame() 不是您设置背景图像的方式。在How to set background image in Java? 上查看所选答案

此外,您应该在 Swing 事件线程中执行所有这些操作。

public static void main(String [] args) {
  SwingUtilities.invokeLater( new Runnable() {
     public void run() {
       new MainMenu();
     }
  });
}

【讨论】:

  • 其实使用setContentPane是一个非常好的设置JFrame背景组件的方法。你链接的答案不是一个很好的例子,原因有两个,一是关于小程序(即使对于 JApplet,setContentPane 也是一个不错的选择),二,你不应该扩展顶级容器的绘制,原因之一是因为 JRootPane 和 contentPane 位于它的顶部。
【解决方案3】:

所以我的问题是如何定位 JButton?

使用适当的布局管理器。

您将布局管理器设置为 FlowLayout,以便按钮显示在框架的顶部。

也许您想将按钮放在框架的中心。如果是这样,那么您可以使用 GridbagLayout。

另外,不要使用 setSize()。使用 pack() 方法。最后,在您将组件添加到框架后,框架应该是可见的。

所以你的代码可能看起来像:

public MainMenu()
{
    JPanel panel = new JPanel();
    panel.setOpaque(false);
    panel.add(singPlay);
    panel.add(twoPlay);

    JFrame frame = new JFrame("TestTEST");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setContentPane(new JLabel(new ImageIcon("yourfilename.jpg")));
    frame.setLayout(new GridBagLayout());
    frame.add(panel, new GridBagConstraints());
    frame.pack();
    frame.setLocationRelativeTo( null );
    frame.setVisible( true );
}

或者您可能希望按钮垂直居中。然后你可以使用垂直的BoxLayout

阅读 Layout Managers 上的 Swing 教程并自行决定什么是合适的。

【讨论】:

    【解决方案4】:

    一个简单的解决方案是使用GridBagLayout,以下将按钮居中,在每个按钮的顶部,垂直和水平放置在容器中

    public MainMenu() {
        JFrame frame = new JFrame("TestTEST");
        JPanel panel = new JPanel();
    
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new JLabel(new ImageIcon("C:\\Users\\Austin\\Pictures\\Landscape.jpg")));
    
        frame.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        gbc.insets = new Insets(4, 4, 4, 4);
        gbc.fill = GridBagConstraints.HORIZONTAL;       frame.add(singPlay, gbc);
        frame.add(twoPlay, gbc);
    
        frame.pack();
        frame.setLocationRelativeTo(null);
    
        frame.setVisible(true);
    }
    

    附带说明,虽然JLabel 在这种情况下有效,但您需要注意它会根据标签本身的icon(和text)属性计算它的首选大小,而不是子标签, JLabel 真的不是为了容纳其他组件而设计的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多