ercizMedlem sedan maj 20011 826 inlägg Jag har försökt göra en liten månadskalender som består av en JList.
I varje ListCell så finns det en panel och till den panelen har jag addat en JLabel med datum och en JLabel för varje "möte" under dagen. Jag vill nu ha en mouseListener som reagerar när jag klickar på etiketten för mötet.
Jag har provat att lägga till muslyssnaren på etiketten, men det verkar inte funka. Måste jag på nåt sätt ha en muslyssnare på listan för att sen skicka vidare händelseobjektet till etiketterna? eller vad gör jag för fel?
SPiNMedlem sedan mars 20007 896 inlägg Nej, du ska kunna sätta en mus-lyssnare direkt på din JLabel. Visa med kod hur du gör.
JLabel label = new JLabel("Etikett");
label.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent event) {
/* Gör vad du ska */
}
});
Om jag minns min Swing rätt...
ercizMedlem sedan maj 20011 826 inlägg
SPiN skrev:
Nej, du ska kunna sätta en mus-lyssnare direkt på din JLabel. Visa med kod hur du gör.
Hmm, jag har gjort liknande dig. Jag har ganska mycket kod, men här är det som är mest relevant:
final JLabel m = new JLabel("Möte");
m.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
System.out.println("Click");
if(SwingUtilities.isLeftMouseButton(e)){
m.setForeground(Color.RED);
}
}
});
panel.add(m, BorderLayout.CENTER);
Resultatet blir att texten "Möte" skrivs ut men inget händer om jag klickar på den, texten blir inte röd och "click" printas inte.
SPiNMedlem sedan mars 20007 896 inlägg Hm. Om du skapar en separat klass som ärver från MouseAdapter eller implementerar MouseListener, händer det fortfarande ingenting? Har du provat med något annat Event (pressed, released...)?
class MyMouseListener implements java.awt.event.MouseListener {
private String component;
public MyMouseListener(String component) {
this.component = component;
}
public void mouseClicked(java.awt.event.MouseEvent e) {
System.out.println("Mouse clicked: " + this.component);
}
public void mouseEntered(java.awt.event.MouseEvent e) {
System.out.println("Mouse entered: " + this.component);
}
public void mouseExited(java.awt.event.MouseEvent e) {
System.out.println("Mouse exited: " + this.component);
}
public void mousePressed(java.awt.event.MouseEvent e) {
System.out.println("Mouse pressed: " + this.component);
}
public void mouseReleased(java.awt.event.MouseEvent e) {
System.out.println("Mouse released: " + this.component);
}
}
Och när du sätter fast lyssnaren;
JLabel label = new JLabel("etikett");
label.addMouseListener(new MyMouseListener("etikett"));
ercizMedlem sedan maj 20011 826 inlägg
SPiN skrev:
Nej, du ska kunna sätta en mus-lyssnare direkt på din JLabel. Visa med kod hur du gör.
Jag gjorde ett fullständigt exempel, men fick det inte att funka iallafall:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ListTest extends JFrame{
public ListTest(){
JList list = new JList(new AbstractListModel(){
public Object getElementAt(int index){
JPanel p = new JPanel(new BorderLayout());
final JLabel etikett = new JLabel("Möte");
etikett.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
System.out.println("Click");
if(SwingUtilities.isLeftMouseButton(e)){
etikett.setText("Klart");
}
}
});
p.add(new JLabel(index+": "), BorderLayout.WEST);
p.add(etikett, BorderLayout.CENTER);
return p;
}
public int getSize(){ return 1; }
});
list.setCellRenderer(new ListCellRenderer(){
public Component getListCellRendererComponent(JList list,
Object value, int index, boolean isSelected, boolean cellHasFocus){
return (JPanel)value;
}
});
add(list);
}
public static void main (String[] arg){
JFrame frame = new ListTest();
frame.pack();
frame.setVisible(true);
}
}
Texten "Möte" skrivs ut. När man klickar på den så ändras inte texten till "Klart" och "Click" printas inte.
Jag kanske får tänka om och bara "lyssna" på om användaren klickar på listCellen.
ercizMedlem sedan maj 20011 826 inlägg
SPiN skrev:
Hm. Om du skapar en separat klass som ärver från MouseAdapter eller implementerar MouseListener, händer det fortfarande ingenting? Har du provat med något annat Event (pressed, released...)?
Har inte testat att skriva en separat klass, men det ska väl gå lika bra med en innerklass som jag gjort.
ercizMedlem sedan maj 20011 826 inlägg Testade din kod med kod för alla händelsetyper, men det hjälpte inte. Jag testade också att byta från JLabel till JButton, men inte ens det funkade, så det verkar som att det inte går att ha klickbara componenter i en lista :( eller så är det nåt jag gör fel.
final JButton etikett = new JButton("Möte");
etikett.addMouseListener(new MouseAdapter(){
public void mouseClicked(java.awt.event.MouseEvent e) {
System.out.println("Mouse clicked");
}
public void mouseEntered(java.awt.event.MouseEvent e) {
System.out.println("Mouse entered");
}
public void mouseExited(java.awt.event.MouseEvent e) {
System.out.println("Mouse exited");
}
public void mousePressed(java.awt.event.MouseEvent e) {
System.out.println("Mouse pressed");
}
public void mouseReleased(java.awt.event.MouseEvent e) {
System.out.println("Mouse released");
}
SPiNMedlem sedan mars 20007 896 inlägg
Har inte testat att skriva en separat klass, men det ska väl gå lika bra med en innerklass som jag gjort.
Anonym klass, inte en innerklass. ;) Men ja, det ska gå lika bra!
Jag försökte själv alldeles nyss att skapa en JLabel som reagerar på en mus-event (utanför en lista också, rakt i fönstret), men jag lyckas inte heller. Sitter på GNU/Linux med gij 4.3.2 f.ö. och jag vet att Swing inte fungerar perfekt i min miljö. Jag har googlat lite grann, och det ska tydligen gå att åstadkomma på samma sätt vi har försökt. Varför det inte fungerar, beats me...
ercizMedlem sedan maj 20011 826 inlägg
SPiN skrev:
Jag försökte själv alldeles nyss att skapa en JLabel som reagerar på en mus-event (utanför en lista också, rakt i fönstret), men jag lyckas inte heller. Sitter på GNU/Linux med gij 4.3.2 f.ö. och jag vet att Swing inte fungerar perfekt i min miljö. Jag har googlat lite grann, och det ska tydligen gå att åstadkomma på samma sätt vi har försökt. Varför det inte fungerar, beats me...
Okej, jag har testat allt på Vista. Men jag är inte säker på om det här ska gå, det verkar nästan inte så. Markeringar i listor verkar hanteras av ListSelectionModel, och den verkar bara hantera hela celler.
Men om du har någon bra google-fråga eller länk så är jag tacksam, men det är inte hela världen, jag kan klura på någon annan lösning. Man får helt enkelt välja en dag i kalendern och sen får det visas nån annan lista med möten under den dagen.
SPiNMedlem sedan mars 20007 896 inlägg Hur det fungerar i listor har jag ingen aning om, men jag lyckades alltså inte få någon mouseevent att inträffa alls - även när jag la en JLabel rakt i en JFrame eller i en panel. Men det kan som sagt bero på implementationen i gij under GNU/Linux. :)
Har du testat att flytta ut en JLabel rakt i någon annan container (JFrame eller JPanel), och lyckats med mouseevents där?
ercizMedlem sedan maj 20011 826 inlägg Det här problemet uppkom nu i ett annat projekt, så jag tog tag i det igen.
Ja, jag får JLabel att lyssna på mouseEvent utanför en lista, så det är inte det som är problemet. Men det verkar vara svårt att fånga mouseEvent till bara en del av en listCell, tror helt enkelt att det är feltänkt av mig. JList ska inte användas så.
Jag hittade den här tråden: http://forums.sun.com/thread.jspa?threadID=5370080
Lösningen verkar vara att helt skippa JList, för det är inte det här den är till för. Istället ska man använda en JScrollPane, lägga en JPanel med en BoxLayout i den och sen lägga till de olika "cellerna" i denna panel. Då blir det som en lista, med scroll-lister vid behov. Jag testade och det fungerade utmärkt.
ercizMedlem sedan maj 20011 826 inlägg
erciz skrev:
Lösningen verkar vara att helt skippa JList, för det är inte det här den är till för. Istället ska man använda en JScrollPane, lägga en JPanel med en BoxLayout i den och sen lägga till de olika "cellerna" i denna panel. Då blir det som en lista, med scroll-lister vid behov. Jag testade och det fungerade utmärkt.
Jag inser nu att den här lösningen blir ganska smärtsam. Jag vill kunna markera ett listelement, och även använda Drag-n-Drop för listan. Får väl försöka implementera detta från scratch nu, ingen som vet nån smidigare lösning?
ercizMedlem sedan maj 20011 826 inlägg I länken jag postade ovan så verkar en del föreslå att använda en JTable. Men problemet då blir väl att jag fortfarande inte kan interagera med de andra komponenterna så som t.ex. en JTextField. Så det som återstår är nog trots allt bara att implementera det mesta från scratch, kanske får göra en egen komponent av det hela.
ercizMedlem sedan maj 20011 826 inlägg Löste problemet genom att använda en JTable och skriva en egen CellRenderer, gjorde inte så att fälten blev redigerbara direkt, tror att det hade blivit lite pannkaka. Istället så gjorde jag så att det kom upp ett formulär när man dubbelklickade på tabellcellen, och kan då redigera värdena i de olika textfälten. Men jag tror att det går att skriva så att delar av tabellcellen är redigerbar.