java - getPreferredSize() 适用于 JFrame;为什么它在 Frame 上不起作用?

标签 java swing preferredsize

我希望得到一些帮助来解决我困惑的问题。

我在 FrameFrame 上测试了 getPreferredSize()。在Frame中,getPreferredSize()返回全0(宽度和高度),而在Frame中,它返回非零数字,即工作。

我不确定 nolayout() 方法中的哪一部分编码使得 getPreferredSize() 仅返回 0,而 isPreferredSizeSet() > 返回FALSE,这意味着未设置首选大小。

为什么没有设置?有人可以帮忙吗?谢谢。

下面是这个简单测试程序的代码。

import java.awt.*;
import javax.swing.*;

public class test {
public test(){
    JFrame frame = new JFrame("AbsoluteLayoutDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container p = frame.getContentPane();
    p.setLayout(null);
    JButton b1 = new JButton("one");
    p.add(b1);
    Dimension size = b1.getPreferredSize();
    System.out.println("size width is "+size.width+" height is "+size.height);
    JLabel label2 = new JLabel("Text-Only Label");
    p.add(label2);
    size = label2.getPreferredSize();
    System.out.println("label size width is "+size.width+" height is "+size.height);

    Insets insets = p.getInsets(); 
    frame.setSize(300 + insets.left + insets.right, 125 + insets.top + insets.bottom);
    frame.setVisible(true);
}
public static void main(String[] args) {
    test t = new test();
    nolayout();
}enter code here



public static void nolayout() {

    Frame f = new Frame();
    f.setLayout(null);

    Insets its = f.getInsets();

    System.out.println("its left, "+its.left+" right, "+its.right+" top "+its.top+" bottom "+its.bottom);

    f.setLocation(200, 100 );
    f.setSize(its.left+its.right+300,its.top+its.bottom+200);

    Label l1 = new Label("Enter Integer to be added : ",Label.RIGHT);
    TextField t1 = new TextField("0",10);

    f.add(l1);
    f.add(t1);


    System.out.println("is l1 preferred size set "+l1.isPreferredSizeSet());
    Dimension sz = l1.getPreferredSize();
    l1.setBounds(its.left + 10, its.top + 10, sz.width, sz.height);
    System.out.println("label 1 width "+sz.width+" height " +sz.height);

    sz = t1.getPreferredSize();
    t1.setBounds(its.left + 100, its.top + 10, sz.width, sz.height);
    System.out.println("Text 1 width "+sz.width+" height " +sz.height);

    f.setVisible(true);
    }
} 

命令窗口的输出如下:

C:\JAVAPR>java test
size width is 55 height is 26
label size width is 88 height is 16
its left, 0 right, 0 top 0 bottom 0
is l1 preferred size set false
label 1 width 0 height 0
Text 1 width 0 height 0 enter code here

最佳答案

一旦指定 layoutgetPreferredSize() 的结果就是可靠的。和 pack()窗口。按照建议here ,您可能需要重写 getPreferredSize()

image

import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GridBagLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/** @see https://stackoverflow.com/posts/37501391/edit */
public class Test {

    private void display() {
        Frame f = new Frame(){
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(320, 240);
            }
        };
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        f.setLayout(new GridBagLayout());
        Panel p = new Panel();
        p.add(new Label("Test", Label.RIGHT));
        p.add(new TextField("Test", 10));
        f.add(p);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        new Test().display();
    }
}

关于java - getPreferredSize() 适用于 JFrame;为什么它在 Frame 上不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37500033/

相关文章:

java - Hibernate - 拥有的实体实例不再引用具有 cascade=”all-delete-orphan” 的集合

java - 如何检查invokelater是否完成

java - 使用静音按钮停止播放剪辑?

java - 如何在 JPanel 中放置带有 jmathplot 图的 JFrame

java - 滚动条在 JPanel 中不可见

java - JUnit 测试包含 RestTemplate 交换调用的 void 方法

java - 未正确加密和解​​密

java - 包含对面板区域的绘图

java - JPanel 调整大小未发生

java - 设计一个主题工厂