[Java] JTabbedPane met MouseListener

Pagina: 1
Acties:

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 27-05 21:44

Robtimus

me Robtimus no like you

Topicstarter
Ik ben bezig met een klein programma'tje dat gebruikt maakt van een JTabbedPane. Alles werkt goed, maar wat ik nu wou toevoegen is een popup op de tabbladen, bv met Close oid.

Ik heb alleen geprobeerd eerst gewone MouseListeners toe te voegen, maar geen enkel component pikt deze.
Ik heb geprobeerd:
- de JFrame
- de JFrame.getContentPane()
- de JTabbedPane (zit direct in JFrame.getContentPane())
- de JPanel binnenin de JTabbedPane

Echter, geen enkele situatie levert wat ik wil, dat ie naast de standaard tab listener (die de tab selecteert) ook doet wat ik wil. Ook in de tutorial heb ik niks kunnen vinden.

Kan het wel wat ik wil? En zo ja, hoe?

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 24-05 20:08
Hoe bedoel je "een popup op de tabbladen" ? Bedoel je zoiets als dat je een tabblad laat zien nadat er op een tabje geclickt is en dat er dan een popup verschijnt?

Verwijderd

bedoel je misschien zoiets:

Main.java:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import javax.swing.*;
import java.awt.*;

class Main extends JFrame
{
    JTabbedPane jtp = new JTabbedPane();

    Main()
    {
        setBounds(100,100,300,300);
        getContentPane().setLayout(new BorderLayout());

        jtp.addMouseListener(new Popup());
        getContentPane().add("Center", jtp);

        show();
    }

    public static void main(String[] args)
    {
        new Main();
    }
}


Popup.java:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import javax.swing.JPopupMenu;
import javax.swing.JMenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

class Popup extends JPopupMenu implements ActionListener, MouseListener
{
    JMenuItem close = new JMenuItem("Close");

    Popup()
    {
        add(close);
        close.addActionListener(this);
    }

    public void actionPerformed(ActionEvent ae)
    {
        if(ae.getSource() == close)
            System.exit(0);
    }

    public void mouseReleased(MouseEvent me)
  {
        if(me.isMetaDown())
            show(me.getComponent(), me.getX(), me.getY());
  }

  public void mouseClicked(MouseEvent me){}
    public void mousePressed(MouseEvent me){}
    public void mouseEntered(MouseEvent me){}
    public void mouseExited (MouseEvent me){}
}

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 27-05 21:44

Robtimus

me Robtimus no like you

Topicstarter
Dash2in1 schreef op 05 januari 2004 @ 23:08:
Hoe bedoel je "een popup op de tabbladen" ? Bedoel je zoiets als dat je een tabblad laat zien nadat er op een tabje geclickt is en dat er dan een popup verschijnt?
Als je met je rechtermuisknop op een tabje klikt, dat ie een popup laat zien.

@JavaRules: ik heb even 2 lege JPanels toegevoegd aan je code om de tabs te krijgen, en dan doet ie het goed. Ik probeer het zo nog even met mijn echte code, maar het lijkt de oplossing. Vreemd dat het dan eerder niet werkte.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 27-05 21:44

Robtimus

me Robtimus no like you

Topicstarter
Geprobeerd, maar het werkt nog niet.
Even de relevante code:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
public JXTV()
{
    super("JXTV");
    tabs = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
    tabs.setPreferredSize(new Dimension(640, 480));
tabs.addMouseListener(new Popup()); // nieuwe regel
    getContentPane().add(tabs);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    chooser.setFileFilter(new FileFilter("xml", "XML Files"));
    chooser.setAcceptAllFileFilterUsed(false);

    // code voor het toevoegen van een gewoon menu met actions
}
Die Popup is gewoon die van JavaRules, alleen dan in mijn package gezet. Het werkt alleen weer niet. Wel als ik nog geen panels heb toegevoegd, maar zodra dat gebeurd is doet ie niks.

Toevoegen van panels:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private void open()
{
    chooser.showOpenDialog(this);
    File file = chooser.getSelectedFile();
    if (file != null)
    {
        String filename = file.getPath();
        int index = tabs.indexOfComponent(new JXTVPanel(filename));
        if (index == -1)
        {
            JXTVPanel panel = new JXTVPanel();
            panel.open(file);
            tabs.add(file.getName(), panel);
            setMenuItemsEnabled(true);
            index = tabs.indexOfComponent(panel);
        }
        else
        {
            // already added, reload it
            reload();
        }
        tabs.setSelectedIndex(index);
        tabs.setToolTipTextAt(index, filename);
    }
}
Verwijderen van panels:
Java:
1
2
3
4
5
6
7
8
private void close()
{
    tabs.remove(tabs.getSelectedComponent());
    if (tabs.getTabCount() == 0)
    {
        setMenuItemsEnabled(false);
    }
}
Het panel.open(file) of het gedoe met de index in de open method verwijderen lost het niet op. JXTVPanels toevoegen aan JavaRules' Main ipv JPanels werkt wel, dus aan die class ligt het niet.

JXTV is een subclass van JFrame, JXTVPanel een subclass van JPanel. Ik doe dus niet veel anders dan JavaRules, hooguit wat uitgebreider.

De volgende code werkt wel:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import javax.swing.*;
import java.awt.*;
import java.io.*;

class Main extends JFrame
{
    JTabbedPane jtp = new JTabbedPane();

    Main(String filename) throws Exception
    {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
//        setBounds(100,100,300,300);
        getContentPane().setLayout(new BorderLayout());

jtp.setPreferredSize(new Dimension(300, 300));
        jtp.addMouseListener(new Popup());
        getContentPane().add("Center", jtp);
File f = new File(filename);
JXTVPanel p = new JXTVPanel();
p.open(f);
        jtp.add("Bla", p);

pack();
        show();
    }

    public static void main(String[] args) throws Exception
    {
        new Main(args[0]);
    }
}
Ik snap het echt niet meer.

Even de volledige code:
JXTV.java
JXTVPanel.java
FileFilter.java
GuiUtils.java

[ Voor 7% gewijzigd door Robtimus op 06-01-2004 10:45 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

vreemd... en als je m'n popup nu eens koppelt aan zowel de JTabbedPane als aan de JXTVPanel ?

dus:
JXTVPanel panel = new JXTVPanel();
panel.addMouseListener(new Popup());

en daarna weet ook ik 't niet meer hoor ;)
't ziet er verder gewoon allemaal normaal uit...

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 27-05 21:44

Robtimus

me Robtimus no like you

Topicstarter
Nope, werkt niet. Alleen als ik op het randje van de JTP klik krijg ik die popup.

I give up, dan maar niet :/

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1