我在向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的新手,所以任何帮助都将非常感激。 对不起所有代码,谢谢你的帮助!!
答案 0 :(得分:4)
未经测试,但流程布局可能使用了面板的首选大小,并且您可能没有覆盖getPreferredSize()
以返回除[0,0]维之外的其他内容。
此外,您应该在调用setHello()
的{{1}}方法中封装hello变量的更改。调用代码不应该处理重绘。 panl应该知道什么时候需要重新绘制,并重新调用自己。