我在弄一个相册.点击菜单文件->新建,跳出一个新建相册的对话框,这里一切正常,对话框界面是;
1.JLabel:新建相册名称
2.JTextField:供用户输入相册名称
3.JLabel:相册文件夹
4.JTextField和一个“浏览”JButton,供用户选择文件夹(为简化代码,我未贴出此实现代码)
5.对话框低下一个 确定 按钮,一个  取消  按钮.
点击确定后关闭新建对话框.至此,仍一切正常.问题就出现在下面了:
当我再次点击新建时,新建对话框弹出,但是对话框里却意外地自动多了一个JTextFiled,是供用户输入相册名称的JTextField并且布局已经被破坏了,底下还自动多了一个 确定 的按钮,至此,确定按钮意外地自动变为两个了.再确定,关闭对话框后,再打开,供用户输入相册名称的JTextField变为三个了.....如此循环,JTextField会越变越多,这是为什么呀??????代码如下:import javax.swing.JFrame;//main类
public class BRMain {
public static final String BEADROLL_TITLE = "相册";
public static void main(String []args){
BeadrollFrame brf = new BeadrollFrame(BEADROLL_TITLE);
brf.setVisible(true);
brf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//框架类
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class BeadrollFrame extends JFrame implements ActionListener {
public static final String fileStr = "文件(F)";
public static final String newStr = "新建(N)";
public static final String exitStr = "退出(X)"; private JMenuBar menuBar = new JMenuBar();
private JMenu mFile = new JMenu(fileStr);
private JMenuItem miNew = new JMenuItem(newStr, 'N');
private JMenuItem miExit = new JMenuItem(exitStr, 'X'); public BeadrollFrame(String str) {
super(str);
setSize(500, 500);
miNew.addActionListener(this);
mFile.add(miNew);
miExit.addActionListener(this);
mFile.add(miExit);
mFile.setMnemonic('F');
menuBar.add(mFile);
add(menuBar,BorderLayout.NORTH);
} public void actionPerformed(ActionEvent ae) {
if (ae.getSource().equals(miNew)) {
NewCourseDlg ncd = new NewCourseDlg(this);
ncd.setVisible(true);
}
}
}//出现问题的对话框类
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;public class NewCourseDlg extends JDialog implements ActionListener {
private static final String TITLE = "新建相册对话框";
private static final String NEW_COURSE_NAME = "新相册名称";
private static final String PIC_FILE = "相册文件夹";
private static final String OK = "确定(O)";
private static final String CANCEL = "取消(C)";
private static final String VIEW = "浏览(B)";
private static JLabel nameLab = new JLabel(NEW_COURSE_NAME);
private static JLabel fileLab = new JLabel(PIC_FILE); private JTextField tfName = new JTextField("新名录集名称", 10);
private JTextField tfPF = new JTextField("", 18); private JButton btnOk = new JButton(OK);
private JButton btnCancel = new JButton(CANCEL);
private JButton btnView = new JButton(VIEW); private static JPanel mainPanel = new JPanel();
private static JPanel choiceFilePanel = new JPanel();
private static JPanel btnPanel = new JPanel(); public NewCourseDlg(JFrame owner) {
super(owner, TITLE, true);
setLayout(new BorderLayout());
mainPanel.setLayout(new GridLayout(4, 1));
choiceFilePanel.setLayout(new BorderLayout());
mainPanel.add(nameLab);
mainPanel.add(tfName);
mainPanel.add(fileLab);
btnView.setMnemonic(KeyEvent.VK_B);
btnView.addActionListener(this);
choiceFilePanel.add(tfPF, BorderLayout.LINE_START);
choiceFilePanel.add(btnView, BorderLayout.LINE_END);
mainPanel.add(choiceFilePanel);
add(mainPanel, BorderLayout.NORTH); btnOk.setMnemonic(KeyEvent.VK_O);
btnOk.addActionListener(this);
btnCancel.setMnemonic(KeyEvent.VK_C);
btnCancel.addActionListener(this);
btnPanel.add(btnOk);
btnPanel.add(btnCancel);
setBounds(0, 0, 300, 300);
add(btnPanel, BorderLayout.SOUTH);
} @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (e.getSource().equals(btnView)) {

} else if (e.getSource().equals(btnOk)) {
setVisible(false);
} else if (e.getSource().equals(btnCancel)) {
setVisible(false);
}
}
}
 
感激...

解决方案 »

  1.   

    当我再次点击新建时,新建对话框弹出,但是对话框里却意外地自动多了一个JTextFiled,是供用户输入相册名称的JTextField并且布局已经被破坏了,底下还自动多了一个 确定 的按钮,新建按键有问题吧!要不也不会自动新建的!!!
      

  2.   

       不得不承认,楼主你的代码很规范,除了static 用错地方以外,呵呵public class NewCourseDlg extends JDialog implements ActionListener {
        private static final String TITLE = "新建相册对话框";
        private static final String NEW_COURSE_NAME = "新相册名称";
        private static final String PIC_FILE = "相册文件夹";
        private static final String OK = "确定(O)";
        private static final String CANCEL = "取消(C)";
        private static final String VIEW = "浏览(B)";
        private static JLabel nameLab = new JLabel(NEW_COURSE_NAME);
        private static JLabel fileLab = new JLabel(PIC_FILE);    private JTextField tfName = new JTextField("新名录集名称", 10);
        private JTextField tfPF = new JTextField("", 18);    private JButton btnOk = new JButton(OK);
        private JButton btnCancel = new JButton(CANCEL);
        private JButton btnView = new JButton(VIEW);    private  JPanel mainPanel = new JPanel();//static 去掉
        private  JPanel choiceFilePanel = new JPanel();//static 去掉
        private  JPanel btnPanel = new JPanel();//static 去掉    public NewCourseDlg(JFrame owner) {
            super(owner, TITLE, true);
            setLayout(new BorderLayout());
            mainPanel.setLayout(new GridLayout(4, 1));
            choiceFilePanel.setLayout(new BorderLayout());
            mainPanel.add(nameLab);
            mainPanel.add(tfName);
            mainPanel.add(fileLab);
            btnView.setMnemonic(KeyEvent.VK_B);
            btnView.addActionListener(this);
            choiceFilePanel.add(tfPF, BorderLayout.LINE_START);
            choiceFilePanel.add(btnView, BorderLayout.LINE_END);
            mainPanel.add(choiceFilePanel);
            add(mainPanel, BorderLayout.NORTH);        btnOk.setMnemonic(KeyEvent.VK_O);
            btnOk.addActionListener(this);
            btnCancel.setMnemonic(KeyEvent.VK_C);
            btnCancel.addActionListener(this);
            btnPanel.add(btnOk);
            btnPanel.add(btnCancel);
            setBounds(0, 0, 300, 300);
            add(btnPanel, BorderLayout.SOUTH);
        }    //这里的@Overrid去掉,因为它的父类是JDialog而不是接口ActionListener
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            if (e.getSource().equals(btnView)) {
                
            } else if (e.getSource().equals(btnOk)) {
                setVisible(false);
            } else if (e.getSource().equals(btnCancel)) {
                setVisible(false);
            }
        }
    }
      

  3.   

    谢谢楼上,问题解决了,可是为什么加上static会有这种的错误呢???
      

  4.   

          static 的意思就是共享,你那个JPanel如果定义成static,那么你第二次调用的时候它没清空而是在第一次的基础
    上在增加其他的控件,因此你原来的代码第一次运行出来4个控件,第二次运行出来就变成了5个或者6个了,总之你原来那
    个新建菜单点的越多,弹出的对话框上的控件一次比一次多(都是在前一次的基础上增加的)
      

  5.   


    增加是因为构造函数中的add语句吗???还是无法给自己一个解释
      

  6.   

         你每次点击新建,它都new啊  如果static修饰的JPanel,那么不同对象它都共享这个JPanel
      

  7.   

       那么这个JPanel就一直会累加