使用null布局的元素放置

时间:2014-07-23 11:16:32

标签: java swing layout layout-manager null-layout-manager

我的null布局有问题。程序有这样的结构:

窗口(JFrame)
- 标签窗格(JTabbedPane)
- ..一些标签..
- 覆盖在JScrollPane(类表)

中的重写JPanel

我也有一个覆盖的JLabel(类看板)。

我尝试在表中添加看板的一些实例,什么都没有。如果我将Table的布局从null更改为BorderLayout(例如),则元素出现并且运行良好。

Oracle文档说了大约3个步骤:1)设置null布局,2)在子元素上调用setBounds()和3)在具有null布局的元素上调用repaint()。这对我来说不起作用(非常非常,真的)。

表格放置代码(Window的构造函数):

Table table = new Table();
JScrollPane panel = new JScrollPane(table);

tabbedPanel.addTab("New tab", panel);
tabbedPanel.setSelectedIndex(tabbedPanel.getTabCount() - 1);

table.setPreferredSize(new Dimension(600, 400));
table.setSize(600, 400);

表构造函数:

setDoubleBuffered(true);
setLayout(null);
setBounds(0,0,600,400);

Kanban kanban = new Kanban("Label text");
kanban.setBounds(10, 10, kanban.getWidth(), kanban.getHeight());

add(kanban);

怎么了?为什么元素不以null布局绘制?

---添加 我需要一个空布局,因为我需要标签的点位置。

2 个答案:

答案 0 :(得分:2)

kanban.getWidth(), kanban.getHeight()他们是0.但我同意上述所有评论。不要使用null布局。使用GridLayout定义面板并将所有标签放在那里

答案 1 :(得分:0)

NUllLayout是最有效的布局管理器,因为随之而来的自由,您可以明确指定元素的放置位置。但要真正有效地使用它,您需要以像素为单位在Frame上绘制位置。在编码时应用一些几何,请考虑以下代码。

package com.samuTech.DialogBoxes;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JLabel;

public class NullLayout2 extends JFrame {

private static JLabel nameLabel;
private static JLabel passwordLabel;
private static JTextField userName;
private static JPasswordField pass;
private static JButton ok;

public NullLayout2(){

    super("Null Layout");

    setSize(getMaximumSize().width,getMaximumSize().height);
    setLocation(getLocation().x,getLocation().y);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    getContentPane().setBackground(Color.BLUE);
    setLayout(null);

    nameLabel = new JLabel("User Name");
    passwordLabel = new JLabel("Password");
    userName =  new JTextField(20);
    pass = new JPasswordField(20);
    ok = new JButton("Ok");

    userName.setBounds(200,100,200,30);
    pass.setBounds(200,150,200,30);
    ok.setBounds(300,200,100,30);
    nameLabel.setBounds(5,100,150,30);
    passwordLabel.setBounds(5,150,150,30);

    add(userName);
    add(passwordLabel);
    add(nameLabel);
    add(pass);
    add(ok);

}

public void pain(Graphics g){

    g.drawString("Graphitii trials ", 55, 400);
}
public static void main(String[]args){
    javax.swing.SwingUtilities.invokeLater(

            new Runnable(){

                @Override
                public void run(){
                    new NullLayout2();
                }
            }

    );
}

}

在您的软件开发生活中,您显然需要特别的GUI设计,而不是放弃工具,请参阅Null Layout的官方文档here