Avatar billede OBS Juniormester
Oprettet i går kl. 17:13 Der er 6 kommentarer

Summen af rækkens værdier

Jeg har her en tabel med en række.
Vil gerne  summere rækkens værdier og sumtallet vises nederst i rækken - men  hvordan ?
import javax.swing.*;
    import javax.swing.table.DefaultTableModel;
    import java.awt.*;

    public class TableExample {
        public static void main(String[] args) {
            // Oprette en JFrame
            JFrame frame = new JFrame("Tabel Eksempel");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(600, 400);

            // Oprette en DefaultTableModel
            DefaultTableModel model = new DefaultTableModel();
           
            // Tilføje kolonner til model
           
            model.addColumn("Salg");
           

            // Oprette en JTable med den model
            JTable table = new JTable(model);
           
            // Tilføje nogle rækker til tabellen
            model.addRow(new Object[]{ 30, });
            model.addRow(new Object[]{ 25, });
           
            // Oprette en JScrollPane og tilføje tabellen til den
            JScrollPane scrollPane = new JScrollPane(table);
            frame.add(scrollPane, BorderLayout.CENTER);

            // Oprette en knap til at tilføje en række
            JButton addButton = new JButton("Tilføj række");
            addButton.addActionListener(e -> {
                //
                model.addRow(new Object[]{"Ny salgsbeløb ", 0, });
            });
           
            frame.add(addButton, BorderLayout.SOUTH);

            // Gøre vinduet synligt
            frame.setVisible(true);
        }
    }
Avatar billede arne_v Ekspert
Skrevet i går kl. 17:18 #1
Rækker eller kolonner?
Avatar billede arne_v Ekspert
Skrevet i går kl. 17:20 #2
Hvis det er kolonner, så er min første tanke en table model hvor:

getRowCount returnerer N+1

isCellEditable returnerer true undtagen for row=N som er false

getValueAt returnerer sum for row=N
Avatar billede arne_v Ekspert
Skrevet i går kl. 18:49 #3
Demo:


import java.awt.BorderLayout;
import java.awt.Color;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.table.AbstractTableModel;

public class ModernTableUsage2 extends JFrame {
    @FunctionalInterface
    public static interface FooterGenerator {
        public String get(int columnIndex);
    }
    public static class BeanTableModelWithFooter<T> extends AbstractTableModel {
        private static final long serialVersionUID = 1L;
        private List<T> data;
        private FooterGenerator gen;
        private List<Method> getter = new ArrayList<Method>();
        private List<Method> setter = new ArrayList<Method>();
        public BeanTableModelWithFooter(Class<T> clz, List<T> data, FooterGenerator gen, String... flds) {
            this.data = data;
            this.gen = gen;
            for(String fld : flds) {
                try {
                    getter.add(clz.getDeclaredMethod("get" + fld));
                    setter.add(clz.getDeclaredMethod("set" + fld, String.class));
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (SecurityException e) {
                    e.printStackTrace();
                }
            }
        }
        @Override
        public int getRowCount() {
            return data.size() + 1;
        }
        @Override
        public int getColumnCount() {
            return getter.size();
        }
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            try {
                if(rowIndex < getRowCount() - 1) {
                    return getter.get(columnIndex).invoke(data.get(rowIndex));
                } else {
                    return gen.get(columnIndex);
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
                return null;
            } catch (InvocationTargetException e) {
                e.printStackTrace();
                return null;
            }
        }
        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            try {
                if(rowIndex < getRowCount() - 1) {
                    setter.get(columnIndex).invoke(data.get(rowIndex), aValue);
                    this.fireTableDataChanged();
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            if(rowIndex < getRowCount() - 1) {
                return true;
            } else {
                return false;
            }
        }
    }
    public static class Data {
        private String name;
        private BigDecimal amount;
        public Data() {
            this("", BigDecimal.ZERO);
        }
        public Data(String name, BigDecimal amount) {
            this.name = name;
            this.amount = amount;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public BigDecimal getAmount() {
            return amount;
        }
        public void setAmount(BigDecimal amount) {
            this.amount = amount;
        }
        public void setAmount(String amount) {
            this.amount = new BigDecimal(amount);
        }
        @Override
        public String toString() {
            return String.format("(%s,%s)",  name,amount);
        }
    }
    private static final long serialVersionUID = 1L;
    public ModernTableUsage2() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Moden table usage");
        setLayout(new BorderLayout());
        List<Data> data = new ArrayList<Data>(List.of(new Data("A", new BigDecimal("1.11")), new Data("BB", new BigDecimal("2.22")), new Data("CCC", new BigDecimal("3.33"))));
        BeanTableModelWithFooter<Data> model = new BeanTableModelWithFooter<Data>(Data.class,
                                                                                  data,
                                                                                  ix -> { if(ix == 1) return data.stream().map(Data::getAmount).reduce(BigDecimal::add).get().toString(); else return "Total"; },
                                                                                  "Name", "Amount");
        JTable table = new JTable(model);
        table.setShowGrid(true);
        table.setGridColor(Color.BLACK);
        table.setBorder(new LineBorder(Color.BLACK, 2));
        JPanel wrapper = new JPanel();
        wrapper.setBorder(new EmptyBorder(10, 10, 10, 10));
        wrapper.add(table);
        add(wrapper, BorderLayout.CENTER);
        JPanel buttons = new JPanel();
        buttons.setBorder(new EmptyBorder(10, 10, 10, 10));
        JButton test = new JButton("Test");
        test.addActionListener(e -> JOptionPane.showMessageDialog(null, data.stream().map(Data::toString).collect(Collectors.joining("\r\n"))));
        buttons.add(test);
        JButton add = new JButton("Add row");
        add.addActionListener(e -> { data.add(new Data()); model.fireTableDataChanged(); });
        buttons.add(add);
        add(buttons, BorderLayout.SOUTH);
        pack();
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new ModernTableUsage2();
                f.setVisible(true);
            }
        });
    }
}
Avatar billede OBS Juniormester
Skrevet i går kl. 21:29 #4
Jo  det fungerer - tak for det.
Jamen disse koder er for de viderekomne - jeg kan ikke følge med. Jeg må nok bruge masser af tid på disse. Håber at I kan  vejlede mere derom.
At lave een program ( hvad som helst ) er ligesom at køre en bil, hvor under motorhjelmen skal forstås helt præcis.
Se, nu har jeg en bitte tabelprogram  ( med indviklede koder ) næste trin er, at jeg vil kopiere tabelprogrammet til min  USB nøgle - men hvordan ??
Avatar billede arne_v Ekspert
Skrevet i går kl. 21:39 #5
Programmering er ikke helt nemt.

:-)

https://norvig.com/21-days.html
Avatar billede arne_v Ekspert
Skrevet i går kl. 21:43 #6
Hvis du skal have programmet på en USB stick, så skal du først finde ud af om alle brugere vil have Java installeret på deres PC eller ej.

ja => put en jar fil (eller mange class filer) i et dir på USB stick og lav evt en start BAT/EXE

nej => så skal du både have en dine jar/class filer og en Java installation og evt. start BAT/EXE på USB (ikke så svært da Java bare kan kopieres, men der er naturligvis forskel på Windows, Linux og macOS!)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester