如何从我的内部类引用“显示”变量,以在我的JLabel中使用外部类
我想将文本输入到第四个JPanel中,并且每次按Enter键以更新带有文本的第一个JPanel 。我为返回键添加了一个keylistener,它在内部类AddSong中运行一个函数,该函数接受一个文本的数组列表,并返回一个字符串。我想在第一个quadrent中的JPanel上显示该字符串,但它不起作用。现在我相信这是删除第一个JPanel,而不是更新。我很困惑,因为这是我第一次遇到关键事件,因为我是编程新手。如何从我的内部类引用“显示”变量,以在我的JLabel中使用外部类
下面的代码:
public class MusicPlayer extends JFrame{
private static final int WIDTH = 400;
private static final int HEIGHT = 400;
private JLabel songList,songPlaying,c;
private JTextField enterSong;
private AddSong input;
public MusicPlayer(){
//Text box enterSong, input passed to actionListener
input = new AddSong();
enterSong = new JTextField(10);
enterSong.addActionListener(input);
//Numbers the quadrents
songList = new JLabel(input.printSongs(input.songList),SwingConstants.CENTER);
songPlaying = new JLabel("2",SwingConstants.CENTER);
c = new JLabel("c",SwingConstants.CENTER);
//Makes and sets size of pane
Container pane = getContentPane();
pane.setLayout(new GridLayout(2,2));
//Add JLabels to panes in the container
pane.add(songList);
pane.add(songPlaying);
pane.add(c);
pane.add(enterSong);
//KeyListener - return
addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent ke){}
@Override
public void keyReleased(KeyEvent ke){}
@Override
public void keyTyped(KeyEvent ke){
if(ke.getKeyCode()==KeyEvent.VK_ENTER){
input.printSongs(input.songList);
}
}
});
add(songList);
pack();
setTitle("Andrew's Music Player");
setSize(WIDTH,HEIGHT);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public class AddSong implements ActionListener{
//List of Songs
ArrayList<String> songList = new ArrayList<String>();
String display;
public AddSong(){
display = "";
}
public void actionPerformed(ActionEvent e){
String song;
//get the text
song = enterSong.getText();
//add current text string to list
songList.add(song);
//print songlist
System.out.print(printSongs(songList));
}
public String printSongs(ArrayList<String> songList){
display = "";
for(int i = 0; i < songList.size(); i++){
display += songList.get(i) + "\n";
}
return display;
}
}
public static void main(String args[]){
MusicPlayer boi = new MusicPlayer();
}
}
欢迎来到SO。有一个动作监听器,你可以放下监听器。
请注意评论:
public class MusicPlayer extends JFrame{
private static final int WIDTH = 400;
private static final int HEIGHT = 400;
private JLabel songsList,songPlaying,c;
private JTextField enterSong;
private AddSong input;
public MusicPlayer(){
//Text box enterSong, input passed to actionListener
input = new AddSong();
enterSong = new JTextField(10);
enterSong.addActionListener(input);
//Numbers the quadrents
songsList = new JLabel("No songs in list",SwingConstants.CENTER);
songPlaying = new JLabel("2",SwingConstants.CENTER);
c = new JLabel("c",SwingConstants.CENTER);
//Makes and sets size of pane
Container pane = getContentPane();
pane.setLayout(new GridLayout(2,2));
//Add JLabels to panes in the container
pane.add(songsList);
pane.add(songPlaying);
pane.add(c);
pane.add(enterSong);
//adding a key listenr to the Jframe is not need
//the enterSong.addActionListener(input); does the work
add(songsList);
pack();
setTitle("Andrew's Music Player");
setSize(WIDTH,HEIGHT);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public class AddSong implements ActionListener{
//List of Songs
ArrayList<String> songList = new ArrayList<>();
public AddSong(){ }
@Override
public void actionPerformed(ActionEvent e){
String song;
//get the text
song = enterSong.getText();
//add current text string to list
songList.add(song);
String songListAsString = printSongs(songList);
//update display with new song
songsList.setText(songListAsString);
//clear text field
enterSong.setText("");
}
public String printSongs(ArrayList<String> songList){
//using string builder is more efficient
//to have multiple lines in a JLabel you have to use
//html tags
//a JList would be more appropriiate
StringBuilder sb = new StringBuilder("<html>");
for(int i = 0; i < songList.size(); i++){
sb.append("<p>")
.append(songList.get(i))
.append("</p>");
}
sb.append("</html>");
return sb.toString();
}
}
public static void main(String args[]){
MusicPlayer boi = new MusicPlayer();
}
}
非常感谢,这解决了我的问题! –
要访问你需要创建它的一个实例,它持有该变量的具体值类的变量。另一方面,addSong.display
会尝试访问不带cocrete实例的变量。这只适用于静态变量。
您已经在几行后面创建了addSong
的实例 input = new addSong();
从这个实例中,您可以访问display
变量。接下来的问题是,如果它已经具有正确的值,或者您需要首先执行某些代码才能正确初始化该值。
请仅使用以Java中的大写字母开头的类名称,并尝试将名词用作类名称。
它尚未具有正确的值,我将如何正确地初始化该值? –
我真的不明白你需要这个'display '变量,它应该足够用于计算'actionPerformed'中的文本,并将它放在'JLabel'' songList'。 –
请告诉我们你得到的错误是哪一行。 (并且不要给我们一个行号,这不足以让我们知道哪一行导致错误。) – ajb
我在读取“songList = new JLabel(addSong。显示,SwingConstants.CENTER);在音乐播放器类的音乐播放器功能 –