Java JFrame中的最后一个按钮设置为背景?

Java JFrame中的最后一个按钮设置为背景?,java,swing,jframe,jbutton,Java,Swing,Jframe,Jbutton,这里num3按钮设置为背景,我希望按钮对齐。这可能是一个小错误,我不确定,因为我刚刚开始使用JFrame。多谢各位 好吧,永远不要使用原始放置和布局管理器。 你可以通过一些布局技巧来做到这一点。例如,这个: 首先,导入布局类 import javax.swing.JButton; import javax.swing.JFrame; public class Test extends JFrame { private static final long serialVersi

这里num3按钮设置为背景,我希望按钮对齐。这可能是一个小错误,我不确定,因为我刚刚开始使用JFrame。多谢各位


好吧,永远不要使用原始放置和布局管理器。

你可以通过一些布局技巧来做到这一点。例如,这个:

首先,导入布局类

import javax.swing.JButton; 
import javax.swing.JFrame; 


public class Test extends JFrame { 
    private static final long serialVersionUID = 1L; 

    public Test() { 
        super("A test"); 
        setSize(360,300);//Size of JFrame 
        setResizable(false); 
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
        setVisible(true);//Sets if its visible. 

        JButton num1 = new JButton("1");//Set the JButton name 
        JButton num2 = new JButton("2"); 
        JButton num3 = new JButton("3"); 

        num1.setBounds(80,70,50,50); 
        num2.setBounds(130,70,50,50); 
        num3.setBounds(180,70,50,50); 

        add(num1); 
        add(num2); 
        add(num3); 
    } 
    public static void main (String[] args) { 
        new Test().setVisible(true); 
    } 
}
通过在框架的构造函数中复制此框架,使其成为BorderLayout框架

import java.awt.GridLayout;
import java.awt.BorderLayout;
然后制作另一个JPanel并将其制作为GridLayout JPanel:

setLayout(new BorderLayout());
参数1和3的意思是“恰好使用1行3列将小部件放置在此JPanel中”

最后在框架中心添加最后一个面板:

JPanel panel = new JPanel(new GridLayout(1,3));
panel.add(num1);
panel.add(num2);
panel.add(num3);
这样,你就不会处理尺寸或精确的点,仍然做你想做的


(要测试它,请复制“test”构造函数中的所有代码)

这是因为布局管理器。请检查下面的代码

我使用另一个JPanel来放置所有按钮。我将面板设置为具有1行3列对象

add(panel,BorderLayout.CENTER);
问题 基本上,有三个部分导致了这个问题

  • 默认情况下,
    JFrame
    使用
    BorderLayout
    。这意味着只有添加到五个可用布局位置中任何一个的最后一个组件将被管理
  • 在向帧添加任何内容之前,请调用
    setVisible(true)
  • 您可以在按钮上调用
    setBounds
  • 由于组件通常按z顺序(通常按FIFO顺序)绘制,并且由于代码中的优化,最后一个按钮由帧的
    边界布局
    控制,但其他两个按钮保持您之前设置的边界

    真有趣的问题

    解决方案
  • 使用适当的布局管理器,可能是
    FlowLayout
    GridBagLayout
  • 尽可能最后一次调用
    setVisible

  • 查看详细信息

    不要设置边界。使用适当的布局管理器。如果您希望水平对齐按钮,请使用
    FlowLayout
    。setLayout(null)可以做到这一点,但我不建议这样做,它适合从几个组件开始,但不适用于acctuals项目。阅读一些LayoutManager教程这是一个适合您的代码的快速答案,但通常我不使用setLayout(null)。
    import java.awt.GridLayout;
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JPanel;
    
    
    public class Test extends JFrame { 
        private static final long serialVersionUID = 1L; 
    
    
    JPanel buttonPanel;
    
    public Test() { 
        super("A test"); 
        setSize(360,300);//Size of JFrame 
        setResizable(false); 
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
        setVisible(true);//Sets if its visible. 
        setLayout(null);
    
        buttonPanel = new JPanel(new GridLayout(1, 3));
        buttonPanel.setBounds(80, 70, 150, 50);
        JButton num1 = new JButton("1");//Set the JButton name 
        JButton num2 = new JButton("2"); 
        JButton num3 = new JButton("3"); 
    
        buttonPanel.add(num1); 
        buttonPanel.add(num2); 
        buttonPanel.add(num3); 
    
        add(buttonPanel);
    } 
    
    
     public static void main (String[] args) { 
            new Test().setVisible(true); 
        } 
    }