Java - 重绘不起作用

4

我正在使用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));

    }
}

3
重新涂色工作正常,但你的程序里有一个bug -- 在哪儿呢?谁知道呢,因为我们看不到任何代码! - Hovercraft Full Of Eels
所展示的代码与您的问题关系不大,除了您正在使用NetBeans创建Swing GUI代码之外。我建议您不要这样做,因为它可能会让您免于学习Swing,从而干扰您对自己正在做什么和未做什么的理解。最好通过Swing教程学习Swing。 - Hovercraft Full Of Eels
在每个方法中,您可以看到我使用repaint()和validate。让我尝试编辑更多,我会看看能否在几分钟内编辑完成。 - Jay
我看到大量令人难以理解的Matisse生成的代码。我看到的方法是您可能正在向此GUI添加组件,但似乎没有删除所有组件。但主要是我看到了一个调试噩梦。 - Hovercraft Full Of Eels
Netbeans GUI 设计器的第一条规则:不要使用 GroupLayout - lhballoti
2个回答

2

代码已按要求提供... 我不知道如何一次添加所有面板。 - Jay
1
@Justin,如果你想在Swing应用程序中获得任何形式的健壮性,我建议你放弃NetBeans并自己编写代码。通过GUI构建器自动化此过程只会对你造成伤害。 - mre
我知道这个,但对我来说这是一个开始。我只需要一些能够生成代码的东西,这样我就不必为了一个面板而打出像213497084721384行那样多的代码了。 - Jay
1
+1 建议使用 CardLayout ;) - Hovercraft Full Of Eels
3
@Justin: 当NetBeans生成10万行代码时,我们可以用几行简单易懂的代码来替代它,你也可以。我强烈建议你远离由NetBeans生成的代码。使用它作为IDE非常好,但不要让它的拖放功能阻碍你的学习。 - Hovercraft Full Of Eels
好的,我会尝试做到。没有人曾经向我解释过这个。所以,我想我会使用CardLayout! - Jay

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) - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接