Jtextfield setText() 根本不起作用
Jtextfield setText() would not work at all
所以这就是我想要做的是将 absolutePath 放入 jtextfield 中,我进行了系统打印,它显示了路径但不会在 jtextfield 中设置文本。
向导中的操作事件(按钮)class:
//buttons
JButton openMapButton = new JButton("Load Map");
ImageLoader imgload = new ImageLoader();
openMapButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
imgload.fileChooser();
}
});
向导中的 Jtextfield class:
JTextField mapURLField = new JTextField(20);
ImageLoader class:
public class ImageLoader extends Wizard{
private JLabel label;
JFileChooser chooser;
File file;
private BufferedImage img;
Wizard wiz = new Wizard();
JTextField mapURLField;
public void loadImg(){
}
public void fileChooser(){
wiz.mapURLField = new JTextField();
if(chooser == null){
chooser = new JFileChooser(".");
}
int returnVal = chooser.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION){
wiz.mapURLField.setText(chooser.getSelectedFile().getAbsolutePath());
System.out.println(chooser.getSelectedFile().getAbsolutePath());
}else{
wiz.mapURLField.setText("");
}
chooser.setSelectedFile(null);
}
}
您在 错误的 向导对象中设置了错误的 JTextField 状态。应该更改的文本字段是 displayed 向导 class 中显示的文本字段,而不是您在其上创建的 JTextField其他一些 class 中的位置,它位于您也在 ImageLoader 中创建的新创建的非显示向导 class 中。
这个:
public class ImageLoader extends Wizard{
private JLabel label;
// ....
Wizard wiz = new Wizard();
JTextField mapURLField;
创建一个new Wizard 对象,但肯定不是 Wizard 对象当前正在显示,因此更改这个新创建且未显示的对象的状态对您没有帮助。
改为:
ImageLoader imgload = new ImageLoader();
至:
ImageLoader imgload = new ImageLoader(this);
如果没有在 ActionListener 或其他匿名 class 中调用,因为这应该将显示的 Wizard 对象加载到 ImageLoader class。
并且在 ImageLoader 中执行:
private Wizard wiz; // a field to hold the displayed Wizard
public ImageLoader(Wizard wiz) {
this.wiz = wiz; // set the field with the parameter passed in
....
}
然后在您的 ImageLoader class.
中调用现在由 wiz 持有的 *true Wizard 对象的方法
另外,去掉
wiz.mapURLField = new JTextField();
创建 new JTextField 毫无意义,它肯定不会显示在原始 Wizard 对象中。您想要更改显示的 JTextField 的状态。最好的方法是给 Wizard 一个 public 方法,让你可以这样做:
// in the Wizard class:
public void setMapUrlField(String text) {
mapURLField.setText(text);
}
最后,扩展向导的 ImageLoader class:
public class ImageLoader extends Wizard {
可能没有按照您的想法去做,也可能不是您想要做的。
概念验证代码:
import java.io.File;
import javax.swing.*;
public class Wizard extends JPanel {
private ImageLoader imgload = new ImageLoader(this);
private JTextField mapURLField = new JTextField(30);
private JButton openMapButton = new JButton("Load Map");
private File file;
public Wizard() {
openMapButton.addActionListener(e -> {
file = imgload.fileChooser();
});
mapURLField.setFocusable(false);
add(mapURLField);
add(openMapButton);
}
public void setMapUrlField(String text) {
mapURLField.setText(text);
}
public File getFile() {
return file;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
Wizard wiz = new Wizard();
JFrame frame = new JFrame("Wizard");
frame.add(wiz);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
}
class ImageLoader {
private Wizard wiz;
public ImageLoader(Wizard wizard) {
this.wiz = wizard;
}
public File fileChooser() {
File file = null;
JFileChooser fileChooser = new JFileChooser();
int retValue = fileChooser.showOpenDialog(wiz);
if (retValue == JFileChooser.APPROVE_OPTION) {
file = fileChooser.getSelectedFile();
wiz.setMapUrlField(file.getAbsolutePath());
} else {
wiz.setMapUrlField("");
}
return file;
}
}
所以这就是我想要做的是将 absolutePath 放入 jtextfield 中,我进行了系统打印,它显示了路径但不会在 jtextfield 中设置文本。
向导中的操作事件(按钮)class:
//buttons
JButton openMapButton = new JButton("Load Map");
ImageLoader imgload = new ImageLoader();
openMapButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
imgload.fileChooser();
}
});
向导中的 Jtextfield class:
JTextField mapURLField = new JTextField(20);
ImageLoader class:
public class ImageLoader extends Wizard{
private JLabel label;
JFileChooser chooser;
File file;
private BufferedImage img;
Wizard wiz = new Wizard();
JTextField mapURLField;
public void loadImg(){
}
public void fileChooser(){
wiz.mapURLField = new JTextField();
if(chooser == null){
chooser = new JFileChooser(".");
}
int returnVal = chooser.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION){
wiz.mapURLField.setText(chooser.getSelectedFile().getAbsolutePath());
System.out.println(chooser.getSelectedFile().getAbsolutePath());
}else{
wiz.mapURLField.setText("");
}
chooser.setSelectedFile(null);
}
}
您在 错误的 向导对象中设置了错误的 JTextField 状态。应该更改的文本字段是 displayed 向导 class 中显示的文本字段,而不是您在其上创建的 JTextField其他一些 class 中的位置,它位于您也在 ImageLoader 中创建的新创建的非显示向导 class 中。
这个:
public class ImageLoader extends Wizard{
private JLabel label;
// ....
Wizard wiz = new Wizard();
JTextField mapURLField;
创建一个new Wizard 对象,但肯定不是 Wizard 对象当前正在显示,因此更改这个新创建且未显示的对象的状态对您没有帮助。
改为:
ImageLoader imgload = new ImageLoader();
至:
ImageLoader imgload = new ImageLoader(this);
如果没有在 ActionListener 或其他匿名 class 中调用,因为这应该将显示的 Wizard 对象加载到 ImageLoader class。
并且在 ImageLoader 中执行:
private Wizard wiz; // a field to hold the displayed Wizard
public ImageLoader(Wizard wiz) {
this.wiz = wiz; // set the field with the parameter passed in
....
}
然后在您的 ImageLoader class.
中调用现在由 wiz 持有的 *true Wizard 对象的方法另外,去掉
wiz.mapURLField = new JTextField();
创建 new JTextField 毫无意义,它肯定不会显示在原始 Wizard 对象中。您想要更改显示的 JTextField 的状态。最好的方法是给 Wizard 一个 public 方法,让你可以这样做:
// in the Wizard class:
public void setMapUrlField(String text) {
mapURLField.setText(text);
}
最后,扩展向导的 ImageLoader class:
public class ImageLoader extends Wizard {
可能没有按照您的想法去做,也可能不是您想要做的。
概念验证代码:
import java.io.File;
import javax.swing.*;
public class Wizard extends JPanel {
private ImageLoader imgload = new ImageLoader(this);
private JTextField mapURLField = new JTextField(30);
private JButton openMapButton = new JButton("Load Map");
private File file;
public Wizard() {
openMapButton.addActionListener(e -> {
file = imgload.fileChooser();
});
mapURLField.setFocusable(false);
add(mapURLField);
add(openMapButton);
}
public void setMapUrlField(String text) {
mapURLField.setText(text);
}
public File getFile() {
return file;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
Wizard wiz = new Wizard();
JFrame frame = new JFrame("Wizard");
frame.add(wiz);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
}
class ImageLoader {
private Wizard wiz;
public ImageLoader(Wizard wizard) {
this.wiz = wizard;
}
public File fileChooser() {
File file = null;
JFileChooser fileChooser = new JFileChooser();
int retValue = fileChooser.showOpenDialog(wiz);
if (retValue == JFileChooser.APPROVE_OPTION) {
file = fileChooser.getSelectedFile();
wiz.setMapUrlField(file.getAbsolutePath());
} else {
wiz.setMapUrlField("");
}
return file;
}
}