Java GUI重新绘制JPanel JFrame的问题

Java GUI重新绘制JPanel JFrame的问题,java,user-interface,jframe,jtextarea,repaint,Java,User Interface,Jframe,Jtextarea,Repaint,计划是让程序在搜索另一首歌曲时,用不同的歌词替换屏幕上的歌词 }public void lyricPrinter(){ if(scroll != null){ scroll.removeAll(); //--> temporary test System.out.println("removed scroll"); scroll.repaint(); } JTextArea textarea = new JTextArea(lyrics);

计划是让程序在搜索另一首歌曲时,用不同的歌词替换屏幕上的歌词

}public void lyricPrinter(){
    if(scroll != null){
    scroll.removeAll(); //--> temporary test
    System.out.println("removed scroll");
    scroll.repaint();
    }

    JTextArea textarea = new JTextArea(lyrics);
    textarea.setBackground(Color.LIGHT_GRAY);
    textarea.setEditable(false);


    scroll = new JScrollPane (textarea,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

    GUI.frame.remove(scroll);
    GUI.frame.add(scroll);
    GUI.frame.setVisible(true);




}
我原以为使用removeall()就可以了,但最终还是发生了

第一次打印歌词。。 在我更改歌词并尝试替换以前的歌词之后。。

  • 为什么要添加和删除组件?这是一种倒退和危险的方式来实现你的目标
  • 即使你的计划还可以,你也不会在任何地方删除原来的JScrollPane。此调用,
    GUI.frame.remove(滚动),删除新的JScrollPane,该窗格尚未添加,而不是当前驻留在GUI中的旧窗格
  • 相反,为什么不集中精力保存组件并交换它们所持有的数据——它们的文本?这就是我要做的,也是我强烈推荐的
  • 您的
    GUI.frame….
    调用表明您可能错误地使用了静态字段。JFrame不应该由静态字段保存,除非您不关心数据和行为的封装

编辑
我推荐的是

  • 你有一个JTextArea字段,一个保存歌词文本的字段
  • 它是类中的非静态字段,在整个类中可见,因为它不是在构造函数或方法中声明的
  • 在您要交换歌词的事件代码中,只需对这个JTextArea变量调用
    setText(…)
    ,传入一个包含新歌词的字符串

假设你有一个名为songLyricsTextArea的JTextArea,要交换文本,你所要做的就是

String newLyrics = somehowGetNewLyricsToSong(); 
songLyricsTextArea.setText(newLyrics);
例如,在下面的演示程序中,我阅读了JavaSwing教程中的几个演示程序的java代码。我将程序名放在右侧的JList中,并给JList一个ListSelectionListener,它交换JTextArea(这里称为programTextArea)中的文本,类似于我建议您执行的操作。我的演示中的关键代码在此处的侦听器中:

  demoList.addListSelectionListener(new ListSelectionListener() {

     @Override    // a new program has been selected
     public void valueChanged(ListSelectionEvent e) {
        if (!e.getValueIsAdjusting()) {
           if (demoList.getSelectedIndex() != -1) { // make sure selection valid
              DemoProgram demoProgram = demoList.getSelectedValue(); // get selection
              programTextArea.setText(demoProgram.getText());  // get text and pass into text area
           }
        }
     }
  });
因此,您应该编译并运行整个程序以了解其工作原理:

import java.awt.BorderLayout;
import java.io.IOException;
import java.net.URL;
import java.util.Scanner;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

@SuppressWarnings("serial")
public class SwapTextExample extends JPanel {
   private static final String[][] DEMO_PROGS = {
         {     "BorderDemo.java",
               "http://docs.oracle.com/javase/tutorial/uiswing/examples/"
                     + "components/BorderDemoProject/src/components/BorderDemo.java" },
         {     "ButtonDemo.java",
               "http://docs.oracle.com/javase/tutorial/uiswing/examples/"
                     + "components/ButtonDemoProject/src/components/ButtonDemo.java" },
         {     "ButtonHtmlDemo.java",
               "http://docs.oracle.com/javase/tutorial/uiswing/examples/"
                     + "components/ButtonHtmlDemoProject/src/components/ButtonHtmlDemo.java" },
         {     "CheckBoxDemo.java",
               "http://docs.oracle.com/javase/tutorial/uiswing/examples/"
                     + "components/CheckBoxDemoProject/src/components/CheckBoxDemo.java" },
         {     "ComboBoxDemo.java",
               "http://docs.oracle.com/javase/tutorial/uiswing/examples/"
                     + "components/ComboBoxDemoProject/src/components/ComboBoxDemo.java" }, };

   private DefaultListModel<DemoProgram> model = new DefaultListModel<>();
   private JList<DemoProgram> demoList = new JList<DemoProgram>(model);
   private JTextArea programTextArea = new JTextArea(40, 70);

   public SwapTextExample() throws IOException {
      for (String[] demoProgText : DEMO_PROGS) {
         String name = demoProgText[0];
         String link = demoProgText[1];
         URL url = new URL(link);
         Scanner scanner = null;
         try {
            scanner = new Scanner(url.openStream());
            StringBuilder sb = new StringBuilder();
            while (scanner.hasNextLine()) {
               sb.append(scanner.nextLine() + "\n");
            }
            String text = sb.toString();
            DemoProgram demoProg = new DemoProgram(name, link, text);
            model.addElement(demoProg);
         } finally {
            if (scanner != null) {
               scanner.close();
            }
         }

      }

      demoList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
      demoList.addListSelectionListener(new ListSelectionListener() {

         @Override    // a new program has been selected
         public void valueChanged(ListSelectionEvent e) {
            if (!e.getValueIsAdjusting()) {
               if (demoList.getSelectedIndex() != -1) { // make sure selection valid
                  DemoProgram demoProgram = demoList.getSelectedValue(); // get selection
                  programTextArea.setText(demoProgram.getText());  // get text and pass into text area
               }
            }
         }
      });

      setLayout(new BorderLayout());
      add(new JScrollPane(demoList), BorderLayout.WEST);
      add(new JScrollPane(programTextArea), BorderLayout.CENTER);
   }

   private static void createAndShowGui() {
      SwapTextExample mainPanel;
      try {
         mainPanel = new SwapTextExample();
         JFrame frame = new JFrame("Swap Text Example");
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.getContentPane().add(mainPanel);
         frame.pack();
         frame.setLocationByPlatform(true);
         frame.setVisible(true);
      } catch (IOException e) {
         e.printStackTrace();
      }

   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class DemoProgram {
   private String name;
   private String link;
   private String text;

   public DemoProgram(String name, String link, String text) {
      this.name = name;
      this.link = link;
      this.text = text;
   }

   public String getName() {
      return name;
   }

   public String getLink() {
      return link;
   }

   public String getText() {
      return text;
   }

   @Override
   public String toString() {
      return name;
   }
}
导入java.awt.BorderLayout;
导入java.io.IOException;
导入java.net.URL;
导入java.util.Scanner;
导入javax.swing.*;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
@抑制警告(“串行”)
公共类SwapTextExample扩展了JPanel{
私有静态最终字符串[][]演示程序={
{“BorderDemo.java”,
"http://docs.oracle.com/javase/tutorial/uiswing/examples/"
+“components/BorderDemoProject/src/components/BorderDemo.java”},
{“ButtonDemo.java”,
"http://docs.oracle.com/javase/tutorial/uiswing/examples/"
+“components/buttonemoproject/src/components/buttonemo.java”},
{“ButtonHtmlDemo.java”,
"http://docs.oracle.com/javase/tutorial/uiswing/examples/"
+“components/buttonhtmlemoproject/src/components/buttonhtmlemo.java”},
{“CheckBoxDemo.java”,
"http://docs.oracle.com/javase/tutorial/uiswing/examples/"
+“components/CheckBoxDemoProject/src/components/CheckBoxDemo.java”},
{“ComboBoxDemo.java”,
"http://docs.oracle.com/javase/tutorial/uiswing/examples/"
+“components/ComboBoxDemoProject/src/components/ComboxDemo.java”},};
私有DefaultListModel=new DefaultListModel();
私有JList demoList=新JList(型号);
私有JTextArea programTextArea=新的JTextArea(40,70);
public SwapTextExample()引发IOException{
对于(字符串[]demoProgText:DEMO_PROGS){
字符串名称=demoProgText[0];
字符串链接=demoProgText[1];
URL=新的URL(链接);
扫描器=空;
试一试{
scanner=newscanner(url.openStream());
StringBuilder sb=新的StringBuilder();
while(scanner.hasNextLine()){
sb.append(scanner.nextLine()+“\n”);
}
字符串text=sb.toString();
DemoProgram demoProg=新的DemoProgram(名称、链接、文本);
模型.加法(demoProg);
}最后{
如果(扫描器!=null){
scanner.close();
}
}
}
demoList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
demoList.addListSelectionListener(新的ListSelectionListener(){
@覆盖//已选择新程序
public void值已更改(ListSelectionEvent e){
如果(!e.getValueIsAdjusting()){
如果(demoList.getSelectedIndex()!=-1){//请确保选择有效
DemoProgram DemoProgram=demoList.getSelectedValue();//获取选择
programTextArea.setText(demoProgram.getText());//获取文本并传递到文本区域
}
}
}
});
setLayout(新的BorderLayout());
添加(新的JScrollPane(demoList),BorderLayout.WEST);
添加(新的JScrollPane(programTextArea),BorderLayout.CENTER);
}
私有静态void createAndShowGui(){
SwapTextExample主面板;
试一试{
mainPanel=新的SwapTextExample();
JFrame=新JFrame(“交换文本示例”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}捕获(IOE异常){
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGui();
}
});
}
}
班级演示计划{
私有字符串名称;
私有字符串
}public void lyricPrinter(){
    if(scroll != null){
    //scroll.removeAll(); //--> temporary test
    //System.out.println("removed scroll");
    //scroll.repaint();
    GUI.frame.remove(scroll);
    }

    JTextArea textarea = new JTextArea(lyrics);
    textarea.setBackground(Color.LIGHT_GRAY);
    textarea.setEditable(false);


    scroll = new JScrollPane (textarea,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);


    GUI.frame.add(scroll);
    GUI.frame.setVisible(true);




}