gpt4 book ai didi

java - Java GUI 重画 JPanel JFrame 的问题

转载 作者:行者123 更新时间:2023-12-01 23:13:58 24 4
gpt4 key购买 nike

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

}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()可以解决问题,但最终发生了这种情况..

第一次打印歌词.. printing lyrics for the first time..当我更改歌词并尝试替换之前的歌词后.. After I change the lyrics and try to replace the previous lyrics..

最佳答案

  • 为什么要添加和删除组件?这是实现目标的一种倒退且危险的方式。
  • 即使您的计划没问题,您实际上也不会在任何地方删除原始的 JScrollPane。此调用 GUI.frame.remove(scroll); 删除了 JScrollPane,即尚未添加的 JScrollPane,而不是旧的 JScrollPane当前驻留在 GUI 中。
  • 相反,为什么不集中精力保留组件并交换它们所保存的数据——它们的文本?这就是我会做的,也是我强烈推荐的。
  • 您的 GUI.frame.... 调用表明您可能误用了静态字段。您的 JFrame 不应由静态字段保存,除非您不关心维护数据和行为的封装。
<小时/>

编辑
我推荐的是

  • 您有一个 JTextArea 字段,用于保存歌词文本,
  • 它是类中的非静态字段,在整个类中可见,因为它不是在构造函数或方法内部声明的。
  • 在您想要交换歌词的事件代码中,您只需对此 JTextArea 变量调用 setText(...),并传入包含新歌词的字符串即可。
<小时/>

假设您有一个名为 SongLyricsTextArea 的 JTextArea,要交换文本,您要做的就是

String newLyrics = somehowGetNewLyricsToSong(); 
songLyricsTextArea.setText(newLyrics);

例如,在下面的演示程序中,我读入了 Java Swing 教程中的几个演示程序的 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 - Java GUI 重画 JPanel JFrame 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21505895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com