Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFrame-Won';t显示多个JPanel_Java_Swing_Background_Jframe_Jpanel - Fatal编程技术网

Java JFrame-Won';t显示多个JPanel

Java JFrame-Won';t显示多个JPanel,java,swing,background,jframe,jpanel,Java,Swing,Background,Jframe,Jpanel,再一次,我正在编写一个简单的Java程序,我遇到了一些问题。我在JFrame中只有2个面板,但它只显示第二个面板。如果我去掉了第二个,第一个就行了。我怎么能同时看这两个节目 代码如下: package counter.main; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEve

再一次,我正在编写一个简单的Java程序,我遇到了一些问题。我在JFrame中只有2个面板,但它只显示第二个面板。如果我去掉了第二个,第一个就行了。我怎么能同时看这两个节目

代码如下:

package counter.main;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.net.URL;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Main extends JFrame {

public static JTextField fieldName;
private JLabel labelMessage;
private JButton buttonSubmit;
private JButton buttonDerp;
private JLabel derps;
private JLabel space1;
private JLabel space2;
private JLabel space3;
private JLabel askName;
private JLabel space4;
int clicks = 0;
File MarioCoin;

//Key to access automatic "system crash" - keyDerp134
//Note - Keys are extremely useful when wanting to bypass a type of task and debugging.

JFrame frame = new JFrame("Enter Your Name");
public Main() {
    createView();

    setTitle("Enter your name");
    setSize(500, 100);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    revalidate();
    repaint();
} 

private void createView() {
    final JPanel panel = new JPanel();
    getContentPane().add(panel);
    panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 20));

    space1 = new JLabel("                ");
    space2 = new JLabel("                      ");
    space3 = new JLabel("                      ");
    space4 = new JLabel("            ");

    askName = new JLabel("Please enter your name");
    panel.add(askName);

    derps = new JLabel("0/100 Derps");
    derps.setFont(new Font( "Arial", Font.PLAIN, 18));

    fieldName = new JTextField();
    fieldName.setPreferredSize(new Dimension(150, 30));
    panel.add(fieldName);

    buttonSubmit = new JButton("Submit");
    buttonSubmit.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String derpKey = "keyDerp134";
            String name = fieldName.getText();
            if(name.isEmpty()) {
                labelMessage.setText("Your name can't be nothing, now can it?");
                setSize(500, 135);
            } else {
                askName.setText("                      Hi, " + name + ".");
                SelectionFrame.select.setText("Select Your Material, " + name + ".");
                setSize(500, 100);
                try {
                    Thread.sleep(1000);   
                } catch(InterruptedException ex) {
                    Thread.currentThread().interrupt();
                }
                    if (name.equals(derpKey)) { 
                    clicks = 101;
                    updateCounter();
                }
                SelectionFrame.frame1.setVisible(true);    
                setVisible(false);
                buttonSubmit.setEnabled(false);
                fieldName.setEnabled(false);
                labelMessage.setText("                  " + name + ", Click -->");
                setTitle("Collect 100 Derps!");
                revalidate();
                repaint();
                buttonDerp = new JButton("Derp");
                buttonDerp.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        clicks++;
                        updateCounter();
                        URL soundURL = Main.class.getResource("/counter/main/MarioCoin.wav");
                        try {
                            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundURL);
                            Clip clip = AudioSystem.getClip();
                            clip.open(audioInputStream);
                            clip.start();
                            if (clicks >= 100) {
                                clip.stop();
                                buttonDerp.setEnabled(false);
                            }
                        } catch (IOException | UnsupportedAudioFileException | LineUnavailableException x) {
                            x.printStackTrace();
                        }
                    }
                }); 

        panel.add(buttonDerp);
        panel.add(derps);
        panel.add(space4);


        }
    }}); 
    panel.add(buttonSubmit);
    panel.add(space1);

    labelMessage = new JLabel("");
    panel.add(labelMessage);
    pack();
}

public static void main(String[] args) { 
    new Main();
    SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        new Main().setVisible(true);
        new CrashReportFrame();
        new SelectionFrame();
    }
});
}


public void updateCounter() {
    derps.setText(clicks + "/100 Derps");
    if (clicks >= 1 && clicks < 10) {
        labelMessage.setText("               Keep Going!");
    }

    if (clicks >= 10 && clicks < 50) {
        labelMessage.setText("     Keep 'em Comin'!");
    }

    if (clicks >= 50 && clicks < 70) {
        labelMessage.setText("                       Okay...");
    }

    if (clicks >= 70 && clicks < 80) {
        labelMessage.setText("  Slow down a little");
    }

    if (clicks >= 80 && clicks < 90) {
        labelMessage.setText("               Slow down, " + fieldName.getText() + "!");
    }

    if (clicks >= 90 && clicks < 100) {
        labelMessage.setText("    Stop! The system-");
    }

    if (clicks >= 100) {
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        try {
            Thread.sleep(3000);                 //1000 milliseconds is one second.
        } catch(InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
        setVisible(false);
        JOptionPane.showMessageDialog(null, "You Crashed The System!");
        //CrashReportFrame.frame2.setVisible(true);
    }
}



public void paint(Graphics g) {
    super.paint(g);
}

}
}


非常感谢您的帮助:)

您需要了解Java Swing/AWT布局管理器,包括BorderLayout,它是顶级窗口内容窗格的默认布局。使用容器将组件添加到BorderLayout时,如果未指定约束,则默认情况下,该组件将添加到BorderLayout.CENTER。这意味着以这种方式添加的最后一个零部件将覆盖添加到同一位置的任何其他零部件。解决方案包括:

  • 使用容器(此处的contentPane)和BorderLayout约束将组件添加到BorderLayout中,以便它们转到不同的BorderLayout位置
  • 使用不同的布局管理器,如BoxLayout或GridBagLayout
  • 嵌套JPanel,每个都使用自己的布局管理器。这可以让您使用非常简单的代码创建复杂的GUI
  • 您可以在此处找到指向Swing教程的链接,包括布局管理器教程和其他Swing资源:

    其他建议:

    • 避免设置任何东西的大小。相反,让布局管理器和组件自己的首选尺寸设置自己的尺寸
    • 您当前的代码会向用户抛出几个jframe,这可能会让用户感到有些恼火,特别是如果执行过度。取而代之的是考虑创建<强> > <强> jFrand并使用卡布局交换jPoT“视图”。
    • 您有一个扩展JFrame的类,还有一个JFrame字段,其中至少有一个是冗余的
    • 通过让类扩展JFrame,您可能会陷入困境,迫使您创建和显示JFrame,而这通常需要更大的灵活性。事实上,我敢说,我创建的大多数Swing GUI代码和我看到的大多数Swing GUI代码都没有扩展JFrame,事实上,很少有人愿意这样做。更常见的是,您的GUI类将面向创建JPanel,然后可以将JPanel放入JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts进行交换。这将大大提高GUI编码的灵活性
    正如我在接下来的几行中所说,我在一个JFrame中有两个JPanel,其中只有一个正在显示。好的,我将尝试学习更多关于布局的知识,并按照您所说的说明进行操作。
    package counter.main;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.Graphics;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    public class SelectionFrame extends JFrame {
    
    public static JLabel select = new JLabel("");
    private JButton stone;
    private JButton wood;
    private JButton coin;
    private JButton food;
    
    static JFrame frame1 = new JFrame("Select Your Material");
    public SelectionFrame() {
        createView();
    
        frame1.setTitle("Select Your Material");
        frame1.setResizable(false);
        frame1.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame1.setSize(400, 120);
        frame1.setLocationRelativeTo(null);
    
    }
    
    private void createView() {
    
        frame1.getContentPane().setBackground(Color.black);
        frame1.repaint();
    
        JPanel panel3 = new JPanel();
        frame1.getContentPane().add(panel3);
        panel3.setLayout(new FlowLayout(FlowLayout.CENTER));
    
        JPanel panel4 = new JPanel();
        frame1.getContentPane().add(panel4);
        panel4.setLayout(new FlowLayout(FlowLayout.CENTER, 25, 55));
    
        select.setFont(new Font( "Dialog", Font.PLAIN, 18));
        panel3.add(select);
    
        stone = new JButton("Stone");
        panel4.add(stone);
    
        wood = new JButton("Wood");
        panel4.add(wood);
    
        coin = new JButton("Coin");
        panel4.add(coin);
    
        food = new JButton("Food");
        panel4.add(food);
    
        frame1.revalidate();
        frame1.repaint();
    
    }
    
        public void paint(Graphics g3) {
        super.paint(g3);
    }