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); } }
Annonceindlæg fra Pointsharp
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...
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")
03. november 2002 - 14:35
#3
har fundet det. Man kan kalde "iterator" på sin SortedListModel og få retuneret en Iterator.
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" ); } }
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" ); } }
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)
03. november 2002 - 20:01
#7
Jo, det kan du sagtens, f.eks. som her: leftList.setFont( new Font("Monospaced",Font.BOLD,20) );
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?
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.
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?
04. november 2002 - 21:05
#11
Tja, så kan det vel ikke lade sig gøre?
Kurser inden for grundlæggende programmering