#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, пожалуйста