主頁 > 移動端開發 > 無法動態重繪JTable

無法動態重繪JTable

2022-06-27 21:53:54 移動端開發

首先,我是 Java 新手。我用 4 個面板(MainProgram)制作了一個 Gui

圖片

centerPanel是 JTable,顯示來自資料庫的資料。topPanel中,我放置了打開新類/視窗的按鈕 - (添加客戶)和一些輸入欄位。單擊保存按鈕后,資料將保存到資料庫中,并且dispose(). 資料正確保存到資料庫中。問題是保存后如何重繪 MainProgram中的表?提前致謝。

有一些代碼:

主程式.java

    public class MainProgram extends JFrame {
    Connection connection = MysqlConnect.dbConnector();

    private static final long serialVersionUID = 1L;

    public JPanel contentPane;
    public String selectedRowIndex;

    
    Object[][] data;
    String columns[];

    public JPanel centerPanel;

    public JScrollPane  pane;

    private JTable table;

    

    public MainProgram() throws IOException {

        setTitle("Main Program");
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        setBounds(100, 100, 1086, 501);
        setLocationRelativeTo(null);

        // setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout(0, 0));
        addWindowListener((WindowListener) new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent we) {
                String ObjButtons[] = { "Yes", "No" };
                int PromptResult = JOptionPane.showOptionDialog(null, "Are you sure you want to exit?", "SkladModule",
                        JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, ObjButtons, ObjButtons[1]);
                if (PromptResult == 0) {
                    System.exit(0);
                }
            }
        });

        // left panel
        JPanel leftPanel = new JPanel();
        contentPane.add(leftPanel, BorderLayout.WEST);

        // center panel
        centerPanel = new JPanel(new GridLayout());
        centerPanel.setBorder(new TitledBorder(
                new EtchedBorder(EtchedBorder.LOWERED, new Color(255, 255, 255), new Color(160, 160, 160)), "INFO",
                TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
        contentPane.add(centerPanel, BorderLayout.CENTER);

        try {
            int count = 0;
            String query = "SELECT * FROM vehicles";
            String queryRow = "select count(*) from vehicles";

            Statement stm = connection.createStatement();

            ResultSet rows = stm.executeQuery(queryRow);

            if (rows.next()) {
                count = rows.getInt(1);
                rows.close();
            }

            ResultSet res = stm.executeQuery(query);

            // client_id, plate, make, model, year, engine_cc, color, vehicle_owner,
            // vehicle_owner_contact, mechanic, in_garage, service_start, service_end,
            // service_cost, parts_cost, service_paid, notes
            columns = new String[] { "ID", "Plate", "Make", "Model", "Year", "Engine", "Color", "Owner", "Owner Tel.",
                    "In Garage", "Service Paid", "Notes" };
            data = new Object[count][12];
            int i = 0;
            while (res.next()) {
                int id = res.getInt("client_id");

                data[i][0] = id   "";
                data[i][1] = res.getString("plate");
                data[i][2] = res.getString("make");
                data[i][3] = res.getString("model");
                data[i][4] = res.getString("year");
                data[i][5] = res.getString("engine_cc");
                data[i][6] = res.getString("color");
                data[i][7] = res.getString("vehicle_owner");
                data[i][8] = res.getString("vehicle_owner_contact");
                data[i][9] = res.getString("in_garage");
                data[i][10] = res.getString("service_paid");
                data[i][11] = res.getString("notes");

                i  ;
            }
            table = new JTable();
            TableModel model = new DefaultTableModel(data, columns);

            table.setModel(model);

            // JTable table = new JTable(data, columns);

            table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            final TableColumnModel columnModel = table.getColumnModel();
            for (int column = 0; column < table.getColumnCount(); column  ) {
                int width = 15; // Min width
                for (int row = 0; row < table.getRowCount(); row  ) {
                    TableCellRenderer renderer = table.getCellRenderer(row, column);
                    Component comp = table.prepareRenderer(renderer, row, column);
                    width = Math.max(comp.getPreferredSize().width   10, width);
                }
                width = Math.max(width, table.getColumnModel().getColumn(column).getPreferredWidth());
                if (width > 300)

                    width = 300;
                columnModel.getColumn(column).setPreferredWidth(width);
            }

            table.setFocusable(false);
            table.setRowSelectionAllowed(true);

            table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            table.setDefaultEditor(Object.class, null);
            table.setShowGrid(true);
            table.setShowVerticalLines(true);
            pane = new JScrollPane(table);
            centerPanel.add(pane);

            table.addMouseListener(new MouseListener() {
                public void mouseReleased(MouseEvent e) {
                }

                public void mousePressed(MouseEvent e) {

                    selectedRowIndex = table.getModel().getValueAt(table.getSelectedRow(), 0).toString();

                }

                public void mouseExited(MouseEvent e) {
                }

                public void mouseEntered(MouseEvent e) {
                }

                public void mouseClicked(MouseEvent e) {
                }
            });

            JButton btnNewButton = new JButton("New button");
            btnNewButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {

                    if (selectedRowIndex != null) {

                        int rowID = Integer.parseInt(selectedRowIndex);

                        System.out.println(rowID);

                    } else {

                        JOptionPane.showMessageDialog(null, "Please select row!", "No selected vehicle",
                                JOptionPane.INFORMATION_MESSAGE);
                    }

                }
            });
            leftPanel.add(btnNewButton);

        } catch (SQLException e) {
            e.printStackTrace();
        }

        // bottom panel
        // create the status bar panel and shove it down the bottom of the frame
        JPanel statusPanel = new JPanel();
        statusPanel.setBorder((Border) new BevelBorder(BevelBorder.LOWERED));
        contentPane.add(statusPanel, BorderLayout.SOUTH);
        statusPanel.setPreferredSize(new Dimension(contentPane.getWidth(), 20));
        statusPanel.setLayout(new BoxLayout(statusPanel, BoxLayout.X_AXIS));
        JLabel statusLabel = new JLabel("");
        statusLabel.setHorizontalAlignment(SwingConstants.LEFT);
        statusPanel.add(statusLabel);
        contentPane.setVisible(true);

        // add username from login to statusbar
        String username = Login.uname;

        statusLabel.setText("Logged user: "   username);

        JPanel topPanel = new JPanel();
        contentPane.add(topPanel, BorderLayout.NORTH);

        BufferedImage buttonIcon = ImageIO
                .read(new File("C:\\Users\\User\\eclipse-workspace\\SkladModule\\images\\plus.png"));
        JButton btnAddCustumer = new JButton(new ImageIcon(buttonIcon));
        btnAddCustumer.setText("ADD");
        // btnAddCustumer.setBorder(null);
        btnAddCustumer.setContentAreaFilled(false);
        btnAddCustumer.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                AddCustumer addCustumer;
                try {
                    addCustumer = new AddCustumer();
                    addCustumer.setVisible(true);
                } catch (IOException e1) {

                    e1.printStackTrace();
                }

            }
        });

        topPanel.add(btnAddCustumer);

        JButton btnNewButton_1 = new JButton("New button");
        topPanel.add(btnNewButton_1);

    }

    public void refresh() {
        TableModel model =new DefaultTableModel(data, columns);
        model.insertRow(res.getRow() - 1, row);
        model.addRow(row);
    }
    
    

}

AddCustomer.java

public class AddCustumer extends JFrame {

    private static final long serialVersionUID = 1L;
    private JTextField plateField;
    private JTextField makeField;
    private JTextField modelField;
    private JTextField yearField;
    private JTextField engineField;
    private JTextField colorField;
    private JTextField ownerField;
    private JTextField ownerPhoneField;

    Connection connection = null;

    public AddCustumer() throws IOException {
        setResizable(false);
        setType(Type.POPUP);
        setTitle("ADD CUSTUMER");
        setBounds(100, 100, 700, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout(0, 0));
        addWindowListener((WindowListener) new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent we) {
                String ObjButtons[] = { "Yes", "No" };
                int PromptResult = JOptionPane.showOptionDialog(null, "Are you sure you want to exit?", "SkladModule",
                        JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, ObjButtons, ObjButtons[1]);
                if (PromptResult == 0) {
                    dispose();
                }
            }
        });
        JPanel leftPanel = new JPanel();
        leftPanel.setBorder(BorderFactory.createTitledBorder(" CAR INFO "));
        getContentPane().add(leftPanel, BorderLayout.WEST);
        leftPanel.setLayout(new MigLayout("", "[left][][grow,left]", "[][][][][][][][][]"));
        JLabel lblPlate = new JLabel("Plate: *");
        leftPanel.add(lblPlate, "cell 0 1,alignx trailing");

        plateField = new JTextField();
        leftPanel.add(plateField, "cell 2 1,growx");
        plateField.setColumns(10);

        JLabel lblMake = new JLabel("Make: *");
        leftPanel.add(lblMake, "cell 0 2,alignx trailing");

        makeField = new JTextField();
        leftPanel.add(makeField, "cell 2 2,growx");
        makeField.setColumns(10);

        JLabel lblModel = new JLabel("Model: *");
        leftPanel.add(lblModel, "cell 0 3,alignx trailing");

        modelField = new JTextField();
        leftPanel.add(modelField, "cell 2 3,growx");
        modelField.setColumns(10);

        JLabel lblYear = new JLabel("Year: *");
        leftPanel.add(lblYear, "cell 0 4,alignx trailing");

        yearField = new JTextField();
        leftPanel.add(yearField, "cell 2 4,growx");
        yearField.setColumns(10);

        JLabel lblEngCC = new JLabel("Engine size (cc): *");
        leftPanel.add(lblEngCC, "cell 0 5,alignx trailing");

        engineField = new JTextField();
        leftPanel.add(engineField, "cell 2 5,growx");
        engineField.setColumns(10);

        JLabel lblColor = new JLabel("Color: *");
        leftPanel.add(lblColor, "cell 0 6,alignx trailing");

        colorField = new JTextField();
        leftPanel.add(colorField, "cell 2 6,growx");
        colorField.setColumns(10);

        JLabel lblNewLabel = new JLabel("*  Required fields");
        leftPanel.add(lblNewLabel, "cell 2 8");

        JPanel rightPanel = new JPanel();
        rightPanel.setBorder(BorderFactory.createTitledBorder(" CLIENT INFO "));
        getContentPane().add(rightPanel, BorderLayout.CENTER);
        rightPanel.setLayout(new MigLayout("", "[100px:n,trailing][250px:300px:500,trailing]", "[][][][][grow]"));

        JLabel lblOwnerName = new JLabel("Car owner names: *");
        rightPanel.add(lblOwnerName, "cell 0 1,alignx trailing");

        ownerField = new JTextField();
        rightPanel.add(ownerField, "cell 1 1,growx");
        ownerField.setColumns(10);

        JLabel lblOwnerPhone = new JLabel("Car owner telephone: *");
        rightPanel.add(lblOwnerPhone, "cell 0 2,alignx trailing");

        ownerPhoneField = new JTextField();
        rightPanel.add(ownerPhoneField, "cell 1 2,growx");
        ownerPhoneField.setColumns(10);

        JLabel lblNotes = new JLabel("Notes: ");
        rightPanel.add(lblNotes, "cell 0 3,alignx trailing,aligny top");

        JTextArea notesField = new JTextArea(16, 58);
        notesField.setWrapStyleWord(true);
        notesField.setLineWrap(true);
        notesField.setBorder(BorderFactory.createLineBorder(Color.lightGray));
        JScrollPane scrollNotes = new JScrollPane(notesField);
        scrollNotes.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        rightPanel.add(scrollNotes, "cell 1 3,grow");

        JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        getContentPane().add(bottomPanel, BorderLayout.SOUTH);

        BufferedImage saveButtonIcon = ImageIO
                .read(new File("C:\\Users\\User\\eclipse-workspace\\SkladModule\\images\\accept.png"));
        JButton save_btn = new JButton(new ImageIcon(saveButtonIcon));
        save_btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                /*
                 * if (plateField.getText().isBlank() || makeField.getText().isBlank() ||
                 * modelField.getText().isBlank() || yearField.getText().isBlank() ||
                 * engineField.getText().isBlank() || colorField.getText().isBlank() ||
                 * ownerField.getText().isBlank() || ownerPhoneField.getText().isBlank()) {
                 * 
                 * JOptionPane.showMessageDialog(null, "* required fields incomplete. Please
                 * review and resubmit", "Incomplete data", JOptionPane.WARNING_MESSAGE);
                 * 
                 * } else {
                 */

                connection = MysqlConnect.dbConnector();

                try {

                    String query = "INSERT INTO vehicles (plate, make, model, year, engine_cc, color, vehicle_owner, vehicle_owner_contact, notes) VALUES ('"
                              plateField.getText()   "','"   makeField.getText()   "','"   modelField.getText()   "','"
                              yearField.getText()   "','"   engineField.getText()   "','"   colorField.getText()   "','"
                              ownerField.getText()   "','"   ownerPhoneField.getText()   "','"   notesField.getText()
                              "')";

                    PreparedStatement pst = connection.prepareStatement(query);
                    pst.executeUpdate(query);
                    MainProgram main = new MainProgram();
                    main.refresh();
                    JOptionPane.showMessageDialog(null, "Data was saved", "SUCCESS", JOptionPane.INFORMATION_MESSAGE);
                    dispose();
                    

                } catch (Exception e1) {
                    JOptionPane.showMessageDialog(null, "SQLException: "   e1.getMessage(), "ERROR",
                            JOptionPane.ERROR_MESSAGE);

                }

                /* } */

            }
        });
        save_btn.setText("SAVE");
        save_btn.setBorder(null);
        save_btn.setContentAreaFilled(true);
        save_btn.setToolTipText("SAVE");
        bottomPanel.add(save_btn);

        Component horizontalStrut = Box.createHorizontalStrut(25);
        bottomPanel.add(horizontalStrut);

        BufferedImage cancelButtonIcon = ImageIO
                .read(new File("C:\\Users\\User\\eclipse-workspace\\SkladModule\\images\\remove.png"));
        JButton cancel_btn = new JButton(new ImageIcon(cancelButtonIcon));
        cancel_btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
        cancel_btn.setText("CANCEL");
        cancel_btn.setBorder(null);
        cancel_btn.setContentAreaFilled(false);
        cancel_btn.setToolTipText("CANCEL");
        cancel_btn.setHorizontalAlignment(SwingConstants.RIGHT);
        bottomPanel.add(cancel_btn);

        Component horizontalStrut_1 = Box.createHorizontalStrut(20);
        bottomPanel.add(horizontalStrut_1);

    }

}

uj5u.com熱心網友回復:

有很多方法可以實作這一點,但它們基本上都歸結為同一個東西,一個模態對話框。有關更多詳細資訊,請參閱如何制作對話框

JFrame您應該避免從(and JDialog)等頂級容器擴展。您沒有向該類添加任何新功能,而是將自己鎖定在一個用例中。

以下示例旨在展示如何使用模式對話框詢問用戶輸入。通過同樣的“黑魔法”,當你顯示一個模態對話框時,代碼執行將在對話框可見時停止,并在它關閉時恢復(不要問,我不在乎,它只是作業)。

這意味著您可以呈現一個對話框,然后等到它關閉,然后繼續做出您需要的任何決定。

你可以...

Make use JOptionPane,這是用于制作對話框的簡潔易用的 API。

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.AbstractTableModel;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new MainPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class Person {
        private long id;
        private String firstName;
        private String lastName;

        public Person(long id, String firstName, String lastName) {
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public long getId() {
            return id;
        }

        public String getFirstName() {
            return firstName;
        }

        public String getLastName() {
            return lastName;
        }

        @Override
        public int hashCode() {
            int hash = 7;
            hash = 37 * hash   (int) (this.id ^ (this.id >>> 32));
            return hash;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final Person other = (Person) obj;
            if (this.id != other.id) {
                return false;
            }
            return true;
        }

    }

    public class PersonPane extends JPanel {
        private Person person;

        private JTextField firstName;
        private JTextField lastName;

        public PersonPane(Person person) {
            this();
            this.person = person;

            if (person == null) {
                return;
            }
            firstName.setText(person.getFirstName());
            lastName.setText(person.getLastName());
        }

        public PersonPane() {
            firstName = new JTextField(10);
            lastName = new JTextField(10);

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.LINE_END;
            gbc.insets = new Insets(4, 4, 4, 4);

            add(new JLabel("First name: "), gbc);
            gbc.gridy  ;
            add(new JLabel("Last name: "), gbc);

            gbc.gridx  ;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.LINE_START;

            add(firstName, gbc);
            gbc.gridy  ;
            add(lastName, gbc);
        }

        public Person save() {
            if (person == null) {
                return new Person(System.currentTimeMillis(), firstName.getText(), lastName.getText());
            }
            long id = person.getId();
            return new Person(id, firstName.getText(), lastName.getText());
        }
    }

    public class PersonTableModel extends AbstractTableModel {

        private List<Person> people = new ArrayList<>();
        private List<String> columNames = new ArrayList<>(Arrays.asList(new String[]{"First name", "Last name"}));

        public PersonTableModel() {
        }

        @Override
        public int getRowCount() {
            return people.size();
        }

        @Override
        public int getColumnCount() {
            return columNames.size();
        }

        @Override
        public String getColumnName(int column) {
            return columNames.get(column);
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return String.class;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Person person = people.get(rowIndex);
            switch (columnIndex) {
                case 0:
                    return person.getFirstName();
                case 1:
                    return person.getLastName();
            }
            return null;
        }

        public void addOrUpdate(Person person) {
            int index = people.indexOf(person);
            if (index >= 0) {
                people.set(index, person);
                fireTableRowsUpdated(index, index);
            } else {
                int lastIndex = people.size();
                people.add(person);
                fireTableRowsInserted(lastIndex, lastIndex);
            }
        }

        public Person getPersonAtRow(int row) {
            return people.get(row);
        }

    }

    public class MainPane extends JPanel {

        private PersonTableModel model = new PersonTableModel();

        public MainPane() {
            setLayout(new BorderLayout());

            JButton newPersonButton = new JButton("New");
            newPersonButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    PersonPane personPane = new PersonPane();
                    int option = JOptionPane.showConfirmDialog(MainPane.this, personPane, "New Person", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
                    if (option == JOptionPane.OK_OPTION) {
                        Person person = personPane.save();
                        if (person != null) {
                            model.addOrUpdate(person);
                        }
                    }
                }
            });

            JToolBar toolBar = new JToolBar();
            toolBar.add(newPersonButton);

            JTable table = new JTable(model);
            table.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (e.getClickCount() == 2) {
                        int rowIndex = table.convertRowIndexToModel(table.getSelectedRow());
                        Person person = model.getPersonAtRow(rowIndex);
                        PersonPane personPane = new PersonPane(person);
                        int option = JOptionPane.showConfirmDialog(MainPane.this, personPane, "Edit Person", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
                        if (option == JOptionPane.OK_OPTION) {
                            person = personPane.save();
                            if (person != null) {
                                model.addOrUpdate(person);
                            }
                        }
                    }
                }
            });

            add(toolBar, BorderLayout.NORTH);
            add(new JScrollPane(table));
        }
    }
}

你可以...

如果您需要更靈活的東西或想要更詳細的驗證,您可以滾動自己的對話框(和驗證作業流程),但您應該查看JOptionPane.dialog 上的 Disable ok 按鈕,直到用戶給出 input,這演示了一種方法您可以控制enabled按鈕的狀態并仍然使用JOptionPane.

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.AbstractTableModel;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new MainPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class Person {
        private long id;
        private String firstName;
        private String lastName;

        public Person(long id, String firstName, String lastName) {
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public long getId() {
            return id;
        }

        public String getFirstName() {
            return firstName;
        }

        public String getLastName() {
            return lastName;
        }

        @Override
        public int hashCode() {
            int hash = 7;
            hash = 37 * hash   (int) (this.id ^ (this.id >>> 32));
            return hash;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final Person other = (Person) obj;
            if (this.id != other.id) {
                return false;
            }
            return true;
        }

    }

    public static class PersonPane extends JPanel {
        public interface ValidationObserver {
            public void validStateDidChange(PersonPane source, boolean isValid);
        }

        private Person person;

        private JTextField firstName;
        private JTextField lastName;

        private List<ValidationObserver> validationObservers = new ArrayList<>(8);

        public PersonPane(Person person) {
            this();
            this.person = person;

            if (person == null) {
                return;
            }
            firstName.setText(person.getFirstName());
            lastName.setText(person.getLastName());
        }

        public PersonPane() {
            firstName = new JTextField(10);
            lastName = new JTextField(10);

            DocumentListener documentListener = new DocumentListener() {
                @Override
                public void insertUpdate(DocumentEvent e) {
                    validateForm();
                }

                @Override
                public void removeUpdate(DocumentEvent e) {
                    validateForm();
                }

                @Override
                public void changedUpdate(DocumentEvent e) {
                    validateForm();
                }
            };

            firstName.getDocument().addDocumentListener(documentListener);
            lastName.getDocument().addDocumentListener(documentListener);

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.LINE_END;
            gbc.insets = new Insets(4, 4, 4, 4);

            add(new JLabel("First name: "), gbc);
            gbc.gridy  ;
            add(new JLabel("Last name: "), gbc);

            gbc.gridx  ;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.LINE_START;

            add(firstName, gbc);
            gbc.gridy  ;
            add(lastName, gbc);
        }

        public void addValidationObserver(ValidationObserver observer) {
            validationObservers.add(observer);
        }

        public void removeValidationObserver(ValidationObserver observer) {
            validationObservers.remove(observer);
        }

        protected void fireValidateStateDidChange(boolean isValid) {
            for (ValidationObserver observer : validationObservers) {
                observer.validStateDidChange(this, isValid);
            }
        }

        protected void validateForm() {
            boolean isValid = !firstName.getText().isBlank() && !lastName.getText().isBlank();
            fireValidateStateDidChange(isValid);
        }

        public Person save() {
            if (person == null) {
                return new Person(System.currentTimeMillis(), firstName.getText(), lastName.getText());
            }
            long id = person.getId();
            return new Person(id, firstName.getText(), lastName.getText());
        }

        public static Person createPerson(Component parent) {
            return editPerson(parent, null);
        }

        public static Person editPerson(Component parent, Person person) {
            enum State {
                OKAY, CANCEL
            }

            JPanel actionPane = new JPanel(new GridBagLayout());
            JButton okayButton = new JButton("Okay");
            okayButton.setEnabled(false);
            JButton cancelButton = new JButton("Cancel");

            actionPane.add(okayButton);
            actionPane.add(cancelButton);

            PersonPane personPane = new PersonPane(person);
            personPane.addValidationObserver(new ValidationObserver() {
                @Override
                public void validStateDidChange(PersonPane source, boolean isValid) {
                    okayButton.setEnabled(isValid);
                }
            });

            JDialog dialog = new JDialog(SwingUtilities.windowForComponent(parent));
            dialog.setModal(true);
            dialog.add(personPane);
            dialog.add(actionPane, BorderLayout.SOUTH);

            okayButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    personPane.putClientProperty("state", State.OKAY);
                    dialog.dispose();
                }
            });
            cancelButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    personPane.putClientProperty("state", State.CANCEL);
                    dialog.dispose();
                }
            });

            dialog.pack();
            dialog.setLocationRelativeTo(parent);
            dialog.setVisible(true);

            Object stateValue = personPane.getClientProperty("state");
            if (stateValue instanceof State) {
                State state = (State) stateValue;
                if (state == State.OKAY) {
                    return personPane.save();
                }
            }

            return null;
        }
    }

    public class PersonTableModel extends AbstractTableModel {

        private List<Person> people = new ArrayList<>();
        private List<String> columNames = new ArrayList<>(Arrays.asList(new String[]{"First name", "Last name"}));

        public PersonTableModel() {
        }

        @Override
        public int getRowCount() {
            return people.size();
        }

        @Override
        public int getColumnCount() {
            return columNames.size();
        }

        @Override
        public String getColumnName(int column) {
            return columNames.get(column);
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return String.class;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Person person = people.get(rowIndex);
            switch (columnIndex) {
                case 0:
                    return person.getFirstName();
                case 1:
                    return person.getLastName();
            }
            return null;
        }

        public void addOrUpdate(Person person) {
            int index = people.indexOf(person);
            if (index >= 0) {
                people.set(index, person);
                fireTableRowsUpdated(index, index);
            } else {
                int lastIndex = people.size();
                people.add(person);
                fireTableRowsInserted(lastIndex, lastIndex);
            }
        }

        public Person getPersonAtRow(int row) {
            return people.get(row);
        }

    }

    public class MainPane extends JPanel {

        private PersonTableModel model = new PersonTableModel();

        public MainPane() {
            setLayout(new BorderLayout());

            JButton newPersonButton = new JButton("New");
            newPersonButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Person person = PersonPane.createPerson(MainPane.this);
                    if (person != null) {
                        model.addOrUpdate(person);
                    }
                }
            });

            JToolBar toolBar = new JToolBar();
            toolBar.add(newPersonButton);

            JTable table = new JTable(model);
            table.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (e.getClickCount() == 2) {
                        int rowIndex = table.convertRowIndexToModel(table.getSelectedRow());
                        Person person = model.getPersonAtRow(rowIndex);
                        person = PersonPane.editPerson(MainPane.this, person);
                        if (person != null) {
                            model.addOrUpdate(person);
                        }
                    }
                }
            });

            add(toolBar, BorderLayout.NORTH);
            add(new JScrollPane(table));
        }
    }
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/495667.html

標籤:爪哇 摇摆 用户界面 刷新

上一篇:Getter和setter不適用于JButton

下一篇:直方圖顯示不正確

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more