Avatar billede mummikiks Nybegynder
29. september 2005 - 08:04 Der er 8 kommentarer og
1 løsning

Sortering af JLabels i JScollPane, samt noget meget mærkeligt

Hej Expeter

JEg har lavet en lille appllikation, som kan findes på www.control.aau.dk/~ksno04.

I denne applikation kan man trykke på knappen og tilføje labels i JScrollPanen iude til højre. Det er herefter muligt at fjerne den derfra igen, ved at højreklikke og trykke fjern.
Mit problem ligger i at hvis jeg fx tilføjer 3 label. Fjerne den øverste og den nederste, så trække labelene ikke sig sammen, samt at den næste starter som nr. Videre kan jeg ikke få Jscrollpanen til at automatisk aktivere sit scroll (labene bliver tilføjet udenfor vinduet). Det uendelig mærkelig forekommer engang i mellem når jeg højreklikker på objektet i højre side, sker det nogle hange at menuen ikke kommer frem, den trykke bare autmatisk på fjern. Jeg vil love at jeg ikke trykke to gange hurtigt, så vil høre om dette er en kendt fejl.

Håber nogle kan give mig et liv til hvordan jeg løser nogle af ovenstående problemstillinger.. Er det noget med at jeg skal smide dem ind i en jlist?
Avatar billede mikkelbm Nybegynder
29. september 2005 - 08:18 #1
Det kan have noget at gøre med den layoutmanager du bruger. Men det er svært at sige, når vi ikke umiddelbart kan se hvordan den skal fungere.
Avatar billede mikkelbm Nybegynder
29. september 2005 - 08:19 #2
Eller du bruger den måske slet ikke? Fik bare compilerfejl.
Avatar billede mummikiks Nybegynder
29. september 2005 - 11:19 #3
Beklager..Jeg har fjernet den layoutmanager. Jeg bruger den ikke.
Avatar billede mikkelbm Nybegynder
29. september 2005 - 12:28 #4
Jeg har ikke lige andet end notepad at teste i lige nu, men jeg kigger lige på det senere, når jeg kommer hjem.
Avatar billede mikkelbm Nybegynder
29. september 2005 - 21:36 #5
Så fik jeg endelig tid til at kigge på det. Jeg har kigget lidt på din kode, og ændret lidt til. Jeg har blandt andet fjernet noget af det kode der ikke blev brugt.

package Test;

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

public class NewJFrame extends javax.swing.JFrame
{
    private JScrollPane jScrollPane1;
    private JButton jButton1;
    private JPanel panel;
    private int count = 0;

    /**
    * Auto-generated main method to display this JFrame
    */
    public static void main(String[] args)
    {
        NewJFrame inst = new NewJFrame();
        inst.setVisible(true);
    }
   
    public NewJFrame()
    {
        super();
        initGUI();
    }
   
    public void addLabel()
    {
        AddDevice device = new AddDevice(this, "Device: " + count++);
        panel.add(device);
        this.validate();
        panel.updateUI();
    }
   
    public void removeLabel(AddDevice device)
    {
        panel.remove(device);
        this.validate();
        panel.updateUI();
    }
   
    private void initGUI()
    {
        try
        {
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
           
            panel = new JPanel();
            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
            jScrollPane1 = new JScrollPane(panel);
           
            this.getContentPane().add(jScrollPane1, BorderLayout.CENTER);

           
            jButton1 = new JButton();
            this.getContentPane().add(jButton1, BorderLayout.SOUTH);
            jButton1.setText("Add");
            jButton1.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent evt)
                {
                    addLabel();
                }
            });
           
            pack();
            setSize(400, 300);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}


package Test;

import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Label;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.BorderFactory;
import javax.swing.border.BevelBorder;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTextArea;



public class AddDevice extends JLabel implements ActionListener, ItemListener
{
    public JPopupMenu popup;
    JMenuItem menuItem;
    NewJFrame owner;
   
    public AddDevice(NewJFrame owner, String text)
    {
        this.setText(text);
        this.setLayout(new FlowLayout());
       
        popup = new JPopupMenu();
        menuItem = new JMenuItem("Remove");
        popup.add(menuItem);
       
        menuItem.addActionListener(this);
        popup.add(menuItem);
       
        MouseListener listener = new PopupListener();
        this.addMouseListener(listener);
       
        this.owner = owner;
    }
   
    public void actionPerformed(ActionEvent e)
    {
        owner.removeLabel(this);   
    }
   
    class PopupListener extends MouseAdapter
    {
        public void mousePressed(final MouseEvent e)
        {
            maybeShowPopup(e);
        }

        public void mouseReleased(final MouseEvent e)
        {
            maybeShowPopup(e);
        }

        private void maybeShowPopup(final MouseEvent e)
        {
            if (e.isPopupTrigger())
            {
                popup.show(e.getComponent(), e.getX(), e.getY());
            }
        }   
    }
    public void itemStateChanged(ItemEvent arg0) {}
}
Avatar billede mikkelbm Nybegynder
29. september 2005 - 21:38 #6
Læg mærke til at jeg bruger BoxLayout:

http://java.sun.com/docs/books/tutorial/uiswing/layout/box.html
Og generelt:
http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html


En anden ting jeg har ændret, er at du havde en statisk instans af din JFrame inde i din JFrame - Jeg håber det kun var for at teste, for det er ikke måden at gøre det på ;)

Send i stedet instansen med i constructoren som jeg gør.
Avatar billede mikkelbm Nybegynder
29. september 2005 - 22:03 #7
Og et svar hvis det var brugbart.
Avatar billede mikkelbm Nybegynder
04. oktober 2005 - 21:12 #8
Brugbart?
Avatar billede mummikiks Nybegynder
05. oktober 2005 - 21:20 #9
Ja det var helt perfekt, mikkel. Tusind tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester