繁体   English   中英

repaint()不更新JPanel

repaint() not updating JPanel

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

因此,我编写了一个程序,其中有一个GUI,用户可以在其中输入用于烟花发射的参数,并且在屏幕中间有一个面板,应该在按下按钮时绘制该烟花。 但是,在我的程序中,JPanel并未更新,因此未绘制任何内容。 代码如下

//This is the method that build the JPanel in the center for the launch
public JPanel buildCenter() {
    JPanel center=new JPanel();
    center.setBackground(Color.black);
    center.setVisible(true);
    return center;
}


//This is the method the build the GUI, the buttons and such are in the other panels labeled top, west, east, etc.
public void buildGUI(){
    configureSliders();
    configureRadioButtons();
    JFrame frame=new JFrame();
    JPanel panel=new JPanel();
    JPanel top=new JPanel();
    panel.setLayout(new BorderLayout());
    Fireworks.setFont(new Font("Helvetica", Font.BOLD, 30));
    frame.setLayout(new BorderLayout());
    top.setLayout(new BoxLayout(top, BoxLayout.X_AXIS));
    top.add(Box.createHorizontalGlue());
    top.add(Fireworks);
    top.add(Box.createHorizontalGlue());
    frame.add(top, BorderLayout.NORTH);
    frame.add(panel, BorderLayout.CENTER);
    frame.setSize(1920,1080);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    panel.add(buildCenterTop(),BorderLayout.NORTH);
    panel.add(buildCenter(), BorderLayout.CENTER);
    panel.add(buildwest(), BorderLayout.WEST);
    panel.add(buildeast(),BorderLayout.EAST);
    panel.add(Launch, BorderLayout.SOUTH);
    Launch.addActionListener(this);
}
//this is the action performed method where repaint won't work. fire is my fireworks object with the paintcomponent method for the launch.
@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource().equals(Launch)) {
        setColor();
        setTime();
        setExplosion();
        fire.setVelocity(veloslider.getValue());
        fire.setTheta(thetaslider.getValue());
        buildCenter().add(fire);
        buildCenter().repaint();
        buildCenter().validate();

    }
1 个回复

您的buildCenter()方法所做的只是创建一个黑色背景的空面板。

然后,将此空面板添加到框架:

panel.add(buildCenter(), BorderLayout.CENTER);

然后在ActionListener中执行以下操作:

buildCenter().add(fire);
buildCenter().repaint();
buildCenter().validate();

所有这些所做的就是创建3个以上的空面板。 您不想再创建3个面板。 您想要将组件添加到现有面板。

您需要做的是创建“中心”面板的单个实例,然后保留引用该面板的变量,以便您将来可以更新该面板。

因此,您需要在类中定义一个实例变量:

private JPanel centerPanel;

然后在buildGui()方法中创建面板:

//panel.add(buildCenter(), BorderLayout.CENTER);
centerPanel = buildCenter();
panel.add(buildCenter, BorderLayout.CENTER);

然后,可以在ActionListener中将组件添加到中心面板:

//buildCenter().add(fire);
//buildCenter().repaint();
//buildCenter().validate();
centerPanel.add( fire );
centerPanel.revalidate();
centerPanel.repaint();
1 revalidate()和repaint()不会更新我的JPanel

我正在尝试制作一个程序,其中显示的JTabel会根据用户的文件选择进行更改。 他们通过单击调用某些method()的按钮来输入此内容,该按钮返回一个新的JTable。 但是我无法在GUI中更新表。 尽管我对它们有很多了解,但我不能完全确定validate() , revalidate ...

2 repaint()JFrame和JPanel

我尝试在一个ArrayList和另一个JPanel中添加JPanel。 然后重新绘制()JPanel所在的JFrame。经过数小时的尝试,我开始感到疲倦并难以思考。 我对程序进行了多次更改,以至于可能出现了一些我不再看到的简单错误(错误也可能在我在这里写的英文中找到)。 如果无法理解, ...

3 从swingworker调用JPanel的repaint()

首次加载慢速JPanel的最佳实践是什么? 我有一个JButton,单击该按钮会加载一个新的JPanel,其中包含52个JLabel,每个JLabel包含一个图像(这是纸牌游戏)。 但是,单击此JButton会在第一次加载JPanel时冻结GUI约5秒钟。 我知道我应该使用Sw ...

4 Java JFrame和JPanel与Repaint()的差异

我一直在玩一些简单的Graphics2D绘画,并在这里得到了社区的一些非常好的帮助。 我设法通过将代码从主JFrame类移动到JPanel然后添加到JFrame类中,从我的“弹性球”中解决了闪烁,有人能告诉我为什么会产生这样的差异吗? ...

5 repaint()方法不重绘JPanel

好的,所以首先我知道关于此问题还有很多其他线程,但是他们只是说尝试使用invalidate()和validate()对我没有影响。 我的问题是-标题很明显-JPanel的repaint()方法不会重新绘制。 我在paintComponent()方法中添加了一些调试消息,这是控制台的输出: ...

6 JFrame或Jpanel中的repaint()方法?

我是Java新手,刚刚开始学习GUI组件。 因此,我正在阅读Headfirst Java,并且有这段代码解释了JPanel paintcomponent方法。 只要用户单击“更改颜色”按钮,就可以更改椭圆的颜色。 -- MyDrawPanel类 - 除了调用repaint( ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM