JFrame开空了

时间:2014-02-26 20:05:08

标签: java swing jframe

我正在尝试创建一个程序,并且它在JFrame中没有显示任何相当奇怪的内容。代码似乎适合,但java似乎是混淆或什么的。到目前为止,这是我的代码:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class Img extends JFrame{

/**
 * 
 */
private static final long serialVersionUID = -6362332275268668673L;
static JFrame panel = new JFrame();
private JButton next= new JButton("Next");

public Img(String a, String b){
    ShowPng1(a,b);
}

public void ShowPng1(String a, String b) {
    ImageIcon theImage = new ImageIcon("Icon_Entry_21.png");
    panel.setSize(300, 300);
    panel.setResizable(false);

    JLabel label = new JLabel(a);
    JLabel label2 = null;
    if(!b.isEmpty()){
        label2 = new JLabel("NOTE: " + b);
    }

    JLabel imageLabel = new JLabel(theImage);
    imageLabel.setOpaque(true);

    JPanel p1 = new JPanel(new GridLayout(3, 1));
    p1.add(imageLabel);
    p1.add(label);
    if(label2 != null)p1.add(label2);

    panel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    panel.setVisible(true);
}

public void ShowPng2(String a, String b) {
    ImageIcon theImage = new ImageIcon("Icon_Entry_21.png");
    panel.setSize(300, 300);
    panel.setResizable(false);

    JLabel label = new JLabel(a);
    JLabel label2 = null;
    if(!b.isEmpty()){
        label2 = new JLabel("NOTE: " + b);
    }

    JLabel imageLabel = new JLabel(theImage);
    imageLabel.setOpaque(true);

    JPanel p1 = new JPanel(new GridLayout(3, 1));
    p1.add(imageLabel);
    p1.add(label);
    if(label2 != null)p1.add(label2);
    p1.add(next);

    panel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    panel.setVisible(true);

    try {
        Runtime.getRuntime().exec("cmd /c start mailrugames://play/0.3001");
    } catch (IOException e) {
        JOptionPane.showMessageDialog(null, "Error launching client.","Error", JOptionPane.ERROR_MESSAGE);
        System.exit(-1);
    }

}

public void actionPerformed(ActionEvent e) {
    try {
        ShowPng1("Applying patch NOW.","");
        Process p1 = Runtime.getRuntime().exec("cmd /c start Start.bat");
        p1.waitFor();
        JOptionPane.showMessageDialog(null, "Done!","Note", JOptionPane.INFORMATION_MESSAGE);
        System.exit(0);
    } catch (IOException e1) {
        e1.printStackTrace();
        System.exit(-1);
    } catch (InterruptedException e1) {
        e1.printStackTrace();
        System.exit(-1);
    }
}

public static void main(String[] args) throws IOException, InterruptedException {

    Img i = new Img("Preparing client for a patch","");
    Process p1 = Runtime.getRuntime().exec("cmd /c start Clean.bat");
    p1.waitFor();
    Img.panel.dispose();

    i.ShowPng2("Launching client.","Make sure the client is fully patched before closing it and clicking `Next`");      
}
}

它应该将图片imageLabel加载到容器中,并在底部显示一些文字labellabel2ShowPng1()ShowPng2()之间的差异是“下一步”按钮,它位于ShowPng2()

2 个答案:

答案 0 :(得分:4)

  1. 您不向JFrame添加任何内容。
  2. 您永远不会将JFrame设置为可见。
  3. 您将Swing事件线程与长时间运行的进程捆绑在一起。

    • 您需要将组件添加到JFrame本身。
    • 添加组件后,您需要将其设置为
    • 您需要在后台线程中运行长时间运行的进程。

    • 您需要完成Swing教程。 查看代码,点击信息链接,然后查看其中包含的资源。

答案 1 :(得分:4)

1)您没有向JFrame本身添加组件。你忘了添加

public class Img extends JFrame{
  .
  .
  public void ShowPng1(String a, String b) {       
       //your code here, don't call panel.setVisible(true) here is not necesary
       this.add(panel);
  }

}

2)不要打电话给panel.setVisible(true)没有必要..只需在主电话中拨打i.setVisible(true)即可。

3)确保您的代码在事件调度线程中运行,并使用SwingUtilities.invokeLater(..)

包装它

4)你应该在后台线程中执行你的命令,如果它是一个长时间运行的任务,如果不是你将阻止你的gui。阅读Concurrency in swing

中的更多内容

5)遵循Java代码约定,方法名称以驼峰样式的小写字母开头。

6)也可以关注@HovercraftFullOfEels建议。

查看Swing Tutorial