Виділення рядка JTable правою кнопкою миші, Java Swing та інша джава

Пишемо щось на Джава.

Виділення рядка JTable правою кнопкою миші

Як тільки переді мною постала проблема виділення рядка JTable правою кнопкою миші, я почав пошук методів самого JTable для включення такої можливості (я наївно вважав, що вони є). Однак всі мої пошуки були марні 🙂 Але рішення все ж таки знайшлося. Для початку потрібно прослуховувати події миші JTable. Як тільки подія натискання відбулася, необхідно перевірити, яка кнопка натиснута користувачем. Якщо натиснуто праву кнопку, то визначаємо рядок і стовпець JTable за координатами, які можна отримати з об'єкта події, що передається в обробник. Далі, на основі отриманих координат визначаємо ці рядок та стовпець і просимо таблицю виділити їх.

Для більшої зрозумілості розглянемо код. JTable має два корисні методи columnAtPoint() та rowAtPoint(). Перший повертає номер стовпця для точки Point, яка зберігає інформацію про те, де знаходився курсор миші під час натискання кнопки миші. Другий спосіб повертає номер рядка. Обидва методи мають один параметр типу Point. Звідки взяти цей самий Point. А взяти його можна з об'єкта MouseEvent, який створюється системою та передається в обробник натискання миші MouseListener.

public void mousePressed(MouseEvent event) if(event.getButton() == MouseEvent.BUTTON3) int column = table.columnAtPoint(event.getPoint()); int row = table.rowAtPoint(event.getPoint()); table.setColumnSelectionInterval(column, column); table.setRowSelectionInterval(row, row); > >

За допомогою рядка, вказаного нижче, ми перевіряємо, що натиснута саме права кнопка, інші нам обробляти і нема чого.

Далі отримуємо номери рядка та стовпця, над якими і сталосянатискання.

int column = table.columnAtPoint(event.getPoint()); int row = table.rowAtPoint(event.getPoint());

Ну і кульмінація моменту - говоримо таблиці JTable виділити щойно отримані рядок і стовпець.

table.setColumnSelectionInterval(column, column); table.setRowSelectionInterval(row, row);

Таблиця JTable дозволяє виділяти по кілька рядків відразу, що йдуть одна за одною - інтервал (якщо дозволяє SelectionModel). При виділенні інтервалу потрібно вказувати початку та кінець. У нашому випадку ми виділяємо один рядок та стовпець, тому початок та кінець інтервалу збігаються, тобто інтервал у нас складається з одного елемента.

Варто згадати дещо про setColumnSelectionInterval(). Якщо не робити його виклик, то осередок таблиці JTable, над якою відбуватиметься натискання, не отримуватиме фокус і обрамлятиметься відповідним прямокутником. Якщо потрібно лише виділяти рядок, то можна не робити цей виклик.

За традицією, повноважний робочий приклад, зовнішній вигляд якого представлений на малюнку нижче.

import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener;

import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable;

public class TestFrame extends JFrame

public static void createGUI() JFrame frame = новий JFrame("Test frame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel mainPanel = новий JPanel(); mainPanel.setLayout(new BorderLayout());

final JTable table = new JTable(data, columnNames); JScrollPane scrollPane = новий JScrollPane(table); mainPanel.add(scrollPane, BorderLayout.CENTER);

public void mouseClicked(MouseEvent event)

public void mouseEntered(MouseEvent event)

public void mouseExited(MouseEvent event)

public void mousePressed(MouseEvent event) if (event.getButton() == MouseEvent.BUTTON3) Point point = event.getPoint(); int column = table.columnAtPoint(point); int row = table.rowAtPoint(point); table.setColumnSelectionInterval(column, column); table.setRowSelectionInterval(row, row); > >

public void mouseReleased(MouseEvent event)