2010-12-09 11 views
1

Ich arbeite an einem Projekt (ja, es ist für die Schule, nein, ich will nicht, dass jemand es für mich schreiben. Ich habe zu viel Stolz!) Mit einige der GUI-Komponenten von Java. Es ist immer noch in einer ziemlich rauen Phase, und eine einzige Sache hält mich davon ab, dies zu beenden. Ich versuche, nicht um Hilfe zu bitten, es sei denn, ich brauche es wirklich, denn normalerweise stellt sich heraus, dass es ein einfacher Fehler ist. Wenn das der Fall ist, dann nimm es mir leicht. Wie auch immer, so auf den Code. Dies ist ein Gruppenprojekt, daher sind einige meiner Kommentare meinem Partner. Ich würde sie fragen, aber es ist 4 Uhr morgens ... Wie auch immer, hier ist es. Nicht sicher, warum es in all diesen getrennten Kästen ist. Der Listener, mit dem ich mich beschäftige, ist ActionPerformed, ganz unten. Ich danke Ihnen gnädig für jede Hilfe.Hinzufügen zu einer JList mit einem ActionListener und Refreshing GUI Rahmen nach dem Hinzufügen

import javax.swing.*; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 


public class GUI extends JFrame 
{ 
    private JPanel panel; 
    private JFrame frame; 
    private JTextArea text; 
    private MP3List list = new MP3List(); 
    private JList songList; 
    private JScrollPane scrollList; 
    private JMenuBar menuBar; 
    private JMenu menu; 
    private JMenuItem menuAdd; 
    private String[] songs; 
    private static String mp3msg = "Project 2: MP3 Tracker"; // Header for JOptionPane 


    public GUI() 
    { 
    super("mp3"); 
    panel = new JPanel(); 
    createGUI(); 
    add(panel); 
    } 


    public void createGUI() 
    { 


//This creates the frame(createGUI) 
    frame = new JFrame(); 

//Here, I made an array of the song titles and gave them to a JList 
//for display. Do you think we should sort the songs? 
    songs = new String[list.getSize()]; 
    for (int i = 0; i < list.getSize(); i++) 
    { 
     songs[i] = list.get(i).getSongTitle(); 
    } 
    songList = new JList(songs); 

//Set the selection mode to single as I want to fill in fields with info on a clicked song. More on 
//that to come. 
    songList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
//Made a scroll bar(vertical and horizontal just in case) 
    scrollList = new JScrollPane(songList, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
     JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 


    text = new JTextArea(30, 30); 
    text.setText("This section will hold information about songs and somesuch."); 


    menuBar = new JMenuBar(); 
    menu = new JMenu("File"); 
    menuAdd = new JMenuItem("Add Song"); 
    menuAdd.addActionListener(new menuListener()); 
    menu.add(menuAdd); 
    menuBar.add(menu); 


    frame.setLayout(new Border()); 

    songList.addListSelectionListener(new ListSelectionListener() 
    { 
     public void valueChanged(ListSelectionEvent e) 
     { 

     int selectedVar; 
     selectedVar = songList.getSelectedIndex(); 
     text.setText(("Song Title: " + list.get(selectedVar).getSongTitle()) 
      + ("\nArtist: " + list.get(selectedVar).getArtistName()) 
      + ("\nPlayback Time: " + list.get(selectedVar).getPlayBackTime()) 
      + (" || Cost: " + list.get(selectedVar).getDownloadCost()) 
      + (" || Size: " + list.get(selectedVar).getFileSize())); 
     } 
    }); 

    } 


    public class Border extends JFrame implements LayoutManager 
    { 
    private static final long serialVersionUID = 1L; 
    private final int WINDOW_WIDTH = 400; 
    private final int WINDOW_HEIGHT = 300; 

    public Border() 
    { 
     super("MP3 Editor"); 
     setSize(WINDOW_WIDTH, WINDOW_HEIGHT); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     add(scrollList, BorderLayout.CENTER); 
     add(text, BorderLayout.SOUTH); 
     setJMenuBar(menuBar); 
     setVisible(true); 
    } 


    @Override 
    public void addLayoutComponent(String name, Component comp) 
    { 
     // TODO Auto-generated method stub 


    } 

    @Override 
    public void layoutContainer(Container parent) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public Dimension minimumLayoutSize(Container parent) 
    { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Dimension preferredLayoutSize(Container parent) 
    { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void removeLayoutComponent(Component comp) 
    { 
     // TODO Auto-generated method stub 

    } 
    } 

    public class menuListener extends JMenuItem implements ActionListener 
    { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

/*public menuListener() 
{ 
    menuItem.addActionListener(this); 
}*/ 

    public void actionPerformed(ActionEvent e) 
    { 
     MP3 aSong = getInfo(); 
     list.add(aSong); 
     songs = new String[list.getSize()]; 
     for (int i = 0; i < list.getSize(); i++) 
     { 
     songs[i] = list.get(i).getSongTitle(); 
     } 
     songList = new JList(songs); 
     scrollList = new JScrollPane(songList, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
      JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
     int index = 0; 
     songList.setSelectedIndex(index); 
     songList.ensureIndexIsVisible(index); 
    } 

    } 

    /** 
    * Input one set of MP3 file information and produce a report <br> 
    * <p/> 
    * <hr> 
    * Date created: Sep 22, 2010 <br> 
    * Date last modified: Sep 22, 2010 <br> 
    * <p/> 
    * <hr> 
    */ 

    public static MP3 getInfo() 
    { 

    // Gather all information using JOptionPane 
    String title = JOptionPane.showInputDialog(null, 
     "Enter Title: ", 
     mp3msg, 
     JOptionPane.QUESTION_MESSAGE); 
    String artist = JOptionPane.showInputDialog(null, 
     "Enter Artist: ", 
     mp3msg, 
     JOptionPane.QUESTION_MESSAGE); 
    int seconds = Integer.parseInt(JOptionPane.showInputDialog(null, 
     "Enter playback time in seconds: ", 
     mp3msg, 
     JOptionPane.QUESTION_MESSAGE)); 
    double cost = Double.parseDouble(JOptionPane.showInputDialog(null, 
     "Enter download cost: ", 
     mp3msg, 
     JOptionPane.QUESTION_MESSAGE)); 
    double size = Double.parseDouble(JOptionPane.showInputDialog(null, 
     "Enter file size in megabytes (MB): ", 
     mp3msg, 
     JOptionPane.QUESTION_MESSAGE)); 
    MP3 asong = new MP3(title, artist, seconds, cost, size); 
    return asong; 
    } 


} 
+1

Sie haben gerade den Code, was genau ist Ihre Frage? – yurib

+0

Wenn dies für die Schule ist, erwägen Sie, die Frage mit dem Hausaufgaben-Tag zu markieren. –

+0

Was ist die Frage? Du siehst das neue Lied nicht, nachdem du es zur Liste hinzugefügt hast? –

Antwort

0

die JList API lesen und dem Link zum secton in den Swing-Tutorial folgen „So verwenden Listen“, die ein Arbeits Beispiele für das Hinzufügen eines Wertes zu einer JList gibt, wenn eine Schaltfläche geklickt wird. Vergleichen Sie den Code mit dem Arbeitscode, um zu sehen, was der Unterschied ist.

1

Es gibt eine Reihe von kleinen Problemen mit Ihrem Code, aber ich denke, der wichtigste für Sie ist der Teil, in dem Sie eine neue MP3 im Action-Listener hinzufügen (der Teil, mit dem Sie gesagt haben, dass Sie Hilfe benötigen). Hier erstellen Sie eine brandneue JList und Sie überschreiben die vorherige JList, und Sie erstellen ein neues Bildlauffenster dafür, aber Sie nicht fügen Sie die neue JList zu Ihrer GUI, so dass die alte bleibt (und so nie zu sehen irgendwelche Veränderungen).

Idealerweise sollten Sie dieselbe Liste beibehalten und nur den Inhalt aktualisieren. Es gibt mehrere Möglichkeiten, dies zu tun, aber eine der einfachsten ist, einfach songList.setListData(songs) zu rufen. Oder, anstatt ein Array von Strings zu erstellen, erstellen Sie ein Vector, weil JLists auch mit Vektoren arbeiten.

Andere Probleme, die Sie vielleicht wollen, betrachten:

  • private JFrame frame; wird nie verwendet.
  • Ihre Klasse Border ist eine JFrame, wird aber auch als LayoutManager verwendet, was extrem verwirrend und falsch ist. Sie sollten das loswerden.

Persönlich würde ich Ihnen empfehlen, die GUI von Grund auf neu zu schreiben. Hier ist ein einfaches Beispiel mit einer funktionierenden JList für Sie zu untersuchen:

package examples; 

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.util.Vector; 

import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JOptionPane; 
import javax.swing.JScrollPane; 

public class GUI extends JFrame { 

    private final Vector<String> myVector = new Vector<String>(); 
    private final JList myList = new JList(); 

    public static void main(String... args) { 
     new GUI().setVisible(true); 
    } 

    public GUI() { 
     super("List"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 
     add(new JButton(new AddItemAction()), BorderLayout.NORTH); 
     add(new JScrollPane(myList), BorderLayout.CENTER); 
     pack(); 
    } 

    private class AddItemAction extends AbstractAction { 
     public AddItemAction() { 
      super("Add Item"); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      String newItem = JOptionPane.showInputDialog("Add a new item:"); 

      if (newItem != null) { 
       myVector.add(newItem); 
       myList.setListData(myVector); 
      } 
     } 
    } 

}