如何避免"置于"之上组件的另一个组件 - Java Swing

时间:2018-02-07 15:14:02

标签: java swing

我准备添加两个组件到框架:

class Lamina extends JPanel{

    public Lamina(){

        setLayout(new BorderLayout(50,50));

        JPasswordField user_password = new JPasswordField();
        add(user_password, BorderLayout.SOUTH);

    }

}

class DOMHeader extends JPanel
{
    public DOMHeader()
    {
        setLayout(new BorderLayout());

        JLabel title = new JLabel("Sign in");
        add(title, BorderLayout.NORTH);
    }
}

这是我的班级用户界面:

public class UI {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Frame frame = new Frame();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(true);
        frame.setTitle("Metin2");

    }  
}

框架类:

class Frame extends JFrame {

    public Frame() {
        Toolkit screen = Toolkit.getDefaultToolkit();
        Dimension screenSize = screen.getScreenSize();

        int widthScreen = screenSize.width;
        int heightScreen = screenSize.height;

        setBounds((widthScreen/4/2),(heightScreen/4/2),(widthScreen/2/2), (heightScreen/2/2));

        Image icon = screen.getImage("icon.jpeg");

        setIconImage(icon);


        /* Add to Components to frame*/
        add(new DOMHeader());
        add(new Lamina());

    }

}

在我的班级框架I中添加前面显示的组件,但它"放在"之上。组件的另一个组件。

根据API:

public Component add(Component comp,int index)
  

将指定的组件添加到给定位置的此容器中   (索引)。

我运行主要方法:

enter image description here

如您所见,它只显示组件DOMHeader类:add(new DOMHeader())

add(new Lamina())

发生了什么

我应该给它什么数字或常数?

1 个答案:

答案 0 :(得分:3)

这一行:

class Frame extends JFrame {
由于以下原因,

不正确:

  1. 由于AWT Frame class
  2. 而令人困惑
  3. 它扩展了JFrame,但您以后永远不会更改JFrame的行为,因此无需延长JFramecreate it inside of class
  4. 现在,我们必须前往JFrame课程,其中说:

      

    默认内容窗格上将设置BorderLayout管理器。

    现在,如果我们转到BorderLayout部分的布局管理器视觉指南,我们可以看到以下图片:

    enter image description here

    这告诉我们,我们只能将我们的组件添加到5个位置:

    • PAGE_START(或NORTH
    • LINE_START(或WEST
    • CENTER
    • LINE_END(或EAST
    • PAGE_END(或SOUTH

    回答你的问题:

      

    根据API:

    public Component add(Component comp,int index)
    
         
        

    将指定的组件添加到给定位置(索引)的此容器中。

      
         

    我应该给它什么数字或常数?

    你需要按如下方式添加它:

    JFrame frame = new JFrame("Write your title here"); //Follow first advice
    frame.add(new DOMHeader(), BorderLayout.NORTH); //These are the constants.
    frame.add(new Lamina(), BorderLayout.SOUTH);
    

    您通过在自己的JPanel中添加位置中的项目而不是JFrame本身,让您感到困惑。

    旁注:为什么要进行这些奇怪的计算?

    setBounds((widthScreen/4/2),(heightScreen/4/2),(widthScreen/2/2), (heightScreen/2/2));
    

    如果你打电话给widthScreen / 8

    ,会不会更清楚

    根据@camickr评论:

      

    不需要DOMHeader和Lamina类。您不需要扩展JPanel只是为了向框架添加组件。 "内容窗格" JFrame是JPanel,因此您只需将标签和文本字段添加到框架中,如上所示。

    您也可以通过以下方式改进代码:

    JFrame frame = new JFrame("Your title here");
    JLabel title = new JLabel("Sign in");
    JPasswordField userPassword = new JPasswordField(); //changed variable name to userPassword instead of user_password to follow Java naming conventions
    
    frame.add(title, BorderLayout.NORTH);
    frame.add(userPassword, BorderLayout.SOUTH);
    
    frame.setVisible(true); //This line should be the last one or you'll find yourself with strange "bugs" when your application starts until you move it or resize it
    

    无需为每个组件创建全新的JPanel