Avatar billede tri Nybegynder
02. november 2002 - 16:04 Der er 10 kommentarer og
1 løsning

2 * JListe

Hejsa.

Jeg er ved at opbygge en simpel GUI, med en Frame, 3 knapper og 2 Jlister.

Når man trykker på knap1, så skal data fra en vector indlæses i Jiste1.

Nu skal man kunne markerer et el. flere elementer og trykke på en knap2, og så skal de markerede elementer flyttes over i Jiste2.
(De skal også kunne flyttes return igen.)


Til sidst skal man kunne trykke på knap3, og så udskrives (println) de resterede elementer fra liste1.


Er der nogen der kan hjælpe mig med at lave de 2 lister, hvor man kan flytte elementer mellem?

(de skal være i højre side af skærmen)


Kode indtil nu:
import java.awt.*;
import java.util.Vector;
import javax.swing.*;

public class TabbedPaneExample extends JFrame {
    private JTabbedPane tabbedPane;
    private JPanel panel1;
    private Vector v1 = new Vector();
    private Vector v2 = new Vector();


    public TabbedPaneExample() {

        v1.add("test1");
        v1.add("test2");
        v1.add("test3");

        setTitle("Tabbed Pane Application");
        setSize(800, 600);
        setBackground(Color.gray);

        JPanel topPanel = new JPanel();
        topPanel.setLayout(new BorderLayout());
        getContentPane().add(topPanel);

        // Create the tab pages
        createPage1();


        // Create a tabbed pane
        tabbedPane = new JTabbedPane();
        tabbedPane.addTab("Page 1", panel1);
        topPanel.add(tabbedPane, BorderLayout.CENTER);
    }

    public void createPage1() {
        panel1 = new JPanel();
        panel1.setLayout(null);

        JButton button1 = new JButton("indlæs vector");
        panel1.add(button1);
        button1.setBounds(10, 60, 150, 20);

        JLabel label4 = new JLabel("");
        label4.setBounds(10, 100, 150, 20);
        panel1.add(label4);

        JButton button2 = new JButton("udskriv vector");
        panel1.add(button2);
        button2.setBounds(10, 140, 150, 20);
    }

    protected void frameInit() {
        super.frameInit();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }


    public static void main(String args[]) {
        TabbedPaneExample mainFrame = new TabbedPaneExample();
        mainFrame.setVisible(true);
    }
}
Avatar billede walker Nybegynder
03. november 2002 - 09:17 #1
Hej
Det er såmend ikke så svært. Det at flytte elementerne fra den ene JList til den anden er ikke så meget et GUI problem. Det er bare at udvælge elementet som skal flyttes i vektor1 og flytte det over i vektor2. Udskrivningen er jo bare at løbe gennem vektor1 og udskrive alle elementerne...
Avatar billede tri Nybegynder
03. november 2002 - 14:21 #2
ok, nu kan jeg flytte elementer mellem de 2 lister, og få fat i det valgte element.

Men hvordan går jeg fat i alle de elementer der er i min liste?
(altså alle dem som ikke er "selected")
Avatar billede tri Nybegynder
03. november 2002 - 14:35 #3
har fundet det.

Man kan kalde "iterator" på sin SortedListModel og få retuneret en Iterator.
Avatar billede carstenknudsen Nybegynder
03. november 2002 - 15:52 #4
Her er et eksempel der gør det du efterlyser:
import java.util.*;
import java.util.List;
public class JListExample extends JFrame {
    public JListExample( String title ) {
    List list1 = new ArrayList();
    list1.add( "First" );
    list1.add( "Second" );
    list1.add( "Third" );
    JButton readButton = new JButton( "Read" );
    JButton moveButton = new JButton( "Move" );
    JButton printButton = new JButton( "Print" );
    DefaultListModel model1 = new DefaultListModel();
    DefaultListModel model2 = new DefaultListModel();
    JList leftList = new JList( model1 );
    JList rightList = new JList( model2 );
    leftList.setVisibleRowCount( 3 );
    rightList.setVisibleRowCount( 3 );
    Container c = getContentPane();
    Box box = Box.createHorizontalBox();
    box.add( readButton );
    box.add( new JScrollPane( leftList ) );
    box.add( moveButton );
    box.add( new JScrollPane( rightList ) );
    box.add( printButton );
    readButton.setAction( new ReadAction( list1, model1 ) );
    moveButton.setAction( new MoveAction( leftList, model1, model2 ) );
    printButton.setAction( new PrintAction( model2 ) );
    c.add( box );
    pack();
    show();
    }
    private class ReadAction extends AbstractAction {
    private List list;
    private DefaultListModel listModel;
    public ReadAction( List list, DefaultListModel listModel ) {
        this.list = list;
        this.listModel = listModel;
    }
    public void actionPerformed( ActionEvent e ) {
        for (int i = 0, n = list.size(); i < n; i++) {
          listModel.add( listModel.getSize(), list.get( i ) );
        }
    }
    }
    private class MoveAction extends AbstractAction {
    private JList list;
    private DefaultListModel model1, model2;
    public MoveAction( JList list,
              DefaultListModel model1,
              DefaultListModel model2 ) {
        this.list = list;
        this.model1 = model1;
        this.model2 = model2;
    }
    public void actionPerformed( ActionEvent e ) {
        int[] indices = list.getSelectedIndices();
        for (int i = 0; i < indices.length; i++) {
        Object o = model1.getElementAt( indices[ i ] );
        model2.add( model2.getSize(), o );
        }
    }
    }
    private class PrintAction extends AbstractAction {
    private DefaultListModel model;
    public PrintAction( DefaultListModel model ) {
        this.model = model;
    }
    public void actionPerformed( ActionEvent e ) {
        for (int i = 0, n = model.getSize(); i < n; i++) {
        System.out.println( model.getElementAt( i ) );
        }
    }
    }
    public static void main( String[] args ) {
    JFrame f = new JListExample( "JListExample" );
    }
}
Avatar billede carstenknudsen Nybegynder
03. november 2002 - 16:31 #5
Her er en lettere rettet version, dog er
funktionaliteten den samme (der er labels
på knapperne nu):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.util.List;
public class JListExample extends JFrame {
    public JListExample( String title ) {
    List list1 = new ArrayList();
    list1.add( "First" );
    list1.add( "Second" );
    list1.add( "Third" );
    JButton readButton = new JButton();
    JButton moveButton = new JButton();
    JButton printButton = new JButton();
    DefaultListModel model1 = new DefaultListModel();
    DefaultListModel model2 = new DefaultListModel();
    JList leftList = new JList( model1 );
    JList rightList = new JList( model2 );
    Container c = getContentPane();
    Box box = Box.createHorizontalBox();
    box.add( readButton );
    box.add( new JScrollPane( leftList ) );
    box.add( moveButton );
    box.add( new JScrollPane( rightList ) );
    box.add( printButton );
    readButton.setAction( new ReadAction( "Read", list1, model1 ) );
    moveButton.setAction( new MoveAction( "Move", leftList, model1, model2 ) );
    printButton.setAction( new PrintAction( "Print", model2 ) );
    c.add( box );
    pack();
    show();
    }
    private class ReadAction extends AbstractAction {
    private List list;
    private DefaultListModel listModel;
    public ReadAction( String name, List list, DefaultListModel listModel ) {
        super( name );
        this.list = list;
        this.listModel = listModel;
    }
    public void actionPerformed( ActionEvent e ) {
        for (int i = 0, n = list.size(); i < n; i++) {
          listModel.add( listModel.getSize(), list.get( i ) );
        }
    }
    }
    private class MoveAction extends AbstractAction {
    private JList list;
    private DefaultListModel model1, model2;
    public MoveAction( String name, JList list,
              DefaultListModel model1,
              DefaultListModel model2 ) {
        super( name );
        this.list = list;
        this.model1 = model1;
        this.model2 = model2;
    }
    public void actionPerformed( ActionEvent e ) {
        int[] indices = list.getSelectedIndices();
        for (int i = 0; i < indices.length; i++) {
        Object o = model1.getElementAt( indices[ i ] );
        model2.add( model2.getSize(), o );
        }
    }
    }
    private class PrintAction extends AbstractAction {
    private DefaultListModel model;
    public PrintAction( String name, DefaultListModel model ) {
        super( name );
        this.model = model;
    }
    public void actionPerformed( ActionEvent e ) {
        for (int i = 0, n = model.getSize(); i < n; i++) {
        System.out.println( model.getElementAt( i ) );
        }
    }
    }
    public static void main( String[] args ) {
    JFrame f = new JListExample( "JListExample" );
    }
}
Avatar billede tri Nybegynder
03. november 2002 - 17:47 #6
carsten:

Det ser fint ud.
Jeg har lige et ekstra spg.

Kan man ikke sætte størrelsen på den tekst som er i en Liste?
(altså selve tekst størrelsen)
Avatar billede carstenknudsen Nybegynder
03. november 2002 - 20:01 #7
Jo, det kan du sagtens, f.eks. som her:
leftList.setFont( new Font("Monospaced",Font.BOLD,20) );
Avatar billede tri Nybegynder
04. november 2002 - 15:30 #8
carsten:

Jeg ved ikke lige hvad der er sket med vores brugernavne??

Pointene er dine.

Jeg har lige et bonus spørgsmål, hvis du har tid.


Jeg har en beregnings-metode i mit program som tager ca. 2 min.
Jeg kunne godt tænke mig at der kører en prograssBar i de 2 min.

Jeg har lavet denne:
JProgressBar aJProgressBar = new JProgressBar(0, 50);
        aJProgressBar.setStringPainted(true);
        aJProgressBar.setBounds(20, 400, 200, 20);
        panel1.add(aJProgressBar);

Men hvordan starter jeg den?
Og hvordan tilpasser jeg den, så den kører så længe at min metode udfører beregningerne?
Avatar billede carstenknudsen Nybegynder
04. november 2002 - 15:51 #9
1) din metode skal løbende fortælle
hvor meget af opgaven den har løst,
herunder om den evt er færdig.
2) der skal være en tråd (vigtigt)
der løbende checker hvor meget
din metode har lavet og opdaterer
din ProgressBar
3) sidstnævnte tråd skal huske at checke
om din metode er færdig og evt fjerne
ProgressBar'en.
Avatar billede tri Nybegynder
04. november 2002 - 16:16 #10
carsten:

ok.

Men hvad gør man hvis man skal køre det i en J2EE server, hvor det jo ikke er tilladt at starte sine egne tråde?
Avatar billede carstenknudsen Nybegynder
04. november 2002 - 21:05 #11
Tja, så kan det vel ikke lade sig gøre?
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