Программирование на Java часть 2
.pdfimport java.awt.event.ActionEvent; import java.awt.event.ActionListener;
import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; import java.sql.ResultSet;
import java.sql.SQLException; import javax.swing.*;
public class RegistrationFrame extends JFrame {
private JPanel panel;
private JLabel labelLogin, labelPass; private JTextField tfLogin, tfPass; private JButton enter, registration; private DB db;
public RegistrationFrame(DB db) { this.db = db;
setSize(250, 230); setTitle("RegistrationFrame"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); initComponents();
action();
setResizable(false);
setVisible(true);
}
private void initComponents() { panel = new JPanel();
labelLogin = new JLabel("Login"); labelPass = new JLabel("Password"); tfLogin = new JTextField(20); tfPass = new JTextField(20);
registration = new JButton("Registration"); panel.add(labelLogin); panel.add(tfLogin);
panel.add(labelPass);
panel.add(tfPass);
panel.add(registration);
add(panel);
}
private void action() {
141
registration.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) { if (tfLogin.getText().equals("")
|| tfPass.getText().equals("")) { JOptionPane.showMessageDialog(panel,
"Incorrect login or password", "Error", JOptionPane.ERROR_MESSAGE);
}else { try {
ResultSet rs = db.query("select * from users "
+"where login='" + tfLogin.getText() + "'"); if (rs.next()) {
JOptionPane.showMessageDialog(panel, "This username is not available", "Error", JOptionPane.ERROR_MESSAGE);
} else {
DaoUsers daoUser = new DaoUsers(db); try {
daoUser.insert(new Users(tfLogin.getText(), tfPass.getText(), 1, 0, 0, 0));
JOptionPane.showMessageDialog(panel, "Registration successful!", "Message", JOptionPane.INFORMATION_MESSAGE);
new LoginFrame(db); dispose();
}catch (NoSuchAlgorithmException ex) {
}catch (UnsupportedEncodingException ex) {
}
} catch (SQLException ex) { JOptionPane.showMessageDialog(panel, "Error accessing"
+ " database \n" + ex, "Error", JOptionPane.ERROR_MESSAGE);
}
}
}
});
}
}
После регистрации можно войти в систему, как пользователь(UserFrame)
142
В UserFrame выводятся все товары из базы данных, которые хранятся в таблице Goods. Для каждого товара создан отдельный класс ShopItem. С помощью ShopItem все товары выводятся на UserFrame.
Листинг 4.9
package by.belhard.user_interface;
import by.belhard.entity.Goods; import java.awt.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JCheckBox; import javax.swing.JLabel;
import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSpinner; import javax.swing.JTextArea;
import javax.swing.SpinnerNumberModel;
public class ShopItem extends JPanel {
private JCheckBox jCheckBox1; private JLabel jLabel1;
private JLabel jLabel2; private JLabel jLabel3;
private JScrollPane jScrollPane1; private JSpinner jSpinner1; private JTextArea jTextArea1; private Goods currentGood;
public ShopItem(Goods good, int y) { this.currentGood = good; initComponents();
setBounds(10, y, 570, 164); setBorder(BorderFactory.createLineBorder(Color.black)); action();
setVisible(true);
}
private void initComponents() {
143
jCheckBox1 = new JCheckBox();
SpinnerNumberModel model1 = new SpinnerNumberModel(1, 1, 10, 1); jSpinner1 = new JSpinner(model1);
ImageIcon image = new ImageIcon(System.getProperties().getProperty("user.dir").replaceAll("\\\\", "\\/") + "/images/"+this.currentGood.getImagePath());
jLabel1 = new JLabel();
jLabel1.setIcon(new ImageIcon(image.getImage(). getScaledInstance(120, 120,
image.getImage().SCALE_DEFAULT))); jLabel2 = new JLabel(); jLabel3 = new JLabel();
jScrollPane1 = new JScrollPane(); jTextArea1 = new JTextArea(); jSpinner1.setEnabled(false); jScrollPane1.setHorizontalScrollBarPolicy(
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); jScrollPane1.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
jLabel1.setMaximumSize(new Dimension(120, 120));
jLabel2.setText(this.currentGood.getName());
jLabel3.setText(String.valueOf(this.currentGood.getPrice()) + "$"); jTextArea1.setText(this.currentGood.getDescription());
jScrollPane1.setEnabled(false);
jTextArea1.setColumns(20);
jTextArea1.setEditable(false);
jTextArea1.setRows(5);
jScrollPane1.setViewportView(jTextArea1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(39, 39, 39)
.addComponent(jCheckBox1)
.addGap(27, 27, 27)
.addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE,
144
50, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(42, 42, 42)
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE,
120, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(29, 29, 29)
.addGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel2)
.addComponent(jLabel3)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 222, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE,
120, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(30, 30, 30))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addGap(22, 22, 22)
.addComponent(jLabel2)
.addGap(18, 18, 18)
.addComponent(jLabel3)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(0, 3, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jSpinner1,
145
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jCheckBox1))
.addGap(64, 64, 64))
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1)
.addContainerGap())))
);
}
public void action() { jCheckBox1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) { jSpinner1.setEnabled(jSpinner1.isEnabled() ? false : true);
}
});
}
public boolean isChoosen() {
if (jCheckBox1.isSelected()) { return true;
}
return false;
}
public int getAmount() {
return (Integer) jSpinner1.getValue();
}
public Goods getCurrentItem() { return this.currentGood;
}
}
package by.belhard.user_interface;
import by.belhard.dao.DaoGoods; import by.belhard.dao.DaoOrders; import by.belhard.dao.DaoUsers; import by.belhard.entity.Goods;
146
import by.belhard.entity.Orders; import by.belhard.entity.Users; import by.belhard.mysql.DB; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout;
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.sql.SQLException; import java.util.ArrayList;
import java.util.HashMap; import java.util.Map.Entry; import javax.swing.*;
public class UserFrame extends JFrame {
private DB db; private JPanel panel;
private JScrollBar scroll; private MyTable tableUser;
private JButton deleteUser, addUser; private KeyAdapter key;
private JPanel itemList; private JScrollPane scrollPane; private JButton logout;
private JPanel userInfo; private JButton order; private LoginFrame login;
private ArrayList<ShopItem> goodsList; private Users currentUser;
private JLabel balancelabel;
public UserFrame(DB db, Users user, LoginFrame login) { this.goodsList = new ArrayList<ShopItem>();
this.db = db; this.login = login;
this.currentUser = user; setSize(600, 600); setTitle("UserFrame"); setLayout(new BorderLayout()); setLocationRelativeTo(null);
setDefaultCloseOperation(DISPOSE_ON_CLOSE); this.userInfo = new JPanel();
this.userInfo.add(new JLabel("Hello, "));
147
this.balancelabel = new JLabel("" + user.getBalance() + "$ "); this.userInfo.add(new JLabel(user.getLogin() + "! ")); this.userInfo.add(new JLabel("Balance: ")); this.userInfo.add(balancelabel);
this.logout = new JButton("LogOut"); this.logout.setSize(100, 100); this.userInfo.add(this.logout); add(this.userInfo, BorderLayout.NORTH);
DaoGoods daoGoods = new DaoGoods(db); ArrayList<Goods> goods = null;
int position = 100; try {
goods = daoGoods.selectAll();
}catch (SQLException ex) { System.out.println(ex);
}
this.itemList = new JPanel(new GridLayout(goods.size(), 1)); this.itemList.setPreferredSize(new Dimension(500, goods.size() * 200)); for (Goods i : goods) {
ShopItem tmp = new ShopItem(i, position); this.itemList.add(tmp); this.goodsList.add(tmp);
}
this.scrollPane = new JScrollPane(this.itemList); this.scrollPane.getVerticalScrollBar().setUnitIncrement(10); add(this.scrollPane, BorderLayout.CENTER);
this.order = new JButton("Order"); this.order.setSize(100, 100); add(this.order, BorderLayout.SOUTH); setVisible(true); //прорисовка actions();
}
public void actions() { this.logout.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) { dispose();
login.setVisible(true);
}
});
this.order.addActionListener(new ActionListener() {
148
@Override
public void actionPerformed(ActionEvent e) {
HashMap<Goods, Integer> choosenGoods = new HashMap<Goods, Integer>();
int totalcost = 0;
for (ShopItem shopItem : goodsList) { if (shopItem.isChoosen()) {
choosenGoods.put(shopItem.getCurrentItem(),
shopItem.getAmount());
totalcost += shopItem.getCurrentItem().getPrice() * shopItem.getAmount();
}
}
if (currentUser.getBalance() >= totalcost) { int lastInsertID = 0;
try {
new DaoOrders(db).insert(new Orders(currentUser.getUsers_id(), "processing", 0, totalcost));
lastInsertID = new DaoOrders(db).getLastInsertId(); } catch (SQLException ex) {
}
StringBuilder sb = new StringBuilder("INSERT INTO goods_in_orders VALUES ");
for (Entry<Goods, Integer> entry : choosenGoods.entrySet()) { sb.append("('" + lastInsertID + "','" +
entry.getKey().getGoods_id() + "','" + entry.getValue() + "'),");
}
String result = sb.toString(); try {
db.update(result.substring(0, result.length() - 1)); balancelabel.setText("" + (currentUser.getBalance() - totalcost)
+ "$ ");
currentUser.setBalance(currentUser.getBalance() - totalcost); new DaoUsers(db).updateBalance(currentUser); JOptionPane.showMessageDialog(null, "Total Cost: " +
totalcost, "Success order", 1);
} catch (SQLException ex) {
}
} else {
JOptionPane.showMessageDialog(null, "Total Cost " + totalcost + " more than your balance", "Fail order", 1);
}
}
});
}
149
}
Администратор видит все таблицы и может редактировать данные и пользователя и информацию про товары. Может добавить нового пользователя или новый товар. Видит детализацию любого заказа и меняет статус заказа.
Т.к. в AdminFrame будет вывод различных таблиц, которые строятся одинаково с помощью класса MyTable по различным запросам, сделаем абстрактный класс TablePanel, в котором будет создание панели с таблицей. Класс MyTable создает объект класса JTable по переданному в конструктор объекту класса ResultSet.
Листинг 4.10
package by.belhard.user_interface;
import com.mysql.jdbc.ResultSetMetaData; import java.sql.ResultSet;
import java.sql.SQLException; import java.util.Vector; import java.util.logging.Level;
import java.util.logging.Logger; import javax.swing.JTable;
import javax.swing.table.DefaultTableModel; import by.belhard.mysql.DB;
public class MyTable extends JTable {
private DefaultTableModel model;
public DefaultTableModel getModel() { return model;
}
public MyTable(ResultSet rs) { model = new DefaultTableModel(); try {
ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData(); for (int i = 1; i <= rsmd.getColumnCount(); i++) {
model.addColumn(rsmd.getColumnName(i));
}
while (rs.next()) {
Vector v = new Vector();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
150