Нажмите гиперссылку в jtable?

Как включить гиперссылку для каждой записи в JTable?

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

В качестве альтернативы, как я могу включить редактирование данных таблицы на месте?

Другой вопрос: в настоящее время я использую следующий способ отображения другого экрана. Но это не элегантный способ, как я понимаю, мы должны использовать карточную раскладку, но как именно это сделать?

mainPanel.setVisible(false);
createBlogEntryPanel.setVisible(true);
setComponent(createBlogEntryPanel);

person sdsds    schedule 23.11.2010    source источник
comment
вы можете попробовать это с помощью: ‹JComponent›.setText(‹HTML›‹a href=\url\›About‹/a›‹/HTML›);   -  person Mohamed Saligh    schedule 23.11.2010
comment
Вы хотите открыть данный URL-адрес в браузере? или что-то другое?   -  person Kowser    schedule 18.08.2012


Ответы (2)


Чтобы решить проблему с JTable, потребляющим события, вы можете добавить свой собственный MouseListener (или MouseAdapter) к JTable и выполнять свои манипуляции внутри этого слушателя. Вот пример того, чего вы можете достичь:

public class Main extends JFrame {

public Main() {
    super();

    DefaultTableModel dt = new DefaultTableModel(
            new String[][] { { "http://google.com" }, { "http://gmail.com" } }, new String[] { "Url" });
    final JTable t = new JTable(dt);

    t.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            int row = t.rowAtPoint(new Point(e.getX(), e.getY()));
            int col = t.columnAtPoint(new Point(e.getX(), e.getY()));
            System.out.println(row + " " + col);

            String url = (String) t.getModel().getValueAt(row, col);
            System.out.println(url + " was clicked");
            // DO here what you want to do with your url
        }

        @Override
        public void mouseEntered(MouseEvent e) {
            int col = t.columnAtPoint(new Point(e.getX(), e.getY()));
            if (col == 0) {
                t.setCursor(new Cursor(Cursor.HAND_CURSOR));
            }
        }

        @Override
        public void mouseExited(MouseEvent e) {
            int col = t.columnAtPoint(new Point(e.getX(), e.getY()));
            if (col != 0) {
                t.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }
        }
    });

    add(new JScrollPane(t));

    t.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() {

        @Override
        public Component getTableCellRendererComponent(JTable table, final Object value, boolean arg2,
                boolean arg3, int arg4, int arg5) {
            final JLabel lab = new JLabel("<html><a href=\"" + value + "\">" + value + "</a>");
            return lab;
        }
    });

    setSize(700, 500);
    setLocationRelativeTo(null);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static void main(String[] args) {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception e) {
        e.printStackTrace();
    }

    new Main();
}

}
person aymeric    schedule 17.08.2012
comment
Но что, если только часть ячейки является гиперссылкой или, что еще хуже, если в ячейке 2 разные ссылки? - person javamonkey79; 17.08.2012
comment
В этом случае вы все равно можете использовать SwingX, как упоминалось @kleopatra. Это очень хорошая библиотека! - person aymeric; 17.08.2012
comment
@ javamonkey79, к сожалению, не поддерживается в SwingX (как и этот ответ, он основан на ячейке) - person kleopatra; 20.08.2012

(Вопрос слишком расплывчатый, чтобы ответить на него кратко/полностью - в этом ответе предполагается, что основной частью является гиперссылка в JTable)

Рассмотрите возможность использования фреймворка, который полностью поддерживает гиперссылки в компонентах коллекции (таблица, список, дерево и т. д.) — например, f.i. SwingX

Пример кода в SwingX см. в последнем ответе.

Изменить

Но что, если только часть ячейки является гиперссылкой или, что еще хуже, если в ячейке 2 разные ссылки?

Как упоминалось в моем комментарии: это не поддерживается в SwingX (он основан на ячейке).

Итак, мы вернулись к исходной точке с несколькими вариантами

Старый стиль: (неправильно) используйте редактор ячеек

  • иметь компонент редактирования, который является/содержит гиперссылку
  • иметь mouseListener, который начинает редактирование при наведении курсора на ячейку
  • отныне live-компонент заботится о событиях mouseEvents и может запускать соответствующие действия при нажатиях/щелчках по гиперссылке/ссылкам.

Расширение стиля SwingX: обогатите интерфейс прокрутки (в инкубаторе могут быть примеры, но они не были добавлены в ядро ​​SwingX по причине того, что они еще не готовы :-) Основная идея состоит в том, чтобы

  • добавить «горячие точки» в интерфейс ролловера
  • улучшите (или замените) rolloverProducer для создания более подробных уведомлений после обнаружения ячейки, поддерживающей опрокидывание.
  • перевести mousePosition в координаты ячейки (компонента рендеринга) и запросить ячейку, если она соответствует горячей точке, если (и только если) это так, активировать и по щелчку вызвать действие

Второе, конечно, может быть реализовано независимо от SwingX: обычный пользовательский mouseListener и логика сопоставления должны сработать (извините, нет удобного кода)

person kleopatra    schedule 17.08.2012
comment
Да, я просто хочу добавить гиперссылки на JTable. Я не стал создавать повторяющийся вопрос, поэтому просто добавил награду к этому. Я могу использовать JXTable, если он работает; Я проверю это. - person javamonkey79; 17.08.2012
comment
Я не совсем уверен, что вы можете сделать это без swingx, поскольку старый добрый JTable потребляет события щелчка мыши - похоже, он не делегирует их дочерним компонентам. Впрочем, может я просто что-то не так делаю. В любом случае, я просто проигнорировал более сложные варианты использования и использовал свингкс со всем столбцом, который можно связать. - person javamonkey79; 23.08.2012