2016-03-20 2 views
1

У меня есть JTable с тремя столбцами. Для каждой строки у меня есть слово, его тип и количество вхождений; например, на следующем рисунке, String «Rosing Prize» присутствует два раза.От JTable до гистограммы - Swing

enter image description here

Начиная с этого JTable я хочу, чтобы построить гистограмму, которая принимает в качестве ввода первого и последнего столбца. Первый столбец - это имя столбцов, а последний - его высота; когда пользователь выбирает некоторые строки, они отображаются на гистограмме.

К примеру, в этой ситуации у меня 4 строк выбран:

enter image description here

Выхода четыре J-кадры: первые только с одной строкой (т.е. представляет собой первую строку); во второй J-Frame у меня есть два бара (первый и второй строки); в третьем JFrame есть 3 бара для первого, второго и третьего ряда и, наконец, в четвертом и последнем JFrame у меня есть правильный вывод: enter image description here

Я думал о двух возможностях, чтобы исправить эту проблему:

  1. , чтобы добавить Jbutton, и после одного нажатия на него выделенные строки нарисованы на гистограмме
  2. , чтобы добавить все JFrame в ArrayList и напечатать только последние.

Есть ли лучшие решения?

+0

Несомненно. Добавьте JButton и нарисуйте выделенные строки на гистограмме на JPanel. –

+0

Хорошо. Это не сложно. Но можно ли рисовать гистограмму без давления Дж. Баттона? – DistribuzioneGaussiana

+0

Вы действительно хотите нарисовать новую гистограмму каждый раз, когда пользователь выбирает одну или несколько строк JTable? Как вы узнаете, когда пользователь завершил выбор строк? –

ответ

2

Я добавил ListSelectionListener слушателя к моей таблице модели.

В вашем ListSelectionListener, обновление набора данных на графике только тогда, когда getValueIsAdjusting() является false. Это отсрочит обновления до тех пор, пока выбор не станет стабильным.

+1

Работает отлично. Спасибо! – DistribuzioneGaussiana

2

Если вы правильно поняли ваш вопрос, ListSelectionListener решит вашу проблему.

Определить выбор слушателя первым:

class MySelectionListener implements ListSelectionListener { 

Затем добавить его к модели выбора вашего стола:

MySelectionListener selectionListener = new MySelectionListener(); 
table.getSelectionModel().addListSelectionListener(selectionListener); 

Edit:

Создать MouseListener. Затем добавьте его в свой стол. Вот рабочий пример кода:

import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JTable; 

public class TableTest { 
    JFrame window = new JFrame(); 

    private TableTest() { 
     createWindow(); 
    } 

    public void createWindow() { 
     Object rowData[][] = { { "Row1-Column1", "Row1-Column2", "Row1-Column3" }, 
       { "Row2-Column1", "Row2-Column2", "Row2-Column3" }, 
       { "Row3-Column1", "Row3-Column2", "Row3-Column3" } }; 
     Object columnNames[] = { "Column One", "Column Two", "Column Three" }; 
     JTable table = new JTable(rowData, columnNames); 
     table.addMouseListener(new SelectionListener(table)); 

     window.add(table); 
     window.pack(); 
     window.setVisible(true); 

    } 

    public static void main(String[] args) { 
     new TableTest().createWindow(); 
    } 
} 

class SelectionListener extends MouseAdapter { 
    JTable table; 

    public SelectionListener(JTable table) { 
     this.table = table; 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     int[] rows = table.getSelectedRows(); 

     for (int i = 0; i < rows.length; i++) { 
      System.out.println(rows[i]); 
     } 
    } 
} 
+0

Прошу прощения, если я не был ясен, но это не моя проблема. Я добавил слушателя ListSelectionListener в мою модель таблицы. Проблема в том, что если я выбрал несколько строк, слушатель вызывается для каждой выбранной строки. (например, если выбрано 4 строки, мой слушатель вызывается для выбора одной строки, для двух выбранных строк, для 3 выбранных строк и для 4 выбранных строк). – DistribuzioneGaussiana

+1

Вы попробовали прослушиватель мыши? В методе 'mouseReleased()' вы можете получить выбранные строки и нарисовать диаграмму. – rdonuk

+0

Хорошая идея. Я попробую поблагодарить вас! – DistribuzioneGaussiana

Смежные вопросы