【问题标题】:Widgets behaving strangely when using "setlayout(null)"小部件在使用“setlayout(null)”时表现异常
【发布时间】:2012-08-31 18:51:44
【问题描述】:

我正在我的代码中执行以下调用:

...
setLayout(null);
...

我正在尝试通过指定它们的 x 和 y 坐标来放置按钮和文本字段。

当我运行程序(使用 Eclipse 或 BlueJ)时的问题是我需要在面板上运行到按钮和文本字段的位置才能分别看到按钮和文本字段。

当我找到文本字段时,它很小。只有当我开始写作时,它才会采用我指定的大小。

有人知道怎么解决吗?

【问题讨论】:

  • 规则是在没有 LayoutManager 的情况下执行任何 ui。打破这条规则将不可避免地带来痛苦......

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


【解决方案1】:
  1. 避免使用 setLayout (null),除非你有很好的理由。您可以在此处了解布局管理器:http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

  2. 如果你仍然想使用空布局,你必须设置组件的宽度和高度,而不仅仅是它的 x 和 y 位置(参见 setSize 方法)。

从上面提到的链接:

虽然我们强烈建议您使用布局管理器,但您也可以 在没有它们的情况下执行布局。通过设置容器的布局属性 为 null,您使容器不使用布局管理器。有了这个 策略,称为绝对定位,必须指定大小和 该容器中每个组件的位置。缺点之一 绝对定位是它没有调整好时 顶级容器被调整大小。它也不能很好地适应 用户和系统之间的差异,例如不同的字体大小 和语言环境。

【讨论】:

    【解决方案2】:

    我建议使用setBounds 方法而不是setLocation

        JTextField tf = new JTextField(10);
        Dimension d = tf.getPreferredSize();
        tf.setBounds(x, y, d.width, d.height);
    

    当然,如果您使用的是空布局管理器,您还需要注意您的preferredSize。这是一个包含所有主要方面的示例:

    import java.awt.*;
    import javax.swing.*;
    
    public class TestProject extends JPanel{
    
        public TestProject(){
            super(null);
    
            JTextField tf = new JTextField(10);
            add(tf);
    
            Dimension d = tf.getPreferredSize();        
            tf.setBounds(10, 20, d.width, d.height);
    
        }
    
        @Override
        public Dimension getPreferredSize(){
            //Hard coded preferred size - but you'd probably want 
            //to calculate it based on the panel's content 
            return new Dimension(500, 300);
        }
    
        public static void main(String args[])
        {
    
    
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                    frame.setContentPane(new TestProject());    
                    frame.pack();
                    frame.setVisible(true);
                }
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-03
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      相关资源
      最近更新 更多