Java jframe向它添加canvas和jpanel

时间:2016-07-25 02:08:58

标签: java swing canvas jpanel

以下类创建一个窗口/框架。

public class Window {

private int width, height;
private JFrame frame;
private Canvas canvas;
private String title;
private JButton button;
private JPanel panel;

public Window(String title){

    System.out.println("Initialization Window...");

    this.title = title;

    width = Reference.width;
    height = Reference.height;

    button = new JButton("cool button");

    CreateWindow();
}

private void CreateWindow(){

    frame = new JFrame(title);
    frame.setSize(width, height);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    panel = new JPanel();
    panel.add(button);

    canvas = new Canvas();
    canvas.setPreferredSize(new Dimension(width, height));
    canvas.setMaximumSize(new Dimension(width, height));
    canvas.setMinimumSize(new Dimension(width, height));
    canvas.setFocusable(false);

    frame.add(canvas);
    frame.add(panel);//my problem is in this line
    frame.pack();
}

当我运行它时,我添加到框架画布和jpanel。框架的大小设置为我所制作的按钮的大小。但删除"frame.add(panel)会使其恢复正常大小。我错过了什么吗?

以防我使用jpanel和canvas。我正在使用画布,因为我使用bufferstategy作为绘图图形,我需要jpanel添加按钮和其他东西。

2 个答案:

答案 0 :(得分:3)

  1. 当您以默认方式将两个组件添加到使用BorderLayout的任何容器时,例如JFrame,两者都默认添加到BorderLayout.CENTER位置,第二个组件覆盖第一个,所以这里JPanel涵盖Canvas,由于未显示Canvas,因此忽略其首选大小。
  2. 您将想要确切地确定组件相对于彼此的确切位置,特别是JPanel,Canvas以及它们如何放置在JFrame中,然后使用布局管理器而不是战斗布局管理器就像你的代码一样。
  3. 无论你做什么,都要避免像瘟疫那样的[...]布局。
  4. 将AWT和Swing组件混合起来通常是一个坏主意。您是否绝对肯定您需要使用Canvas? JPanels默认是双缓冲的,如果这是你的目标,它通常可以平滑任何动画。

答案 1 :(得分:0)

我必须说,如果您刚刚扩展JFrame,除非您想扩展其他内容,否则会更简单。 您需要了解,为了代码可读性和可重用性,您需要遵循传统的Java规则和最佳实践。

@Hovercraft Full Of Eels已经解释了你上面所需要的一切。我在这里所做的就是通过榜样让你正确,所以不需要复制他所说的内容。 FlowLayout可能是Java中最简单,最简单的布局管理器,但与GridLayoutGrdiBagLayout相比,它并不是那么强大。 这是代码:

public class Window extends JFrame {

    private int width, height;
    private Canvas canvas;
    private String title;
    private JButton button;
    private JPanel panel;

    public Window(String title){
        super( title );
        System.out.println("Initialization Window...");

        this.title = title;
        setLayout( new FlowLayout() );

        //width = Reference.width;
        //height = Reference.height;

        button = new JButton("cool button");

        createWindow();
    }

    private void createWindow(){


        setSize(width, height);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);

        panel = new JPanel();
        panel.add(button);

        canvas = new Canvas();
        canvas.setPreferredSize(new Dimension(200, 200));
        canvas.setMaximumSize(new Dimension(400, 400));
        canvas.setMinimumSize(new Dimension(200, 200));
        canvas.setFocusable(false);

        add(canvas);
        add(panel);//my problem is in this line
        pack();
    }

}