JFrame.repaint()和JFrame.revalidate()不起作用

时间:2015-06-21 18:47:13

标签: java swing

import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class TheSize extends JFrame implements ActionListener, KeyListener {
    static String inText="";
    JPanel pane=new JPanel();
    JLabel word0=new JLabel("I would like my grid to be 2^",JLabel.RIGHT);
    JLabel word1=new JLabel("*  2^ "+inText,JLabel.RIGHT);
    JButton finish=new JButton("I'm done");
    JTextField size=new JTextField("",3);

    public TheSize(){
        super("size");
        System.out.println("hi");
        setLookAndFeel();
        setSize(550,100);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        FlowLayout box=new FlowLayout();
        setLayout(box);
        pane.add(word0);
        pane.add(size);
        pane.add(word1);
        pane.add(finish);
        finish.addActionListener(this);
        add(pane);
        setVisible(true);
        pack();
        size. addKeyListener(this);
        setFocusable(true);
    }
    private void setLookAndFeel() {
        try {
            UIManager.setLookAndFeel(
                    "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
                    );
        } catch (Exception exc) {
            // ignore error
        }
    }
    public void actionPerformed(ActionEvent e) {


    }
    @Override
    public void keyPressed(KeyEvent arg0) {
    }
    @Override
    public void keyReleased(KeyEvent arg0) {

    }
    @Override
    public void keyTyped(KeyEvent e) {
        inText=size.getText();
        pane.revalidate();
        pane.repaint();

    }
    public static void main(String[] args){
        new TheSize();
    }


}

一些事情

我确保KeyListener正在工作,并且它没有在没有输出的情况下工作,它没有给我任何错误。

会发生什么:

它应弹出一个框架,表示我希望我的网格为2 ^ __(用户输入Textfield)____ * 2 ^(文本字段中的内容)。 (按钮我已经完成了。)

enter image description here

但是,在文本字段中输入内容后,(文本字段中的内容)仍为空。我检查了程序是否使用System.out.println();听到了我的击键,并且它正在工作,因此revalidate();repaint()命令不能(我也通过放置System.out来测试它)。 println();在我的构造函数中。提前感谢

2 个答案:

答案 0 :(得分:3)

永远不要在JTextField上使用KeyListener。摆脱KeyListener和JTextField应该接受文本就好了。相反,如果您想注册用户输入,如果您只想要文本但不想过滤它,请使用DocumentListener;如果您需要在显示之前过滤文本,请使用DocumentFilter。这个问题在本网站上被提出很多次。

另请注意,即使您使用DocumentListener,JLabel永远不会更改,因为您在word1 JLabel上调用setText(...)但从不重新调用此方法。只是更改inText String变量引用的String当然不会神奇地改变JLabel显示的文本。

注意,我不确定replicate()命令的含义,因为我没有听说过这种方法。你的意思是revalidate()如果是的话,请澄清。

例如:

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;

// Avoid extending JFrames if at all possible.
// and only extend other components if needed.
@SuppressWarnings("serial")
public class TheSize2 extends JPanel {
   private static final String FORMAT = "*  2^ %s";
   private static final int PREF_W = 550;
   private static final int PREF_H = 100;
   private String inText = "";
   private JLabel word0 = new JLabel("I would like my grid to be 2^", JLabel.RIGHT);
   private JLabel word1 = new JLabel(String.format(FORMAT, inText), JLabel.RIGHT);
   private JButton finish = new JButton("I'm done");
   private JTextField size = new JTextField("", 3);

   public TheSize2() {
      finish.setAction(new FinishAction("I'm Done"));
      size.getDocument().addDocumentListener(new SizeListener());
      add(word0);
      add(size);
      add(word1);
      add(finish);
   }

   @Override // make JPanel bigger
   public Dimension getPreferredSize() {
      Dimension superSz = super.getPreferredSize();
      if (isPreferredSizeSet()) {
         return superSz;
      }
      int prefW = Math.max(superSz.width, PREF_W);
      int prefH = Math.max(superSz.height, PREF_H);
      return new Dimension(prefW, prefH);
   }

   private class SizeListener implements DocumentListener {
      private void textUpdated(DocumentEvent e) {
         try {
            inText = e.getDocument().getText(0, e.getDocument().getLength());
            word1.setText(String.format(FORMAT, inText));
         } catch (BadLocationException e1) {
            e1.printStackTrace();
         }
      }

      @Override
      public void changedUpdate(DocumentEvent e) {
         textUpdated(e);
      }

      @Override
      public void insertUpdate(DocumentEvent e) {
         textUpdated(e);

      }

      @Override
      public void removeUpdate(DocumentEvent e) {
         textUpdated(e);
      }

   }

   private class FinishAction extends AbstractAction {
      public FinishAction(String name) {
         super(name);
         int mnemonic = (int) name.charAt(0);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         Component comp = (Component) e.getSource();
         if (comp == null) {
            return;
         }
         Window win = SwingUtilities.getWindowAncestor(comp);
         if (win == null) {
            return;
         }
         win.dispose();         
      }
   }

   private static void createAndShowGui() {
      TheSize2 theSize2 = new TheSize2();

      JFrame frame = new JFrame("The Size");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(theSize2);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

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

答案 1 :(得分:-2)

我在Hovercraft Full Of Eels的帮助下找到了解决方案,我错过的只是重新设置尺寸。它不是最好的解决方案,但它足以让我理解。

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class TheSize extends JFrame implements ActionListener, KeyListener {
    static String inText="";
    JPanel pane=new JPanel();
    JLabel word0=new JLabel("I would like my grid to be 2^",JLabel.RIGHT);
    JLabel word1=new JLabel("*  2^ "+inText,JLabel.RIGHT);
    JButton finish=new JButton("I'm done");
    JTextField size=new JTextField("",3);

    public TheSize(){
        super("size");
        setLookAndFeel();
        setSize(550,100);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        FlowLayout box=new FlowLayout();
        setLayout(box);
        pane.add(word0);
        pane.add(size);
        pane.add(word1);
        pane.add(finish);
        finish.addActionListener(this);
        add(pane);
        setVisible(true);
        pack();
        size.addKeyListener(this);
        setFocusable(true);
    }
    private void setLookAndFeel() {
        try {
            UIManager.setLookAndFeel(
                    "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
                    );
        } catch (Exception exc) {
            // ignore error
        }
    }
    public void actionPerformed(ActionEvent e) {


    }

    public static void main(String[] args){
        new TheSize();
    }
    @Override
    public void keyPressed(KeyEvent arg0) {

    }
    @Override
    public void keyReleased(KeyEvent arg0) {
        inText=size.getText();
        word1.setText("*  2^ "+inText);
        pane.revalidate();
        pane.repaint();

    }
    @Override
    public void keyTyped(KeyEvent arg0) {

    }


}