【问题标题】:JPanel not working with setSize & setPrefferedSizeJPanel 不适用于 setSize 和 setPreferedSize
【发布时间】:2014-03-06 03:22:54
【问题描述】:

请解释为什么它不起作用,您能否发布解决此问题的解决方案。非常感谢您提前。

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();
    }
}

【问题讨论】:

  • 你说的不起作用是什么意思?
  • 嗯,我有大小为 400、400 的 JFrame,但是当我尝试将 JPanel 设置为大小 30、30 时,它只会从 JFrame 继承原始大小。

标签: java swing jpanel


【解决方案1】:

您可以使用pack() 方法。来自 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:你也可以试试absolute positioning

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

    jpanel.setLayout(null);

    Insets insets = jpanel2.getInsets();
    Dimension size = jpanel2.getPreferredSize();
    jpanel2.setBounds(125 + insets.left, 100 + insets.top, size.width, size.height);

    /** JPanel Properties **/
    jpanel2.setBackground(Color.red);
    jpanel.add(jpanel2);

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

    /** JFrame Properties **/
    ...
}

【讨论】:

  • Herm... 我之前尝试过,但我不希望主框架改变大小以适应其子组件。我还尝试将 setPreferedSize 与 pack() 一起使用,但它完全没有任何作用......
  • @codenerd 查看编辑并查看此post
  • Herm,我之前也尝试过,但是我无法控制我想要 jpanel2 的位置,我曾经尝试过 setLocation();但 JpANEL2 不会从中心移动。
  • 尝试this,在绝对位置定位组件。
  • No christian, muchas gracias por la ayuda, pero 我用了下面的答案.. ;)
【解决方案2】:

试试这个:

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

我不推荐它,但它应该固定大小(只要框架的布局管理器不忽略这些值)。您需要学习如何使用布局管理器。

【讨论】:

  • 谢谢它为我工作:),谢谢你的帮助。
【解决方案3】:

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

您可以尝试使用FlowLayoutGridBagLayout,这在更多情况下更符合首选尺寸

查看How to layout components on containers了解更多详情

【讨论】:

  • 请记住,布局很有趣 ;)
  • 我看过你的个人资料,你有编程经验。我目前在大学二年级,想要一些 Java 材料(我是 2 个月前开始的),请告诉我,我总是喜欢向有实际经验的人寻求建议。问候
  • 这一切都取决于你想做什么。一个很好的起点是Java Tutorials,尝试一些东西并提出问题;)-我还要说,任何开发人员的最大优势之一是研究问题的能力,寻找已经存在的问题的答案问。准备放弃思路或开发以寻求更好的解决方案的能力也很重要,并且知道何时这样做的经验也很重要。无论语言如何,对Design Patterns 的理解都会使您受益匪浅;)
  • 如果我在JFrame 的顶部有一个JMenuBar,那么在调整JPanel 的大小时,BorderLayout 是否会考虑它?
  • JMenuBar 应该通过 setJMenuBar 调用应用于框架,但本质上,是的
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 2020-08-03
  • 2012-01-19
  • 2018-07-07
  • 1970-01-01
相关资源
最近更新 更多