重绘JPanel

时间:2015-05-24 11:33:03

标签: java swing keylistener

我有两个内容框架。第一个有一个jlabel和jbutton,点击它时会打开一个新的框架。当第二帧关闭时,我需要通过向其添加另一个jlabel来重新绘制第一帧或具有标签的面板。

//被修改

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;


    public class FirstFrame extends JPanel implements KeyListener{

        private static String command[];
        private static JButton ok;
        private static int count = 1;
        private static JTextField text;
        private static JLabel labels[];
        private static JPanel p ;
        private static JFrame frame;

        public int getCount(){
            return count;
        }
        public static void createWindow(){
            JFrame createFrame = new JFrame();
            JPanel panel = new JPanel(new GridLayout(2,1));
            text = new JTextField (30);
            ok = new JButton ("Add");
            ok.requestFocusInWindow();
            ok.setFocusable(true);
            panel.add(text);
            panel.add(ok);
            text.setFocusable(true);
            text.addKeyListener(new FirstFrame());
            createFrame.add(panel);
            createFrame.setVisible(true);
            createFrame.setSize(600,300);
            createFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            createFrame.setLocationRelativeTo(null);

            createFrame.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent windowEvent) {
                        System.out.println(command[count]);
                        if(command[count] != null){

                            p.add(new JLabel("NEW LABEL"));
                            p.revalidate();
                            p.repaint();
                            count++;
                            System.out.println(count);
                        }


                    }
                });
            if(count >= command.length)
                count = 1;


            ok.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    if(command[count] == null)
                        command[count] = text.getText();
                    else
                        command[count] = command[count]+", "+text.getText();


                    text.setText("");



                }
            });
        }
        public FirstFrame(){
            p = new JPanel();
            JButton create = new JButton ("CREATE");
            command = new String[2];    
            labels = new JLabel[2];
            addKeyListener(this);
            create.setPreferredSize(new Dimension(200,100));
            //setLayout(new BorderLayout());    
            p.add(new JLabel("dsafsaf"));
            p.add(create);
            add(p);
            //JPanel mainPanel = new JPanel();
            /*mainPanel.setFocusable(false);
            mainPanel.add(create);
            */

            create.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    createWindow();
                }
            });

            //add(mainPanel, BorderLayout.SOUTH);
        }
        public static void main(String[] args) {
            frame = new JFrame();
            frame.add(new FirstFrame());        
            frame.setVisible(true);
            frame.pack();
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        }

        @Override
        public void keyReleased(KeyEvent e) {

        }
        @Override
        public void keyTyped(KeyEvent e) {


        }
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER)
                if(ok.isDisplayable()){
                    ok.doClick();
                    return;}


                  }
                 }          
                }
            });
        }
}

1 个答案:

答案 0 :(得分:1)

根据我的第一条评论,您最好使用某种类型的对话框,并且可能像JOptionPane一样简单。例如,在下面的代码中,我创建了一个新的JLabel,其中的文本位于JTextField中,由JOptionPane保存,然后将其添加到原始GUI中:

import java.awt.Dimension;
import java.awt.event.ActionEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class FirstPanel2 extends JPanel {
   private static final int PREF_W = 600;
   private static final int PREF_H = 300;
   private JTextField textField = new JTextField("Hovercraft rules!", 30);
   private int count = 0;

   public FirstPanel2() {
      AddAction addAction = new AddAction();
      textField.setAction(addAction);

      add(textField);
      add(new JButton(addAction));
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   private class AddAction extends AbstractAction {
      public AddAction() {
         super("Add");
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         String text = textField.getText();
         final JTextField someField = new JTextField(text, 10);
         JPanel panel = new JPanel();
         panel.add(someField);
         int result = JOptionPane.showConfirmDialog(FirstPanel2.this, panel, "Add Label",
               JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
         if (result == JOptionPane.OK_OPTION) {
            JLabel label = new JLabel(someField.getText());
            FirstPanel2.this.add(label);
            FirstPanel2.this.revalidate();
            FirstPanel2.this.repaint();
         }
      }
   }

   private static void createAndShowGui() {
      FirstPanel2 mainPanel = new FirstPanel2();

      JFrame frame = new JFrame("My Gui");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

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

此外,不要将KeyListeners添加到文本组件中,因为这是一件危险且不必要的事情。在这里,你最好添加一个ActionListener,或者在上面的代码中添加一个Action,以便在按下回车键时执行一个动作。

修改
你问:

  

刚才意识到这是因为KeyListener。你能解释一下addAction吗?

这在功能上类似于向JTextField添加ActionListener,因此当您按enter时,将调用actionPerformed(...)方法,与按下JButton并激活其ActionListener或行动。动作就像一个" ActionListener"关于类固醇。它不仅表现为ActionListener,还可以为按钮提供文本,图标和其他属性。