子组件的setSize的位置在哪里

时间:2010-09-05 19:47:44

标签: java swing layout components jpanel

我从JPanel扩展了课程。这个类包含了其他几个JComponents和很多绘画。我做了什么,我知道这是不正确的,我为绘画覆盖了paintComponent,到目前为止一切都很好。

但我也在此方法中设置了所有子组件的位置和大小,因为它们依赖于JPanel中的getWidth和getHeight。我知道这不是组件的地方,但我在哪里做这种事情。在构造函数时,未设置大小。那怎么回事?因为只要我在paintComponent方法中有location和size方法,CPU就永远不会停止计算。

编辑:我看起来像这样;

public class abc extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        /** all the painting stuff */
        textfield.setLocation(
            this.getWidth() * someValue,
            this.getHeight() * someotherValue);
        // also depends on getHeight() and getWidth()
        textfield.setSize(new Dimension(getHeight(), getWidth());
    }
}    

一切正常,但我的CPU使用率总是在10%左右。如果两个线路都被淘汰,则CPU使用率降至0%。所以现在我使用了像你推荐的Layoutmanager。而且一切看起来都很好,但CPU负载没有变化,它仍然保持在10%左右。代码,它现在看起来如何:

public class abc extends JPanel {

    public abc() {
        GridBagLayout gblayout = new GridBagLayout();

        this.setLayout(gblayout);

        textfield = new JTextField();
        textfield.setHorizontalAlignment(JTextField.CENTER);
        textfield.setBackground(new Color(0, 0, 0, 0));
        textfield.setBorder(null);
        textfield.setText("0");

        gblayout.setConstraints(textfield, new GridBagConstraints(
            0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER,
            GridBagConstraints.BOTH, new Insets(4, 4, 4, 4), 1, 1));

        this.add(textfield);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        /** still the same paintings */ }
}

2 个答案:

答案 0 :(得分:1)

如果你向我们展示一些代码并且可能会解释你想要做什么,那将会非常有帮助但是根据我的理解,你试图在一个JPanel中做太多。您应该有一个单独的面板,如果您打算在其上绘制,则覆盖paintComponent(),而另一个(或更多)覆盖其他组件。

实际上,几乎不可能调整单个组件的大小,因为它们必须遵循为其父组件(通常是JPanel)选择的布局,因此您也必须牢记这一点。

答案 1 :(得分:1)

组件的大小和位置由布局管理器设置。初始化帧后,调用pack()来调整所有组件的大小。

您应该首先设置最小,最大和首选大小,然后让布局管理器完成其工作。您可以在paintComponent()中获取组件的宽度和高度,以根据其大小进行渲染。