【问题标题】:Java - Repaint Not WorkingJava - 重绘不工作
【发布时间】:2011-08-23 02:20:24
【问题描述】:

所以我正在用 Java 制作一个基于文本的 RPG 小程序。我正在使用 SWING 面板,上面有文本字段和按钮。我在 Netbeans 中对其进行编程,并且正在使用 GUI 编辑器。我已经制作了 HTML 页面,它可以在浏览器中正常打开。当我单击一个按钮来切换面板时(基本上将第一个设置为不可见),新面板不会加载。我尝试使用 repaint() 和 validate() 但它不起作用.....有什么帮助吗?

package applettest;

import javax.swing.UIManager;

public class NewApplet extends java.applet.Applet {

    startScreen ss;
    registerScreen rs;
    charactercreationScreen ccs;

    @Override
    public void init() {

        try {
            //This sets the look and feel to NIMBUS.
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {

                @Override
                public void run() {
                    initComponents();
                    startup();
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );
    }// </editor-fold>                        
    // Variables declaration - do not modify                     
    // End of variables declaration                   

    public void startup() {
        showCharacterCreationScreenSTART();
        showRegisterScreenSTART();
        showStartScreenSTART();
    }

    public void showStartScreen() {
        setSize(410, 350);
        ss = new applettest.startScreen(this);
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).
                addComponent(ss, javax.swing.GroupLayout.PREFERRED_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE));
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).
                addComponent(ss, javax.swing.GroupLayout.PREFERRED_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE));
    }

    public void showStartScreenSTART() {
        setSize(410, 350);
        rs.setVisible(false);
        ss = new applettest.startScreen(this);
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).
                addComponent(ss, javax.swing.GroupLayout.PREFERRED_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE));
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).
                addComponent(ss, javax.swing.GroupLayout.PREFERRED_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE));
        repaint();
        validate();
    }

    public void showRegisterScreen() {
        repaint();
        validate();
        ss.setVisible(false);
        setSize(400, 350);
        rs = new applettest.registerScreen(this);
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).
                addComponent(rs, javax.swing.GroupLayout.PREFERRED_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE));
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).
                addComponent(rs, javax.swing.GroupLayout.PREFERRED_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE));
        repaint();
        validate();
    }

    public void showRegisterScreenSTART() {
        repaint();
        validate();
        ccs.setVisible(false);
        setSize(400, 350);
        rs = new applettest.registerScreen(this);
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).
                addComponent(rs, javax.swing.GroupLayout.PREFERRED_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE));
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).
                addComponent(rs, javax.swing.GroupLayout.PREFERRED_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE));
        repaint();
        validate();
    }

    public void showCharacterCreationScreen() {
        rs.setVisible(false);
        setSize(400, 350);
        ccs = new applettest.charactercreationScreen(this);
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).
                addComponent(ccs, javax.swing.GroupLayout.PREFERRED_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE));
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).
                addComponent(ccs, javax.swing.GroupLayout.PREFERRED_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE));
        repaint();
        validate();

    }

    public void showCharacterCreationScreenSTART() {
        setSize(400, 350);
        ccs = new applettest.charactercreationScreen(this);
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).
                addComponent(ccs, javax.swing.GroupLayout.PREFERRED_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE));
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).
                addComponent(ccs, javax.swing.GroupLayout.PREFERRED_SIZE,
                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE));

    }
}

【问题讨论】:

  • repaint 可以正常工作,但是您的程序中有一个错误——在哪里?谁知道呢,因为我们没有看到任何代码!
  • 显示的代码与您的问题没有太大关系——除了您使用 NetBeans 创建 Swing GUI 代码之外——我建议您不要这样做,因为它可以保护您免受必须学习 Swing,从而干扰您对自己在做什么和不做什么的理解。最好阅读 Swing 教程并正确学习 Swing。
  • 在每个方法中你可以看到我使用 repaint() 并验证。让我试着再编辑一些,看看我能不能在几分钟内编辑。
  • 我看到大量几乎不可能破译马蒂斯生成的代码。我看到您可能正在向此 GUI 添加组件但似乎并未删除所有组件的方法。但主要是我看到了一个调试噩梦。
  • Netbeans GUI 设计器规则#1:不要使用GroupLayout

标签: java swing netbeans applet repaint


【解决方案1】:

【讨论】:

  • 代码按要求在那里...我真的不知道如何一次添加所有面板..
  • @Justin,如果您希望 Swing 应用程序具有任何类型的稳健性,我建议您远离 NetBeans 并真正自己编写代码。通过 GUI 构建器自动执行此过程只会伤害您。
  • 我知道这一点,但这对我来说是一个开始。我只需要一些东西来生成代码,所以我不必只为 1 个面板输入 213497084721384 行。
  • 1+ 用于建议 CardLayout ;)
  • @Justin:虽然 NetBeans 生成 100000 行,但我们可以用几行易于理解的行来编写它,您也可以。我强烈建议您远离 NetBeans 生成的代码。将它用作 IDE,很好,因为它是一个优秀的,但不要让它的拖放实用程序妨碍您的学习。
【解决方案2】:

我尝试使用 repaint() 和 validate() 但它不起作用

仅供参考,使用 Swing 时应该是:

panel.revalidate();
panel.repaint(); // sometimes needed

虽然该代码通常在从面板中添加/删除单个组件时使用。如果您要交换整个面板,那么 CardLayout 是最好的选择。

此外,您应该扩展 JApplet,而不是 Applet。

【讨论】:

  • 非常感谢!但是当我扩展 JApplet 时,我得到了错误! java.lang.reflect.InvocationTargetException at java.awt.EventQueue.invokeAndWait(EventQueue.java:1242) at applettest.NewApplet.init(NewApplet.java:22) at sun.applet.AppletPanel.run(AppletPanel.java:434) at java.lang.Thread.run(Thread.java:722)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 2014-03-01
  • 2018-09-07
  • 2013-08-08
  • 2014-12-02
相关资源
最近更新 更多