Добавление listview к каждому элементу в listview?

#java #mysql #listview #javafx

#java #mysql #listview #javafx

Вопрос:

Я пытаюсь прикрепить listview к каждому из элементов в другом listview, и listview подключен к базе данных sql. Итак, вы выбираете значение в listview, и появляется другой listview. Но я не могу понять, как присоединить их к слушателю. Это то, что у меня есть до сих пор, надеюсь, вы понимаете мой вопрос. Он должен выглядеть так

 public static void main(String[] args) {
    launch(args);
}
private ArrayList<String> getArtister () {
    ArrayList<String> artister = new ArrayList<>();
    try (Connection conn = DriverManager.getConnection(
            "jdbc:mysql://vhost6.lnu.se:23306/1ik013v20-12?useSSL=false",
            "1ik013v20-12", "aubergine")) {
        Statement statement = conn.createStatement();
        ResultSet result = statement.executeQuery("SELECT Namn FROM artist");
        while (result.next()) {
            artister.add(result.getString(1));
        }
    } catch (SQLException ex) {
        System.out.println("Something went wrong...");
    }
    return artister;
}
private ArrayList<String> getLåtar () {
    ArrayList<String> låtar = new ArrayList<>();
    try (Connection conn = DriverManager.getConnection(
            "jdbc:mysql://vhost6.lnu.se:23306/1ik013v20-12?useSSL=false",
            "1ik013v20-12", "aubergine")) {
        Statement statement = conn.createStatement();
        ResultSet result = statement.executeQuery("SELECT Namn FROM album WHERE Artist = 'Bob Dylan'");
        while (result.next()) {
            låtar.add(result.getString(1));
        }
    } catch (SQLException ex) {
        System.out.println("Something went wrong...");
    }
    return låtar;
}


private ArrayList<String> getLåtar1 () {
    ArrayList<String> låtar = new ArrayList<>();
    try (Connection conn = DriverManager.getConnection(
            "jdbc:mysql://vhost6.lnu.se:23306/1ik013v20-12?useSSL=false",
            "1ik013v20-12", "aubergine")) {
        Statement statement = conn.createStatement();
        ResultSet result = statement.executeQuery("SELECT Namn FROM album WHERE Artist = 'Bob Marley'");
        while (result.next()) {
            låtar.add(result.getString(1));
        }
    } catch (SQLException ex) {
        System.out.println("Something went wrong...");
    }
    return låtar;
}
private ArrayList<String> getLåtar2 () {
    ArrayList<String> låtar = new ArrayList<>();
    try (Connection conn = DriverManager.getConnection(
            "jdbc:mysql://vhost6.lnu.se:23306/1ik013v20-12?useSSL=false",
            "1ik013v20-12", "aubergine")) {
        Statement statement = conn.createStatement();
        ResultSet result = statement.executeQuery("SELECT Namn FROM album WHERE Artist = 'Bob Marley'");
        while (result.next()) {
            låtar.add(result.getString(1));
        }
    } catch (SQLException ex) {
        System.out.println("Something went wrong...");
    }
    return låtar;
}
private ArrayList<String> getLåtar3 () {
    ArrayList<String> låtar = new ArrayList<>();
    try (Connection conn = DriverManager.getConnection(
            "jdbc:mysql://vhost6.lnu.se:23306/1ik013v20-12?useSSL=false",
            "1ik013v20-12", "aubergine")) {
        Statement statement = conn.createStatement();
        ResultSet result = statement.executeQuery("SELECT Namn FROM album WHERE Artist = 'Bob Marley'");
        while (result.next()) {
            låtar.add(result.getString(1));
        }
    } catch (SQLException ex) {
        System.out.println("Something went wrong...");
    }
    return låtar;
}

@Override
public void start(Stage primaryStage) {
    BorderPane pane = new BorderPane();
    ListView art = new ListView();
    art.getItems().addAll(getArtister());
    ListView alb = new ListView();
    ListView alb1 = new ListView();
    ListView alb2 = new ListView();
    ListView alb3 = new ListView();


    art.getSelectionModel().selectedIndexProperty().addListener(ov -> {

    });

    Text text = new Text("MUSIK");
    text.setFont(new Font(20));
    text.setFill(Color.DARKBLUE);
    pane.setLeft(art);
    pane.setTop(text);
    BorderPane.setAlignment(art, Pos.CENTER_LEFT);
    BorderPane.setAlignment(text, Pos.TOP_LEFT);

    Scene scene = new Scene(pane, 500, 500);
    primaryStage.setTitle("Musiken");
    primaryStage.setScene(scene);
    primaryStage.show();
}
 

}

Комментарии:

1. всегда используйте латинские символы при именовании ваших методов и переменных

2. извините, новичок в программировании!

3. не беспокойтесь. кстати, ваш подход кажется немного необычным. Вы хотите иметь 4 разных списка для 4 разных исполнителей, верно? Что, если у вас есть 100 исполнителей? Вы должны мыслить немного динамичнее. У вас может быть одна коллекция в виде пары<String,String>, тогда как первая строка — исполнитель, а вторая строка — альбом.

4. Хорошо, я понимаю. Мне не нужно иметь 4 разных списка, это как раз то место, где я был в данный момент. Первоначальная идея состояла в том, чтобы иметь два списка: один с артистами, а другой с песнями артистов. И исполнитель, которого я нажал в списке (исполнитель), определил, что должен был показывать другой список.

5. Сработало ли решение?

Ответ №1:

Хорошо, попробуйте это. Создайте новый класс, как показано ниже

 private class Vinyl
{
    String artist;
    List<String> listAlbums;
    
    public Vinyl(String artist) {
        this.artist = artist;
        listAlbums = new ArrayList<String>();
    }
    
    public void AddToListAlbums(String album)
    {
        listAlbums.add(album);
    }

    public String getArtist() {
        return artist;
    }

    public List<String> getListAlbums() {
        return listAlbums;
    }               
}
 

Я только что назвал его Vinyl. Вы можете назвать это как угодно.

Теперь, возвращаясь к вашему основному классу, определите список Vinyl глобально. Вызывайте эти методы только для заполнения вашего списка.

 List<Vinyl> listVinyl = new ArrayList<>();  

private void GetArtists () {
    
    try (Connection conn = DriverManager.getConnection(
            "jdbc:mysql://vhost6.lnu.se:23306/1ik013v20-12?useSSL=false",
            "1ik013v20-12", "aubergine")) {
        Statement statement = conn.createStatement();
        ResultSet result = statement.executeQuery("SELECT Namn FROM artist");
        while (result.next()) {
            listVinyl.add(new Vinyl(result.getString(1))); 
        }
    } catch (SQLException ex) {
        System.out.println("Something went wrong...");
    }        
}   

private void GetAlbums () {      
    try (Connection conn = DriverManager.getConnection(
            "jdbc:mysql://vhost6.lnu.se:23306/1ik013v20-12?useSSL=false",
            "1ik013v20-12", "aubergine")) {
        Statement statement = conn.createStatement();
        ResultSet result = statement.executeQuery("SELECT Namn FROM album");
        
        Vinyl currentVinyl;
        String album = "";
        
        while (result.next()) {
            
            String artist = result.getString(1); // TODO you must correct the number. I don't know which field is it.
            
            currentVinyl = listVinyl.stream()
                    .filter(u -> u.artist.equals(artist))
                    .findAny()
                    .orElse(null);
            
            album = result.getString(2); // TODO you must correct the number. I don't know which field is it.               
            
            currentVinyl.AddToListAlbums(album);                
        }
    } catch (SQLException ex) {
        System.out.println("Something went wrong...");
    }
}
 

Пожалуйста, будьте осторожны, для вас есть 2 задачи. Это ваши индексы полей. Я не знаю структуру вашей базы данных, поэтому я просто написал 1 и 2. Это должны быть поля имени вашего исполнителя и названия альбома.

В конце у вас будет только 1 коллекция, которая охватывает все, что вам нужно.

Комментарии:

1. Пожалуйста. Пожалуйста, дайте мне знать, если это сработает.

2. соглашения об именовании Java, пожалуйста