Skip to content

Instantly share code, notes, and snippets.

@uvlad7
Last active February 25, 2019 16:17
Show Gist options
  • Save uvlad7/e34b8597f3f45ca869fc0b6e5197b860 to your computer and use it in GitHub Desktop.
Save uvlad7/e34b8597f3f45ca869fc0b6e5197b860 to your computer and use it in GitHub Desktop.
УП 2.2Еште
public class Main {
public static void main(String[] args) {
View view = new View();
}
}
Australia|Go home|300|true
Belarus|Go home|300|true
Belgium|Go home|300|true
Brazil|Go home|300|false
Canada|Go home|300|false
Egypt|Go home|300|false
Russia|Go home|300|false
United Kingdom|Go home|300|false
United States|Go home|300|true
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Vector;
public class View extends JFrame implements ActionListener, TableModelListener {
private JTable table;
private DefaultTableModel model;
private Map<String, Icon> flags;
private JButton add;
private JButton delete;
private JButton saveAll;
public View() {
super("Tours");
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
flags = new HashMap<>();
model = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
return ((row != this.getRowCount() - 1) || (column == 3));
}
@Override
public Class getColumnClass(int column) {
switch (column) {
case 0:
return Icon.class;
case 2:
return Integer.class;
case 3:
return Boolean.class;
default:
return String.class;
}
}
};
model.addColumn("Country");
model.addColumn("About");
model.addColumn("Price");
model.addColumn("Select");
try (Scanner scanner = new Scanner(new File("src\\tours.txt"))) {
scanner.useDelimiter("[|]|[\r\n]+");
String country, about;
int price;
boolean selection;
while (scanner.hasNext()) {
country = scanner.next();
about = scanner.next();
price = scanner.nextInt();
selection = scanner.nextBoolean();
model.addRow(new Object[]{country, about, price, selection});
if (!flags.containsKey(country)) {
flags.put(country, new ImageIcon("src\\" + country + ".png"));
}
}
}
flags.put("Total", new ImageIcon("src\\Total.png"));
Integer sum = 0;
int n = model.getRowCount();
for (int i = 0; i < n; i++) {
if ((Boolean) model.getValueAt(i, 3)) {
sum += (Integer) model.getValueAt(i, 2);
}
}
model.addRow(new Object[]{"Total", null, sum, false});
flags.put("Country", new ImageIcon("src\\Country.png"));
model.addTableModelListener(this);
table = new JTable(model);
table.setDefaultRenderer(Icon.class, new IconTableRenderer(flags));
table.setDefaultRenderer(String.class, new StringTableRenderer());
table.setDefaultRenderer(Integer.class, new IntegerTableRenderer());
table.getTableHeader().setDefaultRenderer(new HeaderRenderer());
table.setRowHeight(64);
table.getColumnModel().getColumn(0).setMinWidth(128);
table.getColumnModel().getColumn(0).setMaxWidth(128);
table.getColumnModel().getColumn(2).setMaxWidth(256);
table.getColumnModel().getColumn(3).setMaxWidth(64);
JTextField textField = new JTextField();
textField.setFont(new Font("Verdana", Font.PLAIN, 14));
textField.setHorizontalAlignment(SwingConstants.LEFT);
DefaultCellEditor defaultCellEditor = new DefaultCellEditor(textField);
textField = new JTextField();
textField.setFont(new Font("Verdana", Font.PLAIN, 14));
textField.setHorizontalAlignment(SwingConstants.RIGHT);
IntegerCellEditor integerCellEditor = new IntegerCellEditor(textField);
table.setDefaultEditor(String.class, defaultCellEditor);
table.setDefaultEditor(Icon.class, defaultCellEditor);
table.setDefaultEditor(Integer.class, integerCellEditor);
//((DefaultCellEditor) table.getCellEditor(0, 2)).getComponent().setFont(new Font("Verdana", Font.PLAIN, 14));
setLayout(new BoxLayout(this.getContentPane(), BoxLayout.PAGE_AXIS));
add(new JScrollPane(table));
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
add = new JButton();
add.setIcon(new ImageIcon("src\\add-row.png"));
panel.add(Box.createVerticalGlue());
add.addActionListener(this);
panel.add(add);
delete = new JButton();
delete.setIcon(new ImageIcon("src\\delete-row.png"));
panel.add(Box.createVerticalGlue());
delete.addActionListener(this);
panel.add(delete);
saveAll = new JButton();
saveAll.setIcon(new ImageIcon("src\\save-all.png"));
panel.add(Box.createVerticalGlue());
saveAll.addActionListener(this);
panel.add(saveAll);
panel.setAlignmentX(Component.LEFT_ALIGNMENT);
add(Box.createHorizontalGlue());
add(panel);
pack();
setSize(900, 600);
setLocationRelativeTo(null);
setVisible(true);
} catch (FileNotFoundException | ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
System.err.println(e.getMessage());
}
}
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == add) {
model.insertRow(model.getRowCount() - 1, new Object[]{"Country", "About", 0, false});
} else if (source == delete) {
int[] positions = table.getSelectedRows();
for (int i = positions.length - 1; i>=0; i--) {
int n = model.getRowCount() - 1;
Integer sum;
if ((positions[i] != n) && (positions[i] != -1)) {
if ((Boolean) model.getValueAt(positions[i], 3)) {
sum = (Integer) model.getValueAt(n, 2);
sum -= (Integer) model.getValueAt(positions[i], 2);
model.setValueAt(sum, n, 2);
}
model.removeRow(positions[i]);
}
}
} else if (source == saveAll) {
try (PrintStream printStream = new PrintStream("src\\tours.txt")) {
StringBuilder stringBuilder = new StringBuilder();
int n = model.getRowCount() - 1;
for (int i = 0; i < n; i++) {
stringBuilder.append(model.getValueAt(i, 0)).append('|').append(model.getValueAt(i, 1)).
append('|').append(model.getValueAt(i, 2)).append('|').append(model.getValueAt(i, 3)).append("\r\n");
}
printStream.print(stringBuilder);
} catch (FileNotFoundException ex) {
System.err.println(ex.getMessage());
}
}
}
@Override
public void tableChanged(TableModelEvent e) {
if (e.getColumn() == 3) {
int n = model.getRowCount() - 1;
Integer sum;
if (e.getLastRow() == n) {
Boolean selection = (Boolean) model.getValueAt(n, 3);
Vector<Vector> mas = model.getDataVector();
for (int i = 0; i < n; i++) {
mas.get(i).set(3, selection);
}
sum = 0;
if (selection) {
for (int i = 0; i < n; i++) {
sum += (Integer) model.getValueAt(i, 2);
}
}
model.setValueAt(sum, n, 2);
SwingUtilities.invokeLater(() ->
table.updateUI()
);
} else if ((Boolean) model.getValueAt(e.getLastRow(), 3)) {
sum = (Integer) model.getValueAt(n, 2);
sum += (Integer) model.getValueAt(e.getLastRow(), 2);
model.setValueAt(sum, n, 2);
} else {
sum = (Integer) model.getValueAt(n, 2);
sum -= (Integer) model.getValueAt(e.getLastRow(), 2);
model.setValueAt(sum, n, 2);
}
} else if ((e.getColumn() == 2) && (e.getLastRow() != model.getRowCount() - 1) && ((Boolean) model.getValueAt(e.getLastRow(), 3))) {
int n = model.getRowCount() - 1;
Integer sum = 0;
for (int i = 0; i < n; i++) {
if ((Boolean) model.getValueAt(i, 3)) {
sum += (Integer) model.getValueAt(i, 2);
}
}
model.setValueAt(sum, n, 2);
}
}
}
class IconTableRenderer extends DefaultTableCellRenderer {
private Map<String, Icon> flags;
private Font font;
private JLabel label;
public IconTableRenderer(Map<String, Icon> flags) {
this.flags = flags;
font = new Font("Georgia", Font.ITALIC, 14);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if ((!isSelected) && flags.containsKey(value.toString())) {
label = (JLabel) super.getTableCellRendererComponent(table, null, false, hasFocus, row, column);
label.setIcon(flags.get(value.toString()));
} else {
label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
label.setIcon(null);
label.setFont(font);
}
label.setHorizontalAlignment(SwingConstants.LEFT);
return label;
}
}
class StringTableRenderer extends DefaultTableCellRenderer {
private Font font;
private JLabel label;
public StringTableRenderer() {
font = new Font("Georgia", Font.ITALIC, 14);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
label.setFont(font);
label.setHorizontalAlignment(SwingConstants.LEFT);
return label;
}
}
class IntegerTableRenderer extends DefaultTableCellRenderer {
private Font font;
private JLabel label;
public IntegerTableRenderer() {
font = new Font("Georgia", Font.ITALIC, 14);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
label.setFont(font);
label.setHorizontalAlignment(SwingConstants.RIGHT);
return label;
}
}
class IntegerCellEditor extends DefaultCellEditor {
Object value;
public IntegerCellEditor(JTextField textField) {
super(textField);
}
public boolean stopCellEditing() {
String s = (String) super.getCellEditorValue();
try {
value = Integer.parseInt(s);
} catch (NumberFormatException e) {
((JComponent) getComponent()).setBorder(new LineBorder(Color.red));
return false;
}
return super.stopCellEditing();
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected,
int row, int column) {
this.value = null;
((JComponent) getComponent()).setBorder(new LineBorder(Color.black));
return super.getTableCellEditorComponent(table, value, isSelected, row, column);
}
public Object getCellEditorValue() {
return value;
}
}
class HeaderRenderer extends DefaultTableCellRenderer {
private Font font;
public HeaderRenderer() {
font = new Font("Georgia", Font.BOLD, 16);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
label.setFont(font);
label.setHorizontalAlignment(SwingConstants.CENTER);
return label;
}
}
https://img.icons8.com/color/48/000000/add-row.png
https://img.icons8.com/color/48/000000/delete-row.png
https://img.icons8.com/color/48/000000/save-all.png
https://img.icons8.com/color/64/000000/sigma.png
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment