我想访问;标题“&引用;相册;,及;“艺术家”;变量在另一个类中,需要是一个什么来执行此操作?(在intellij中用javafx编写)

我想访问;标题“&引用;相册;,及;“艺术家”;变量在另一个类中,需要是一个什么来执行此操作?(在intellij中用javafx编写),java,class,variables,javafx,Java,Class,Variables,Javafx,这是包含变量的类 package sample; import java.io.*; public class Main { static String title; static String artist; static String album; public static void main(String[] args) { cheese(); String a=title; System.out.pr

这是包含变量的类

package sample;

import java.io.*;

public class Main {
    static String title;
    static String artist;
    static String album;

    public static void main(String[] args) {
        cheese();
        String a=title;
        System.out.println(a);
    }

    public static String cheese(){
        try {
            File song = new File("C:\\Users\\TheFishMoustache\\Music\\Indochine - L'aventurier.mp3");
            FileInputStream file = new FileInputStream(song);
            int size = (int) song.length();
            file.skip(size - 128);
            byte[] last128 = new byte[128];
            file.read(last128);
            String id3 = new String(last128);
            String tag = id3.substring(0, 3);
            if (tag.equals("TAG")) {
                title = id3.substring(3, 32);
                artist = id3.substring(33, 62);
                album = id3.substring(63, 91);
            } else {
                System.out.println(" does not contain information.");
            }
            file.close();
        } catch (Exception e) {
            System.out.println("Error - " + e.toString());
        }
    return (title+album+artist);
    }
}
在另一个类中,我有一个片段:

@FXML public TableView<Song> musiclist;
private ObservableList<Song> songs() {
    List list = new ArrayList();
    list.add(new Song("a","b","c"));
    ObservableList<Song> info = FXCollections.observableArrayList(list);
    return info;
}
@FXML public TableView musiclist;
私家歌曲(){
列表=新的ArrayList();
增加(新歌(“a”、“b”、“c”);
ObservableList info=FXCollections.observableArrayList(列表);
退货信息;
}

如果我想用“title”、“author”和“artist”变量替换“a”、“b”和“c”,那么我需要什么代码来执行此操作?

首先,您可以创建一个新类

public class SongLoader {

    private SongLoader() { }

    public static Song fromFile(String fileName) {

        File song = new File(fileName);
        String title, album, artist;

        // Your code here

        return new Song(title, album, artist);
    }
}
然后你的主要任务就是加载这个文件

public class Main {

    public static void main(String[] args) {
        Song s = SongLoader
            .fromFile("C:\\Users\\TheFishMoustache\\Music\\Indochine - L'aventurier.mp3");

        // For example, print values
        System.out.println(song.title);
    }
我想用“title”、“author”和“artist”变量替换“a”、“b”和“c”

package sample;

import java.io.*;

public class Main {
    static String title;
    static String artist;
    static String album;

    public static void main(String[] args) {
        cheese();
        String a=title;
        System.out.println(a);
    }

    public static String cheese(){
        try {
            File song = new File("C:\\Users\\TheFishMoustache\\Music\\Indochine - L'aventurier.mp3");
            FileInputStream file = new FileInputStream(song);
            int size = (int) song.length();
            file.skip(size - 128);
            byte[] last128 = new byte[128];
            file.read(last128);
            String id3 = new String(last128);
            String tag = id3.substring(0, 3);
            if (tag.equals("TAG")) {
                title = id3.substring(3, 32);
                artist = id3.substring(33, 62);
                album = id3.substring(63, 91);
            } else {
                System.out.println(" does not contain information.");
            }
            file.close();
        } catch (Exception e) {
            System.out.println("Error - " + e.toString());
        }
    return (title+album+artist);
    }
}
那没有道理

“a”、“b”和“c”被设置到
Song
对象的那些值中

List<Song> list = new ArrayList<>();
list.add(new Song("title","author","artist"));

实现这一点的最简单方法,也是公认的最佳实践,是对变量引用使用setter和getter

Main.java
中,将变量声明为
private

private String title;
private String artist;
private String album;
同样在
Main.java
中,提供用于访问这些变量的公共方法。这些被称为setter和getter,因为它们要么设置,要么获取该类外部的值

基本设定器

private void setTitle(String title) {
    this.title = title;
}
private String getTitle() {
    return this.title;
}
基本Getter

private void setTitle(String title) {
    this.title = title;
}
private String getTitle() {
    return this.title;
}
然后,从另一个类中,只需调用适当的getter即可检索这些值:

list.add(new Song(
    mainClass.getTitle();
    mainClass.getArtist();
    mainClass.getAlbum();
));
但是,我建议您对面向对象编程的基础知识多做一些研究,因为要想成功,这个概念是绝对必须掌握的


顺便说一句,IntelliJ可以为您创建setter和getter。只需将光标放在文件中所需的位置,然后按
Alt Insert
。同样,我建议在依赖IntelliJ创建代码之前,先了解IntelliJ创建代码的方式和原因。

避免使用
静态变量来传递数据。另外,因为您使用了
@FXML
注释,所以这个问题可能就是您实际需要的:但是如果我不使用,那么我就不能在Main()中调用cheese()类中使用,因为两者都在static@Némo Faucher,你有多个
主类吗?@NémoFaucher你可以学习更多关于OOP和Java的知识,但是
new main().cheese()
将允许您在方法不是静态的情况下调用该方法