2017-03-17 22 views
0

的我有以下兩個類,其目的basical創建對象的數組...數組對象到JList和JList的到的JPanel

class MovieInfo 
    { private String movieTitle; 
     private String movieRating; 
     private String movieImg; 
     private String movieShowTimes; 
     private static double adultPrice; 
     private static double childPrice; 
    MovieInfo(String title, String rating, String img, String showTimes) 
     { 
     movieTitle = title; 
      movieRating = rating; 
     movieImg = img; 
     movieShowTimes = showTimes; 

     } 
    /*....sets gets methods.... */ 
    } 

    /////////////////////////////// 
    class MovieList 
    { 

     MovieInfo[] mList; 

     public void createList() 
     { 

     mList = new MovieInfo[22]; 

     mList[0] = new MovieInfo("A United Kingdom","PG","A_United_Kingdom.jpg","yyyn"); 
    mList[1] = new MovieInfo("Amitiville The Awakening","18A","AmitivilleAwakening.jpg","yyyn"); 
    mList[2] = new MovieInfo("Arrival","14A","arrival.jpg","yyyy"); 
    mList[3] = new MovieInfo("Baywatch","14A","baywatch.jpg","yyyy"); 
    mList[4] = new MovieInfo("Beauty and the Beast","PG","Beauty_and_the_Beast.jpg","yyyn"); 
    } 
} 

我也有JList中其附接到的JPanel和單選按鈕.. 而我的問題是,我無法得到如何顯示從這個JList的mList [0]的電影名稱,當我點擊1st rbutton,從mList [1]的電影名稱,當我點擊第二rbutton等...

是的我知道我需要爲我的rbuttons註冊監聽器並對它們進行分組並添加ItemStateChange(只是不想在此添加太多的代碼)......我在問這裏關於邏輯線後

if(e.getSource() instanceof JRadioButton) 
    { 

請幫忙!任何想法將不勝感激!

+1

*「只是不想在這裏添加太多的代碼」 *然後,它是更好地張貼有效的[MCVE]或[短,實現C保留,正確的例子](http://sscce.org/),說明你的問題。而不是代碼片段或整個代碼:)但是,我會使用[Card Layout](https://docs.oracle.com/javase/tutorial/uiswing/layout/card.html)或者[JTable](https ://docs.oracle.com/javase/tutorial/uiswing/components/table.html)這將更好地顯示所有信息一次 – Frakcool

+0

事情是,我不需要顯示所有(movieTitle; movieRating; movieImg; movieShowTimes; adultPrice ..)信息。我只需要movieTitle,我只需要使用JList。但是,謝謝你的回覆:) – Sofi

回答

2

您可以編寫自定義CellRenderer,如docs中所示。

例如,有一個Movie豆和延伸MoviesListCellRendererDefaultListCellRenderer你可以用這樣的事情結束了:

public class JListCards { 
    private JFrame frame; 
    private JPanel radiosPane; 
    private JRadioButton[] radios; 
    private String[] radiosNames = {"Movie", "Classification", "Price"}; 
    private JList <Movie> moviesList; 
    private ButtonGroup group; 

    private Movie[] movies = new Movie[] { 
     new Movie("Happy Feet", "AA", 10), 
     new Movie("Star Wars", "B12", 15), 
     new Movie("Logan", "C", 20) 
    }; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> new JListCards().createAndShowGui()); 
    } 

    public void createAndShowGui() { 
     frame = new JFrame(getClass().getSimpleName()); 

     radiosPane = new JPanel(new GridLayout(1, 3)); 
     radios = new JRadioButton[3]; 
     group = new ButtonGroup(); 

     for (int i = 0; i < radios.length; i++) { 
      radios[i] = new JRadioButton(radiosNames[i]); 
      radios[i].addActionListener(listener); 
      radiosPane.add(radios[i]); 
      group.add(radios[i]); 
     } 

     radios[0].setSelected(true); 
     moviesList = new JList<Movie>(movies); 
     moviesList.setCellRenderer(new MoviesListCellRenderer(0)); 

     frame.add(moviesList); 
     frame.add(radiosPane, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    ActionListener listener = new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      for (int i = 0; i < radios.length; i++) { 
       if (e.getSource().equals(radios[i])) { 
        moviesList.setCellRenderer(new MoviesListCellRenderer(i)); 
        break; 
       } 
      } 
     } 
    }; 

    class MoviesListCellRenderer extends DefaultListCellRenderer { 
     private int attribute; 

     public MoviesListCellRenderer(int attribute) { 
      this.attribute = attribute; 
     } 

     @Override 
     public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
      if (value instanceof Movie) { 
       Movie movie = (Movie) value; 
       switch (attribute) { 
        case 0: 
         setText(movie.getMovieName()); 
         break; 
        case 1: 
         setText(movie.getClassification()); 
         break; 
        default: 
         setText(String.valueOf(movie.getPrice())); 
         break; 
       } 
      } 
      return this; 
     } 
    } 

    class Movie { 
     private String movieName; 
     private String classification; 
     private double price; 

     public Movie(String movieName, String classification, double price) { 
      super(); 
      this.movieName = movieName; 
      this.classification = classification; 
      this.price = price; 
     } 

     public String getMovieName() { 
      return movieName; 
     } 
     public void setMovieName(String movieName) { 
      this.movieName = movieName; 
     } 
     public String getClassification() { 
      return classification; 
     } 
     public void setClassification(String classification) { 
      this.classification = classification; 
     } 
     public double getPrice() { 
      return price; 
     } 
     public void setPrice(double price) { 
      this.price = price; 
     } 
    } 
} 

正如你所看到的,改變選擇基於無線電的單元格渲染器,這代碼仍然可以改進,但應該給你一個想法:

enter image description here

+0

(1+) - 比我的回答更有意義 – camickr

+0

@camickr然而當我讀到你的(刪除的)答案時,它讓我想到OP在問什麼......如果像這樣或類似你思維 – Frakcool