繁体   English   中英

到JList的对象数组和到JPanel的JList

[英]Array of Objects to JList and JList to 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");
  }
} 

我还具有连接到JPanel和单选按钮的JList。我的问题是,当我单击第一个rbutton(即来自mList的电影名称)时,无法从该JList上的mList [0]中显示电影的名称[1]当我单击第二个rbutton等时...

是的,我知道我需要为我的rbutton注册侦听器并将其分组并添加ItemStateChange(只是不想在此处添加太多代码)...我在这里询问有关

    if(e.getSource() instanceof JRadioButton)
   { 

请帮忙! 任何想法将不胜感激!

您可以编写自定义CellRenderer,如docs中所示。

例如,拥有一个Movie Bean和一个扩展DefaultListCellRendererMoviesListCellRenderer ,您可能会得到如下所示的结果:

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;
        }
    }
}

如您所见,可以根据所选的无线电更改单元格渲染器,此代码仍可以改进,但应为您提供一个思路:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM