![](/img/trans.png)
[英]How do I pass a reference to the outer class to a method in an inner class? ( Or how do I pass “this” to an inner class? )
[英]How do I reference the “display” variable from my inner class, to use in the outer class in my JLabel
我想在第四個JPanel中輸入文本,每當我按下Enter鍵時,就用文本更新第一個JPanel。 我為返回鍵添加了一個鍵偵聽器,它在內部類AddSong中運行一個函數,該函數接收文本數組列表,並返回一個字符串。 我想在第一象限中在JPanel上顯示該字符串,但是它不起作用。 現在,我相信它正在刪除第一個JPanel,而不是更新。 我很困惑,因為這是我第一次接觸關鍵事件,因為我是編程新手。
這是代碼:
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();
}
}
要訪問類的變量,您需要創建它的實例,該實例保存該變量的具體值。 另一方面, addSong.display
嘗試在沒有具體實例的情況下訪問變量。 僅靜態變量允許這樣做。
幾行后,您已經在創建addSong
的實例input = new addSong();
在此實例中,您可以訪問display
變量。 然后的問題是,是否已經具有正確的值,或者是否需要先執行一些代碼才能正確初始化該值。
並且請僅使用Java中以大寫字母開頭的類名,並嘗試使用名詞作為類名。
歡迎來到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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.