【发布时间】:2013-07-26 15:38:11
【问题描述】:
因此,当字符串等于某个值时,我希望从JFrame 中删除所有内容,但是当我调用removeAll(); 后跟revalidate(); 和repaint(); 时,它不会改变任何内容。
我尝试按照here 的指示拨打getContentPane.removeAll();,但没有任何效果。
我的代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class MTGSAMPServerReference extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private static JList list1;
private static JButton select1;
public static String selectionMenu = "Main";
public MTGSAMPServerReference() {
this.getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING));
Object[]mainMenu = {"Vehicles", "Bikes/Bicycles", "Boats", "Houses", "Businesses", "Objects", "Jobs", "Ranks", "Licenses", "VIP", "FAQ's"};
Object[]VehiclesValueMenu = {"Lower Class", "Upper Class", "VIP"};
if ("Main".equals(selectionMenu)) {
JPanel controls = new JPanel(new BorderLayout(5,5));
list1 = new JList<Object>(mainMenu);
list1.setVisibleRowCount(10);
select1 = new JButton("Select");
select1.addActionListener(this);
controls.add(new JScrollPane(list1));
controls.add(select1, BorderLayout.PAGE_END);
controls.setBorder(new EmptyBorder(25,25,0,0));
add(controls);
revalidate();
repaint();
}
if ("VehiclesValue".equals(selectionMenu)) {
removeAll();
revalidate();
repaint();
}
}
@Override
public void actionPerformed(ActionEvent e) {
if ("Main".equals(selectionMenu)) {
if (e.getActionCommand().equals("Select")) {
int indexMain = list1.getSelectedIndex();
System.out.println("Index Selected: " + indexMain);
String valueMain = (String) list1.getSelectedValue();
System.out.println("Value Selected: " + valueMain);
if ("Vehicles".equals(valueMain)) {
selectionMenu = "VehiclesValue";
System.out.println("Menu selected: " + selectionMenu);
revalidate();
repaint();
}
}
}
}
public void createAndShowGUI() {
JFrame f = new MTGSAMPServerReference();
f.pack();
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//f.add(new drawOnPanel());
f.setSize(1200, 800);
f.setLocationRelativeTo(null);
list1.setSize(250, 250);
list1.setLocation(0, 0);
select1.setSize(75, 25);
select1.setLocation(251, 276);
MTGSAMPServerReference.this.repaint();
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
MTGSAMPServerReference gui = new MTGSAMPServerReference();
gui.createAndShowGUI();
}
});
}
}
我已经完成了研究,但无法弄清楚我做错了什么。
如果我尝试更改我的JFrame f to a Global Variable instead of a Local Variable,它不会显示任何开头的内容。
是的,我知道我是mixing Commmand Line with GUI,但那是only for debugging purposes。完成后,我将简单地删除所有Command Line related。
无论如何,对我的问题有什么想法吗?
提前致谢!
【问题讨论】:
-
static变量很好地表明了糟糕的设计 -
为此,我会使用
CardLayout,如short example所示。 -
通过容器实例
-
list1和select1不必是static,因为它们应该属于MTGSAMPServerReference的单个实例。selectionMenu不必是static,因为它可以作为参数传递给MTGSAMPServerReference构造函数。如果您需要访问JList或JButton包含的值,则应根据需要提供 getter 和 setter。如果可以避免,则应避免将子组件暴露给外界,因为这意味着其他人会突然控制您的整个组件,并且可以做您无法阻止的事情 -
“一旦你批评了我的代码,你介意提供一个解决方案吗?” 我不认为这是一个很有帮助的评论。 1) 提供建议的人可能不知道答案,但仍然能够识别会导致问题的代码(我同意使用
static- 如果有的话,这很少是解决方案)。 2) 修复他们指出的问题实际上可能成为解决方案,或者 90% 的解决方案,并且.. 3) 它听起来像是“除非你打算提供答案,不要批评我的代码'。通常,当人们“将代码撕成碎片”时,他们会把你的最大利益放在心上。
标签: java swing jframe components removeall