gpt4 book ai didi

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

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

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^__(用户输入文本字段)____* 2^(文本字段中的内容)。 (“我完成了”按钮)。

enter image description here

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

最佳答案

切勿在 JTextField 上使用 KeyListener。去掉 KeyListener,JTextField 应该可以很好地接受文本。相反,如果您想注册用户输入,如果您只想要文本但不过滤它,请使用 DocumentListener;如果您需要在显示文本之前过滤文本,请使用 DocumentFilter。此类问题已在此网站上多次被问过。

另请注意,即使您使用 DocumentListener,您的 JLabel 也永远不会更改,因为您在 word1 JLabel 上调用 setText(...) 但永远不会重新调用此方法。当然,仅更改 inText 字符串变量引用的字符串不会神奇地更改 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();
}
});
}
}

关于java - JFrame.repaint() 和 JFrame.revalidate() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30968085/

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