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


Автор: TiR3ks 12.8.2010, 09:43
Подскажите, как можно сделать текст в колонке link ввиде гиперссылок?
код рабочий:
Код

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

class jTable {

        JTable jtab;

        String[] headings = { "name", "link" };

        Object[][] data = {
                        { "test", "c:\\test.txt" },
                        { "test2", "c:\\test2.txt" },
                        { "test3", "c:\\test3.txt" },
                        { "test4", "c:\\test4.txt" },
                        };

        jTable (){

        JFrame jfrm = new JFrame("JTable");

        jfrm.getContentPane().setLayout(new FlowLayout());

        jfrm.setBounds(400, 350, 500, 160);

        jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jtab = new JTable(data, headings);

        JScrollPane jscrl = new JScrollPane(jtab);

        jtab.setPreferredScrollableViewportSize(new Dimension(480, 80));

        jfrm.getContentPane().add(jscrl);

        jfrm.setVisible(true);

        }

        public static void main(String[] args){

        SwingUtilities.invokeLater(new Runnable(){public void run(){new jTable();}});

        }
}

Автор: jk1 12.8.2010, 11:22
При этом оно будет по клику открываться в браузере. Только не забудьте добавить к jtab модификатор final.
Код

 jtab.addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    if (jtab.getSelectedColumn()==1) {
                        try {
                            String url = jtab.getValueAt(jtab.getSelectedRow(), jtab.getSelectedColumn()).toString();
                            Desktop.getDesktop().browse(new URI(url));
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        } catch (URISyntaxException e1) {
                            e1.printStackTrace();  
                        }
                    }

                }
            });

Автор: TiR3ks 12.8.2010, 15:30
спасибо.

а, как применить это в моём случае?
у меня вот , что получается, когда жму на ячейки в колонке link:
Код

java.net.URISyntaxException: Illegal character in opaque part at index 2: c:\test.txt
    at java.net.URI$Parser.fail(URI.java:2825)
    at java.net.URI$Parser.checkChars(URI.java:2998)
    at java.net.URI$Parser.parse(URI.java:3035)
    at java.net.URI.<init>(URI.java:595)
    at jTable$1.mousePressed(jTable.java:33)
    at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:280)
    at java.awt.Component.processMouseEvent(Component.java:6105)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:5873)
    at java.awt.Container.processEvent(Container.java:2105)
    at java.awt.Component.dispatchEventImpl(Component.java:4469)
    at java.awt.Container.dispatchEventImpl(Container.java:2163)
    at java.awt.Component.dispatchEvent(Component.java:4295)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4122)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055)
    at java.awt.Container.dispatchEventImpl(Container.java:2149)
    at java.awt.Window.dispatchEventImpl(Window.java:2478)
    at java.awt.Component.dispatchEvent(Component.java:4295)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:604)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

и вот ещё:
Код

java.io.IOException: Failed to show URI:/home/slaine/Desktop/0100GS-GettingStarted-Ru.pdf
    at sun.awt.X11.XDesktopPeer.launch(XDesktopPeer.java:93)
    at sun.awt.X11.XDesktopPeer.browse(XDesktopPeer.java:82)
    at java.awt.Desktop.browse(Desktop.java:386)
    at jTable$1.mousePressed(jTable.java:33)
    at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:280)
    at java.awt.Component.processMouseEvent(Component.java:6105)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:5873)
    at java.awt.Container.processEvent(Container.java:2105)
    at java.awt.Component.dispatchEventImpl(Component.java:4469)
    at java.awt.Container.dispatchEventImpl(Container.java:2163)
    at java.awt.Component.dispatchEvent(Component.java:4295)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4122)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055)
    at java.awt.Container.dispatchEventImpl(Container.java:2149)
    at java.awt.Window.dispatchEventImpl(Window.java:2478)
    at java.awt.Component.dispatchEvent(Component.java:4295)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:604)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)



вот, как я это записал:
Код

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
class jTable {
        JTable jtab;
        String[] headings = { "name", "link" };
        Object[][] data = {
                        { "test", "c:\\test.txt" },
                        { "test2", "c:\\test2.txt" },
                        { "test3", "c:\\test3.txt" },
                        { "test4", "c:\\test4.txt" },
                        };
        jTable (){
        JFrame jfrm = new JFrame("JTable");
        jfrm.getContentPane().setLayout(new FlowLayout());
        jfrm.setBounds(400, 350, 500, 160);
        jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jtab = new JTable(data, headings);
        JScrollPane jscrl = new JScrollPane(jtab);
        jtab.setPreferredScrollableViewportSize(new Dimension(480, 80));

     jtab.addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    if (jtab.getSelectedColumn()==1) {
                        try {
                            String url = jtab.getValueAt(jtab.getSelectedRow(), jtab.getSelectedColumn()).toString();
                            Desktop.getDesktop().browse(new URI(url));
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        } catch (URISyntaxException e1) {
                            e1.printStackTrace();  
                        }
                    }
                }
            });

        jfrm.getContentPane().add(jscrl);
        jfrm.setVisible(true);
        }
        public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){public void run(){new jTable();}});
        }
}


Автор: jk1 12.8.2010, 15:41
А как по-вашему, c:\test.txt это валидная гиперссылка?

И да, под иксами способ может не работать. Когда сам последний раз использовал Desktop он стабильно работал под виндой или под Gnome. Так что указывайте операционную систему под которой это предполагается запускать.

Автор: TiR3ks 12.8.2010, 16:07
Цитата(jk1 @ 12.8.2010,  15:41)
А как по-вашему, c:\test.txt это валидная гиперссылка?

И да, под иксами способ может не работать. Когда сам последний раз использовал Desktop он стабильно работал под виндой или под Gnome. Так что указывайте операционную систему под которой это предполагается запускать.


под иксами работает, pdf,odt открываются в ассоциативных программах.

в windows пишет те же предупреждения, даже если ссылку указать так: file:///C:\\test.txt

Автор: jk1 12.8.2010, 16:47
а если так:

C:/test.txt

По крайней мере у меня работает 

Автор: TiR3ks 12.8.2010, 17:53
Цитата(jk1 @ 12.8.2010,  16:47)
а если так:

C:/test.txt


так работает, мерси.

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