【问题标题】:How can I transform a simple GUI java class into an applet?如何将简单的 GUI Java 类转换为小程序?
【发布时间】:2015-05-11 01:48:52
【问题描述】:

我有这个简单的石头、剪刀、纸 java 类,但我似乎无法将它转换为小程序。我已经研究了一个多星期的主题,并且尝试了几个教程等。我似乎缺少一些东西;另外,小程序对我来说是一个全新的概念......

这是我希望转换为小程序的 TestClass.java 的 java 代码:

import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Component;
import java.awt.Container;

public class TestClass extends JFrame implements ActionListener{
    public JLabel myLbl_P1 = new JLabel("enter Player 1 Name:");
    public JTextField myTxtTemp1 = new JTextField(4);
    public JLabel myLbl_P2 = new JLabel("enter Player 2 Name:");
    public JTextField myTxtTemp2 = new JTextField(4);
    public JButton myBtnPlay=new JButton("Play");
    public JLabel myLblResults = new JLabel("                         ");

    public static void main(String args[]) {
        new TestClass();

    }
    TestClass() {
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel p = new JPanel();
        myBtnPlay.addActionListener(this);
        p.add(myLbl_P1);
        p.add(myTxtTemp1);
        p.add(myLbl_P2);
        p.add(myTxtTemp2);
        p.add(myBtnPlay);
        p.add(myLblResults);

        p.setLayout(new BoxLayout(p,BoxLayout.Y_AXIS));
        p.add(myLbl_P1);
        p.add(myTxtTemp1);
        p.add(myLbl_P2);
        p.add(myTxtTemp2);
        p.add(myBtnPlay);
        p.add(myLblResults);

        this.getContentPane().add (p);
        this.setSize(400, 300);

    }

        //------------------------------------------------
            public void actionPerformed(ActionEvent e) {
                String winnerName, P1, P2, winnerStr, myStrResult;
                winnerName="";
                String Pl1=myTxtTemp1.getText();
                String Pl2=myTxtTemp2.getText();
                int winner;
                myStrResult="";

                if(Pl1.isEmpty() || Pl2.isEmpty()){
                    JOptionPane.showMessageDialog(null,"Invalid Player Name","Error",JOptionPane.WARNING_MESSAGE);
                }

                RPSPlayer player1 = new RPSPlayer(Pl1);
                RPSPlayer player2 = new RPSPlayer(Pl2);

                RockPaperScissorsGame x = new RockPaperScissorsGame(player1, player2);

                String[] result=x.rps(player1, player2);
                P1=result[0];
                P2=result[1];
                winnerStr=result[2];
                winner=Integer.valueOf(winnerStr).intValue();

                myStrResult=player1.getName()+" chose "+P1+"   ";
                myStrResult=myStrResult+player2.getName()+" chose "+P2+"   ";

                if(winner==0){
                    myStrResult=myStrResult+"   It was a Draw!";
                }
                else{
                    if(winner==1){
                        winnerName=player1.getName();
                    }
                    if(winner==2){
                        winnerName=player2.getName();
                    }
                    myStrResult=myStrResult+winnerName+" Won!";
                }
                //System.out.println(myStrResult);
                myLblResults.setText(myStrResult);

    }
}

我尝试过改变:

public class TestClass extends JFrame implements ActionListener{   ***to***
public class TestClass extends JApplet implements ActionListener{

public static void main(String args[]) {   ***to***
void init() {

this.getContentPane().add (p);  ***to***
this.add (p);

this.setSize(400, 300);   ***to***
//this.setSize(400, 300);

this.setVisible(true);   ***to***
//this.setVisible(true);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   ***to***
//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

我也不确定是否需要在开始时导入其他任何内容 - 也许 import java.applet.*; ??? 此外,这是我试图加载代码的 html 页面 - 我相信它是正确的:

<!DOCTYPE html>
<html> 
<head>
    <title></title>
</head>
<body>
    <applet code=applet.class width="400" height="400">
    Your browser does not support the applet tag.
    </applet>
</body>
</html>

但是,就像我说的那样,我对此完全陌生,我正在尝试... 如果有人可以帮我展示将原始代码制作成小程序所需的确切更改,我们将不胜感激,并且对我的学习大有帮助...

【问题讨论】:

  • 1) 部署 Java 桌面应用程序(例如基于 JFrame)的最佳方式是使用 Java Web Start。 JWS 通过网页上的链接工作。 2) 为什么要编写小程序?如果是老师指定的,请参考Why CS teachers should stop teaching Java applets
  • 是的。这是给我的教授的。实际上,他完全支持 JWS,但在讲座和实验室任务的一部分中将 GUI 转换为小程序,说我们至少应该学习它们,但他同意使用 JWS……不幸的是,我最近上周做了手术,并且在试图完成学期时落后了......
  • “一项将 GUI 转换为小程序的实验室任务,说我们至少应该学习它们” 询问他是否已将小程序部署到“现实世界的受众”(例如作为他的学生的例子)在去年。现在有很多事情,比他想象的要多。小程序过去相对容易“在浏览器中查看”。但那些时代早已一去不复返了。此外,随着 JS 接管了以前使用 applet 完成的许多事情(而且通常做得更好),applet 的实际使用正在减少。

标签: java swing applet


【解决方案1】:

对于核心内容,将其移至JPanel。当你想在窗口中显示时使用JFrame,当你想将其显示为小程序时使用JApplet

这就是为什么通常不鼓励直接从顶级容器扩展(并将核心逻辑直接放在它们上)的原因。将您的 UI 分成面板,这些面板可以添加到您想要的任何容器中。

您应该将这些顶级容器的管理职责与您的 UI 的其余部分分开,这样您就不会在“窗口”可能不存在时“隔离”组件,例如

它增加了它的可重用性并减少了它的耦合。

测试窗格

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TestPane extends JPanel implements ActionListener {
    public JLabel myLbl_P1 = new JLabel("enter Player 1 Name:");
    public JTextField myTxtTemp1 = new JTextField(4);
    public JLabel myLbl_P2 = new JLabel("enter Player 2 Name:");
    public JTextField myTxtTemp2 = new JTextField(4);
    public JButton myBtnPlay = new JButton("Play");
    public JLabel myLblResults = new JLabel("                         ");

    TestPane() {
        myBtnPlay.addActionListener(this);
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        add(myLbl_P1);
        add(myTxtTemp1);
        add(myLbl_P2);
        add(myTxtTemp2);
        add(myBtnPlay);
        add(myLblResults);
    }

    //------------------------------------------------
    @Override
    public void actionPerformed(ActionEvent e) {
        String winnerName;
        String P1;
        String P2;
        String winnerStr;
        String myStrResult;
        winnerName = "";
        String Pl1 = myTxtTemp1.getText();
        String Pl2 = myTxtTemp2.getText();
        int winner;
        myStrResult = "";
        if (Pl1.isEmpty() || Pl2.isEmpty()) {
            JOptionPane.showMessageDialog(null, "Invalid Player Name", "Error", JOptionPane.WARNING_MESSAGE);
        }
        RPSPlayer player1 = new RPSPlayer(Pl1);
        RPSPlayer player2 = new RPSPlayer(Pl2);

        RockPaperScissorsGame x = new RockPaperScissorsGame(player1, player2);

        String[] result = x.rps(player1, player2);
        P1 = result[0];
        P2 = result[1];
        winnerStr = result[2];
        winner = Integer.valueOf(winnerStr).intValue();

        myStrResult = player1.getName() + " chose " + P1 + "   ";
        myStrResult = myStrResult + player2.getName() + " chose " + P2 + "   ";

        if (winner == 0) {
            myStrResult = myStrResult + "   It was a Draw!";
        } else {
            if (winner == 1) {
                winnerName = player1.getName();
            }
            if (winner == 2) {
                winnerName = player2.getName();
            }
            myStrResult = myStrResult + winnerName + " Won!";
        }
        //System.out.println(myStrResult);
        myLblResults.setText(myStrResult);
    }

}

TestApplet

import javax.swing.JApplet;

public class TestApplet extends JApplet {

    private TestPane testPane;

    @Override
    public void init() {
        testPane = new TestPane();
        add(testPane);
    }

}

这是(自动生成的)HTML 文件,用于在小程序查看器中显示 TestApplet

<HTML>
    <HEAD>
        <TITLE>Applet HTML Page</TITLE>
    </HEAD>
    <BODY>

        <H3><HR WIDTH="100%">Applet HTML Page<HR WIDTH="100%"></H3>

        <P>
    <APPLET codebase="classes" code="test/TestApplet.class" width=350 height=200></APPLET>
</P>

<HR WIDTH="100%"><FONT SIZE=-1><I>Generated by NetBeans IDE</I></FONT>
</BODY>
</HTML>

nb 我在 test 包中找到了这些文件;)

测试帧

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestFrame {

    public static void main(String[] args) {
        new TestFrame();    
    }

    public TestFrame() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

现在,说了这么多,我强烈反对你使用小程序,它们存在于自己的小安全沙箱中,这只会增加开发的复杂性,相反,鼓励你看看Java Web Start

【讨论】:

  • 好的...我正在尝试使用您的 HTML 文件的 TestPane... 我收到错误:ClassNotFoundException test.TestApplet.class 我没有意识到 Chrome 不提供 java 支持.. .我在更新java插件后在IE中试过这个...
  • 确保将课程放在test 包中
  • 由于错过了一个多星期的课程,我也不知道如何为小程序创建包。我将所有文件放入一个文件夹:MyPackage 然后我将所有类放入该文件夹:RockPaperScissorsGame.class、RPSPlayer.class、TestClass.class、TestPane.class 和 TestApplet.class。现在我不知道该怎么办......
猜你喜欢
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多