Как обновить JPanel информацией из другого класса?

StackOverflow https://stackoverflow.com//questions/10689439

Вопрос

Я создал следующий пример источника и задаюсь вопросом, что мне нужно сделать, чтобы обновить мою JPanel с помощью JLabel, в котором информация находится из строки, нажатой в JTable.

Я также хотел отметить, что это всего лишь простой пример, поскольку я немного улучшил пример кода благодаря нескольким участникам SO.Поэтому я публикую этот простой пример, чтобы научиться

SwingTesting (основной)

public class SwingTesting {

    private final JFrame frame;
    private final TablePane tablePane;
    private final JSplitPane splitPane;
    private final JPanel infoPanel;
    private final JLabel infoLabel;

    public SwingTesting() {
        tablePane = new TablePane();
        infoPanel = new JPanel();
        frame = new JFrame();

        infoLabel = new JLabel();    //this is the panel i want to add the label to
        infoPanel.add(infoLabel);

        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tablePane, infoPanel);

        frame.add(splitPane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SwingTesting();
            }
        });
    }
} 

Табличная панель

public class TablePane extends JPanel {

    private final JTable table;
    private final TableModel tableModel;
    private final ListSelectionModel listSelectionModel;

    public TablePane() {
        table = new JTable();
        tableModel = createTableModel();
        table.setModel(tableModel);
        table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        table.add(table.getTableHeader(), BorderLayout.PAGE_START);
        table.setFillsViewportHeight(true); 

        listSelectionModel = table.getSelectionModel();
        table.setSelectionModel(listSelectionModel);
        listSelectionModel.addListSelectionListener(new SharedListSelectionHandler());
        table.setSelectionModel(listSelectionModel);

        this.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridheight = 1;
        gbc.gridwidth = 3;
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.ipadx = 2;
        gbc.ipady = 2;
        gbc.weightx = 1;
        gbc.weighty = 1;

        this.add(new JScrollPane(table), gbc);
    }

    private TableModel createTableModel() {
        DefaultTableModel model = new DefaultTableModel(
            new Object[] {"Car", "Color", "Year"}, 0 
        ){
            @Override public boolean isCellEditable(int row, int column) {
                return false;
            }
        };

        addTableData(model);
        return model;
    }

    private void addTableData(DefaultTableModel model) {
        model.addRow(new Object[] {"Nissan", "Black", "2007"});
        model.addRow(new Object[] {"Toyota", "Blue", "2012"});
        model.addRow(new Object[] {"Chevrolet", "Red", "2009"});
        model.addRow(new Object[] {"Scion", "Silver", "2005"});
        model.addRow(new Object[] {"Cadilac", "Grey", "2001"});
    }


    class SharedListSelectionHandler implements ListSelectionListener {

        //When selection changes i want to add a label to the panel
        //currently it just prints out the info from the selected row    
        @Override
        public void valueChanged(ListSelectionEvent e) {
            ListSelectionModel lsm = (ListSelectionModel) e.getSource();
            String contents = "";

            if(lsm.isSelectionEmpty()) {
                System.out.println("<none>");
            } else {
                int minIndex = lsm.getMinSelectionIndex();
                int maxIndex = lsm.getMaxSelectionIndex();
                for(int i = minIndex; i <= maxIndex; i++) {
                    if(lsm.isSelectedIndex(i)) {
                        for(int j = 0; j < table.getColumnCount(); j++) {
                            contents += table.getValueAt(i, j) + " ";
                        }
                    }
                }
                System.out.println(contents);
            }
        }        
    }
}

Итак, мне интересно, как получить доступ к этой JPanel из ListSelectionListener.Должен ли я просто передать панель классу TablePane?Или есть более правильный способ сделать это?

Кроме того, мой ListSelectionListener по какой-то причине дважды распечатывает информацию о строке, я испортил цикл?

РЕДАКТИРОВАТЬ

public class TablePane extends JPanel {

    private final JTable table;
    private final TableModel tableModel;
    private final ListSelectionModel listSelectionModel;

    private final displayPanel;

    public TablePane() {
        //removed code for reading purposes
    }

    //IDE says issue with thinking displayPanel may have already been initialized
    public TablePane(JPanel panel) {
        //this();
        //displayPanel = panel;
    }


    //ListSelectionListener uses panel.add(jlabel)

}

Это так просто, как взять final выключенный?

Это было полезно?

Решение

Вы можете пройти JLabel возражать против TablePane объект (в TablePaneконструктор или предоставив собственный setLabel() метод).Тогда вы можете использовать StringBuilder чтобы создать текст, который должен быть на этикетке, и вызвать setText() на этикетке с содержанием StringBuilder объект (через его toString() метод).

Я считаю, что вы печатаете все дважды, потому что valueChanged метод вызывается дважды:один раз на уведомление об отмене выбора текущей строки, затем еще раз на уведомление о выборе новой строки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top