Java JPanel不使用setSize&;setPreferedSize

Java JPanel不使用setSize&;setPreferedSize,java,swing,jpanel,Java,Swing,Jpanel,请解释为什么它不起作用,你也可以发布一个解决方案来解决这个问题。提前非常感谢 public class Run extends JFrame{ /** Fields **/ static JPanel jpanel; private int x, y; /** Constructor **/ public Run() { /** Create & Initialise Things **/ jpanel = ne

请解释为什么它不起作用,你也可以发布一个解决方案来解决这个问题。提前非常感谢

public class Run extends JFrame{

    /** Fields **/
    static JPanel jpanel;
    private int x, y;

    /** Constructor **/
    public Run() {
        /** Create & Initialise Things **/
        jpanel = new JPanel();
        x = 400; y = 400;

        /** JPanel Properties **/
        jpanel.setBackground(Color.red);
        jpanel.setPreferredSize(new Dimension(20, 30));


        /** Add things to JFrame and JPanel **/
        add(jpanel);

        /** JFrame Properties **/
        setTitle("Snake Game");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setCursor(null);
        setResizable(false);
        setSize(new Dimension(x,y));
        setLocationRelativeTo(null);
        setVisible(true);
    }

    /** Set the Cursor **/
    public void setCursor() {
        setCursor (Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    }

    /** Main Method **/
    public static void main(String [ ] args) {
        Run run = new Run();
        run.setCursor();
    }
}
你可以使用这个方法。来自Java文档:

public void pack():
使此窗口的大小适合其子组件的首选大小和布局


应在构造函数末尾使用此方法:

...
setLocationRelativeTo(null);
setVisible(true);
pack();
编辑:

如果希望JFrame保持大小,而JPanel也保持大小。您可以尝试以下操作:

  • 创建一个JPanel并将其添加到JFrame。请注意,此面板将调整大小
  • 创建第二个JPanel并将其添加到前一个JPanel中,这样它将保持其大小
大概是这样的:

public Run()
{
    /** Create & Initialise Things **/
    jpanel = new JPanel();
    JPanel jpanel2 = new JPanel();
    x = 400;
    y = 400;

    /** JPanel Properties **/
    jpanel2.setBackground(Color.red);
    jpanel2.setPreferredSize(new Dimension(50, 50));
    jpanel.add(jpanel2);        

    /** Add things to JFrame and JPanel **/
    add(jpanel);

    /** JFrame Properties **/
    ...
}
Edit2:您也可以尝试:

试试这个:

jpanel.setPreferredSize(new Dimension(20, 30));
jpanel.setMinimumSize(new Dimension(20, 30));
jpanel.setMaximumSize(new Dimension(20, 30));

我不建议这样做,但它应该修复大小(只要框架的布局管理器不忽略这些值)。您需要学习如何使用布局管理器。

问题是,
JFrame
使用
BorderLayout
,它将尝试调整内容大小以适合父容器。虽然
BorderLayout
将尝试使用首选大小作为提示,但如果可用空间大于或小于,它将自动调整以允许中心内容(默认位置)填充父容器的整个可用空间

您可以尝试使用
FlowLayout
gridbagloayout
在更多情况下更可能遵循首选大小


查看更多详细信息

你说它不起作用是什么意思?我有400号的JFrame,但当我尝试将JPanel设置为30号,30号时,它只会继承JFrame的原始大小。Herm。。。我以前试过,但我不希望主框架改变大小以适应其子组件。此外,我还尝试将setPreferedSize与pack()一起使用,但它完全没有任何作用…@codenerd查看编辑,也看到了这一点。Herm,我以前也尝试过,但后来我无法控制jpanel2的位置,我试过setLocation();但是JpANEL2不会从中心移动。试着将组件定位在绝对位置。不,christian,muchas gracias por la ayuda,pero我使用了下面的答案:)谢谢你这对我有用:),谢谢你的帮助。记住,布局很有趣;)我看过你的个人资料,你有编程经验。我现在是大学二年级,想要一些Java的资料(我两个月前开始学习),请让我知道,我总是喜欢听取有实际经验的人的建议。问候一切取决于你想做什么。一个好的开始是,尝试一些东西并提出问题;)-我还想说,任何开发人员最大的优势之一就是能够研究问题,为已经提出的问题寻找答案。为了更好的解决方案而准备放弃一系列想法或发展的能力也很重要,知道何时这样做的经验也很重要。无论语言如何,对语言的理解都会对你有好处;)如果我在
JFrame
的顶部有一个
JMenuBar
,那么在调整
JPanel
的大小时,
BorderLayout
会考虑到它吗?JMenuBar应该通过setJMenuBar调用应用于框架,但本质上是肯定的
jpanel.setPreferredSize(new Dimension(20, 30));
jpanel.setMinimumSize(new Dimension(20, 30));
jpanel.setMaximumSize(new Dimension(20, 30));