Java Applet 显示数据库中的名称

标签 java html mysql applet

作为一项作业,我使用 HTML 表单、一个 servlet、一个 applet 和一个包含两个表的简单数据库编写了一个程序。这个程序背后的想法是在 html 文件的文本框中输入一个名字,在一个 servlet 中获取这个名字,在数据库中搜索这个名字并通知用户这个名字是否在数据库中。

数据库是MySQL,由两张表组成; tableA 在创建表时通过 insert 输入了三个名字,John Doe、Jane Doe 和 David Paterson。 TableB 用于要搜索的名称(无论在 HTML 的文本字段中输入什么)。如果找到名称,则在名称后面插入一个问号。如果找不到,则在名称后跟一个感叹号。例如姓名:David Doe 不在表 A 中,因此 !David Doe 被插入到表 B 中。但是对于 John Doe 呢?John Doe 被插入到表 B 中。 applet 然后使用 tableB 显示一条消息,告知该名称是否在(或不在)tableA 中。

这很复杂。您在 HTML 文本字段中输入名称并单击提交;这会将您带到一个显示消息/链接“单击此处查看小程序”的 servlet。当您单击该链接时,它会显示另一个页面,例如“John Doe 在表中”。

我的一切正常。现在我似乎无法开始工作的最后一步是让小程序消息“John Doe 在 table 上”显示为带白色文本的绿色椭圆形,或者如果该名称不是这三个名称之一tableA 消息应显示为带有黑色文本的红色椭圆形。它只是继续在纯白色背景上显示为常规文本。

我只包含小程序代码,有人看到我做错了什么吗?我编写了与独立小程序相同的代码,只是为了看看我是否可以将消息显示在带有白色文本的绿色椭圆形中并且它工作正常,所以我不确定它是否是我放置代码的地方。顺便说一句,这位教授没有帮助我已经向他征求意见,但作为一名在线学生,很难确定他的位置,而且我对 Java 还很陌生。

小程序代码:

import java.applet.*;
import java.awt.Color;
import java.awt.Graphics;
import java.sql.*;

public class MyApplet extends Applet {
public void paint(Graphics page){

String name = null, message = null;
//page.drawString("XXXXXXXXXXXXXXX", 20, 20);
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection con = DriverManager.getConnection(
    "jdbc:mysql://localhost:3306/databasea?user=root&password=root");
Statement stmt = con.createStatement();
stmt.executeQuery("use databaseA");
ResultSet rs = stmt.executeQuery("Select * from tableB");
while ( rs.next())
  name = rs.getString(1);

if(name.charAt(0) == '?')  {  
    page.setColor(Color.GREEN);    
    page.fillOval(10, 10, 180, 50);    
    page.setColor(Color.WHITE);    
    page.drawString(message, 30, 40);
    message = name.substring(1) + " is in the table";

  }  else {    
    page.setColor(Color.RED);    
    page.fillOval(10, 10, 180, 50);    
    page.setColor(Color.BLACK);     
    page.drawString(message, 30, 40);
    message = name.substring(1) + " is not in the table";
  }  

  String s = "delete  from tableB where name = \'" + name + "\'";
  stmt.executeUpdate(s);
  rs.close();
  stmt.close();
  con.close();
    } catch (Exception e) {
System.out.println("Message: " + e);
//System.exit(0);
    }
  }
}

最佳答案

Paint 方法用于绘画,你不应该在其中执行任何其他操作,尤其是任何耗时的操作,paint 方法可以随时调用,原因有很多,其中大部分是你无法控制的。

您需要将加载信息的逻辑与加载信息的逻辑分开,而且,从本质上讲,您的结果可能会返回多个结果,您也需要考虑到这一点...

“不幸的是,这是一个类,我必须使用一个小程序” 是无关紧要的。您应该避免覆盖顶级容器(如 JApplet)的 paint,因为它们往往包含构成基本显示的其他组件,它们也不是双缓冲的。

您需要将视觉元素分离到单独的组件中,这样当您进行绘画时,它们不会覆盖/覆盖屏幕上的其他组件

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;

public class ExampleApplet extends JApplet {

    private ExamplePanel examplePane;

    @Override
    public void init() {
        examplePane = new ExamplePanel();
        setLayout(new BorderLayout());
        add(examplePane);

        JButton check = new JButton("Check");
        add(check, BorderLayout.SOUTH);
        check.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                load();
            }
        });
    }

    public void load() {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            try (Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/databasea?user=root&password=root")) {
                try (PreparedStatement stmt = con.prepareStatement("Select * from tableB")) {
                    try (ResultSet rs = stmt.executeQuery()) {
                        while (rs.next()) {
                            String name = rs.getString(1);
                            examplePane.addName(name);
                            try (PreparedStatement delete = con.prepareStatement("delete from tableB where name = ?")) {
                                delete.setString(1, name);
                            } catch (SQLException exp) {
                                exp.printStackTrace();
                            }
                        }
                    } catch (SQLException exp) {
                        exp.printStackTrace();
                    }

                } catch (SQLException exp) {
                    exp.printStackTrace();
                }
            } catch (SQLException exp) {
                exp.printStackTrace();
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException exp) {
            exp.printStackTrace();
        }
    }

    public class ExamplePanel extends JPanel {

        private List<String> names;

        public ExamplePanel() {
            names = new ArrayList<>(25);
        }

        public void addName(String name) {
            names.add(name);
            repaint();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            FontMetrics fm = g.getFontMetrics();
            int x = 0;
            int y = 0;
            for (String name : names) {

                String message = null;
                if (name.charAt(0) == '?') {
                    g.setColor(Color.GREEN);
                    g.fillOval(x, y, fm.getHeight(), fm.getHeight());
                    g.setColor(Color.WHITE);
                    message = name.substring(1) + " is in the table";
                } else {
                    g.setColor(Color.RED);
                    g.fillOval(x, y, fm.getHeight(), fm.getHeight());
                    g.setColor(Color.BLACK);
                    message = name.substring(1) + " is not in the table";
                }
                g.drawString(message, fm.getHeight(), y);
                y += fm.getHeight();
            }
        }

    }

}

现在,说了这么多。使用 JList 并简单地将新名称添加到 ListModel 并依赖 ListCellRenderer 会更容易和更合理呈现结果。然后可以将 JList 添加到 JScrollPane,因此如果显示的信息量很大,它会自动变为可滚动...

看看How to use JLists了解更多详情

关于Java Applet 显示数据库中的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23284095/

相关文章:

javascript - 分层 Canvas 元素

html - CSS flex 图像并添加阴影

javascript - 如何在单个html文件中添加多个页面

mysql - Rails 中对数据库的灵活请求

mysql - DQL 查询失败

java - 为什么我的 Android ListAdapter 只显示一项?

java - 我应该使这个方法静态吗?

数据库系统的JAVA桌面应用程序

PHP 和 Smarty 错误 : Trying to get property of non-object

java - Spring MVC 注释。 + Jetty 9 + 查看解析器 - 找不到 jsp 页面