Last active
February 25, 2019 16:17
-
-
Save uvlad7/e34b8597f3f45ca869fc0b6e5197b860 to your computer and use it in GitHub Desktop.
УП 2.2Еште
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Main { | |
public static void main(String[] args) { | |
View view = new View(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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