Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > JTable выделить ячейку 2-й кнопкой мыши


Автор: soulcub 20.5.2010, 17:20
В принципе это и есть вопрос. Поставил на таблицу JPopupMenu и хочу, чтоб перед тем как менюшка вылазит, выделить ячейку, по которой нажал 2-й кнопкой мыши.

Автор: pathfinder 20.5.2010, 18:03
Код

jTable1.addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed(MouseEvent e) {
        if (SwingUtilities.isRightMouseButton(e)) {
            int row = jTable1.rowAtPoint(e.getPoint());
            int column = jTable1.columnAtPoint(e.getPoint());
            if (row >= 0 && column >= 0) {
                ((JTable)e.getSource()).changeSelection(row, column, false, false);
            }
        }
    }
});

Автор: soulcub 20.5.2010, 18:48
Блин, Вы мне прям сегодня помогаете во всём) Было бы 100 постов - поставил бы + ) Всё работает, спасибо, только почему-то когда выплывает PopupMenu, выделение именно ячейки убирается( Она то выделена, всё ссылается на неё, но почему-то графически выделение убегает( В принципе и так норм, но всё же...) Вдруг знаете)

Или лучше, как выделить всю колонку каким-то цветом другим?) Сейчас сам попробую поискать, напишу если найду) Или даже не цветом, а чтоб хотя бы видно хоть как-то было, какая колонка активна сейчас.. Пытался сделать
Код

 ((JTable)e.getSource()).setColumnSelectionAllowed(false);
 не то(

Автор: pathfinder 20.5.2010, 19:39
Это нормальное поведение. При показе JPopupMenu "фокус ввода" у ячейки проподает поэтому синяя граница у ячейки и не отрисовывается. Впринцыпе можно пошаманить с методом JTable.prepareRenderer().

Код

import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class JVingradExample extends JFrame {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JVingradExample().setVisible(true);
            }
        });
    }

    public JVingradExample() {
        super("Vingrad Example");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JPopupMenu popupMenu = new JPopupMenu("PopupMenu");
        popupMenu.add(new JMenuItem("MenuItem1"));
        popupMenu.add(new JMenuItem("MenuItem2"));
        popupMenu.add(new JMenuItem("MenuItem3"));

        JTable table = new JTable(new DefaultTableModel(new String[]{"A", "B", "C", "D", "E"}, 10)) {
            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Object value = getValueAt(row, column);

                boolean isSelected = false;
                boolean hasFocus = false;

                boolean isTemporaryFocusLost = popupMenu.isVisible();

                // Only indicate the selection and focused cell if not printing
                if (!isPaintingForPrint()) {
                    isSelected = isCellSelected(row, column);

                    boolean rowIsLead =
                        (selectionModel.getLeadSelectionIndex() == row);
                    boolean colIsLead =
                        (columnModel.getSelectionModel().getLeadSelectionIndex() == column);

                    hasFocus = (rowIsLead && colIsLead) && (isTemporaryFocusLost || isFocusOwner());
                }

                return renderer.getTableCellRendererComponent(this, value,
                                                              isSelected, hasFocus,
                                                              row, column);
            }
        };
        table.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                JTable table = (JTable) e.getSource();
                if (SwingUtilities.isRightMouseButton(e)) {
                    int row = table.rowAtPoint(e.getPoint());
                    int column = table.columnAtPoint(e.getPoint());
                    if (row >= 0 && column >= 0) {
                        if (table.isEditing() && !table.getCellEditor().stopCellEditing()) {
                            return ;
                        }
                        table.changeSelection(row, column, false, false);
                    }
                }
                showPopupMenu(e);
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                showPopupMenu(e);
            }

            void showPopupMenu(MouseEvent e) {
                if (e.isPopupTrigger()) {
                    popupMenu.show(e.getComponent(), e.getX(), e.getY());
                }
            }
        });

        add(new JScrollPane(table));
        pack();
        setLocationRelativeTo(null);
    }

}


Код метод prepareRenderer полностью взят из исходников Swing-а.

Автор: soulcub 20.5.2010, 21:08
Спасибо за помощь)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)