无法将paintComponent面板添加到框架中

时间:2012-02-11 07:40:09

标签: java swing jpanel layout-manager paintcomponent

我在向JFrame添加JPanel(其中包含paintComponent)时遇到问题。
如果这是我添加到框架的唯一的东西,它的工作原理。但是只要我添加一个布局管理器并将其他组件添加到JFrame,它就不再显示带有绘画的面板!

使这更清楚......

这是有效的代码,并且成功显示了JPanel:

绘制标志的面板(实际上我不是要打招呼,这只是代码在这里)

public class SignPanel2 extends JPanel {
public int hello;

public void paintComponent(Graphics comp) {
    Graphics g = (Graphics) comp;
    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(70, 250, 150, 150);

    g.setColor(Color.BLACK); 

    if (hello > 0) 
        g.drawString("h",135, 270);

    if (hello > 1 ) 
        g.drawString("h e",135, 270);

    if (hello > 2) 
        g.drawString("h e l",135, 270);

    if (hello > 3) 
        g.drawString("h e l l",135, 270);

    if (hello > 4) 
        g.drawString("h e l l o",135, 270);
}

}

我把面板放在框架上:

public class SignFrame extends JFrame {

// the constructor method
public SignFrame () {

    super("This is the title of the Sign Frame");
    setSize(300,500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // make a container for the frame
    Container content = getContentPane();

    // call from the drawing panel
    SignPanel2 signpanel = new SignPanel2();
    // change class variable of SignPanel
    signpanel.hello = 5;
    signpanel.repaint();


    // add signpanel to container
    content.add(signpanel);

    setContentPane(content);

    setVisible(true);

}

}

主要课程

public class TheSignMain {

public static void main (String[] args) {

    SignFrame signframe = new SignFrame();

}

}

以上工作非常精细,并为我提供了一个框架,其中包含所需的绘图。

但是如果我在框架中添加其他组件并添加布局管理器,它就不再向我展示这幅画。即使我使用repaint() 我必须包含一个布局管理器,否则它会添加面板与绘画,但不包括其他组件。 这就是我的框架类现在的样子,这就是我遇到问题的地方。

公共类SignFrame扩展了JFrame {

// the constructor method
public SignFrame () {

    super("This is the title of the Sign Frame");
    setSize(300,500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // make a container for the frame
    Container content = getContentPane();


    // need a layout manager to decide the arrangement of the components on the container
    FlowLayout flo = new FlowLayout();
    // designate the layout manager to the container
    content.setLayout(flo);


    // make components
    JPanel buttons = new JPanel();
    JButton play = new JButton("Play");
    JButton pause = new JButton("Pause");
    JButton stop = new JButton("Stop");
    // add components to a panel
    buttons.add(play);
    buttons.add(pause);
    buttons.add(stop);
    // add panel to frame container
    content.add(buttons);


    // call from the drawing panel
    SignPanel2 signpanel = new SignPanel2();
    // change class variable of SignPanel
    signpanel.hello = 5;
    signpanel.repaint();


    // add signpanel to container
    content.add(signpanel);

    setContentPane(content);

    setVisible(true);

}

}

我是Java的新手,所以任何帮助都将非常感激。 对不起所有代码,谢谢你的帮助!!

1 个答案:

答案 0 :(得分:4)

未经测试,但流程布局可能使用了面板的首选大小,并且您可能没有覆盖getPreferredSize()以返回除[0,0]维之外的其他内容。

此外,您应该在调用setHello()的{​​{1}}方法中封装hello变量的更改。调用代码不应该处理重绘。 panl应该知道什么时候需要重新绘制,并重新调用自己。