Как создать эффект прокрутки или наведения на строки в JTable? - PullRequest
0 голосов
/ 02 мая 2018

В моем приложении я хотел бы создать эффект ролловера со строками JTable. Например, когда мышь входит в строку, цвет фона этой строки изменится; и наоборот, цвет этой строки вернется к нормальному, когда мышь выйдет из этой строки. Я упомянул много статей.

Я получил один ответ, но класс расширяет JTable, и моя таблица находится в JInternalFrame, поэтому мой класс расширяет JInternalFrame.

Вот мой код

public class UpdateAdmin extends JInternalFrame {
public static JTable table;
private JScrollPane scrollPane;
public static String rowUserId;
private static String photoUrl;
 private int rollOverRowIndex = -1;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            try {
                UpdateAdmin frame = new UpdateAdmin();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
    public UpdateAdmin() {
        addInternalFrameListener(new InternalFrameAdapter() {
            @Override
            public void internalFrameOpened(InternalFrameEvent arg0) {
                updateTable();
            }
        });
        getContentPane().setBackground(new Color(144, 202, 249));
        setClosable(true);
        setResizable(true);
        setMaximizable(true);
        setIconifiable(true);
        setTitle("View Admin");
        setBounds(100, 100, 1200, 571);
        getContentPane().setLayout(null);

        JLabel lblviewUsers = new JLabel("<html><ul><li>View Users</li></ul></html>");
        lblviewUsers.setBounds(10, 25, 188, 23);
        lblviewUsers.setFont(new Font("Tahoma", Font.PLAIN, 18));
        getContentPane().add(lblviewUsers);




        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        this.setLocation(dim.width/2-this.getSize().width/2, dim.height/2-this.getSize().height/2);
    }

    protected void updateTable() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/librarymanagement", "root", "santosh123");
            PreparedStatement ps = con.prepareStatement("select uid, photo, username, firstName, lastName, email, Mob_no, DOB, address, Gender, Usertype from users where Usertype='Admin'");
            ResultSet rs = ps.executeQuery();   


            table = new JTable(buildTableModel(rs));
            //table.getColumn("DP").setCellRenderer(new RightTableCellRenderer());
            table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
            //table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            table.setRowSelectionAllowed(false);
            table.setFocusable(false);
            table.setFillsViewportHeight(true);
            table.setRowHeight(35);
            TableColumn tc = table.getColumn("DP");
            tc.setMinWidth(40);
            tc.setMaxWidth(40);
            TableColumn tc1 = table.getColumn("Update");
            tc1.setMinWidth(70);
            tc1.setMaxWidth(70);
            TableColumn tc2 = table.getColumn("Delete");
            tc2.setMinWidth(70);
            tc2.setMaxWidth(70);
            TableColumn tc3 = table.getColumn("UID");
            tc3.setMinWidth(65);
            tc3.setMaxWidth(65);
/*          Dimension dm = new Dimension(5,1);
            table.setIntercellSpacing(new Dimension(dm));*/
            table.addMouseListener(new JTableButtonMouseListener(table));

            //table.getColumn("UID").setCellRenderer(new MyCellRenderer());

            table.addMouseMotionListener(new MouseAdapter() {
                public void mouseMoved(MouseEvent e) {
                    Point p = e.getPoint();
                    hoveredRow = table.rowAtPoint(p);
                    hoveredColumn = table.columnAtPoint(p);
                    table.repaint();
                }
                public void mouseExited(MouseEvent e) {
                    hoveredRow = hoveredColumn = -1;
                    table.repaint();
                }
            });

            JTableHeader header = table.getTableHeader();
            header.setFont(new Font("Tahoma", Font.BOLD, 14));

            addComponentListener(new ComponentAdapter() {
                @Override
                public void componentResized(ComponentEvent arg0) { 
                    scrollPane.setBounds(10, 80, getContentPane().getWidth()-20, 400);

                }
            });

            TableCellRenderer buttonRenderer = new JTableButtonRenderer();
            table.getColumn("Update").setCellRenderer(buttonRenderer);
            table.getColumn("Delete").setCellRenderer(buttonRenderer);

            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 +1 , width);

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


            DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
            centerRenderer.setHorizontalAlignment( JLabel.CENTER );
            table.setDefaultRenderer(String.class, centerRenderer);
            //centerRenderer.setHorizontalTextPosition(DefaultTableCellRenderer.CENTER);

            /*DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(){
                @Override
                public Component getTableCellRendererComponent(JTable arg0,Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) {
                     Component tableCellRendererComponent = super.getTableCellRendererComponent(arg0, arg1, arg2, arg3, arg4, arg5);
                     int align = DefaultTableCellRenderer.LEFT;
                     if(align == DefaultTableCellRenderer.LEFT){
                         align = DefaultTableCellRenderer.CENTER;
                     }
                    ((DefaultTableCellRenderer)tableCellRendererComponent).setHorizontalAlignment(align);
                     return tableCellRendererComponent;
                }
            };          

            for(int i = 0; i < rs.getMetaData().getColumnCount(); i++)
            {
                table.getColumnModel().getColumn(+i).setCellRenderer(renderer);
            }*/


            scrollPane = new JScrollPane(table);
            //scrollPane.setBounds(10, 80, getContentPane().getWidth()-20, table.getRowHeight()*(table.getRowCount() + 1));
            scrollPane.setBounds(10, 80, 1570, 400);
            Dimension maxScrollPaneSize = new Dimension(getContentPane().getWidth()-20, 400);
            scrollPane.setMaximumSize(maxScrollPaneSize);
            scrollPane.setBackground(new Color(144, 202, 249));
            scrollPane.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1, true));
            scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
            getContentPane().add(scrollPane);   

            // Closes the Connection        
            rs.close();
            ps.close();
            con.close();

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

Как я могу применить вышеуказанное решение для ссылки к моей таблице?

1 Ответ

0 голосов
/ 02 мая 2018

Я только что сделал небольшие изменения, и это работает для меня.

private int hoveredRow = -1, hoveredColumn = -1;

    table.addMouseMotionListener(new MouseMotionListener() {
        @Override
        public void mouseMoved(MouseEvent e) {
            Point p = e.getPoint();
            hoveredRow = table.rowAtPoint(p);
            hoveredColumn = table.columnAtPoint(p);
            table.setRowSelectionInterval(hoveredRow, hoveredRow);
            table.repaint();    
        }
        @Override
        public void mouseDragged(MouseEvent e) {
            hoveredRow = hoveredColumn = -1;
            table.repaint();
        }
    });
...