Невозможно ввести или удалить текст в JTextfield

Я изучаю Java с использованием искусства и науки о Java (с использованием Java SE 6u45). Попытка изменить шрифт текста, введя новый тип шрифта в JTextField. Но проблема в том, что я не могу ввести любой текст в JTextField. Эта проблема характерна для других компонентов свинга, которые я использовал, например, JButton, JCheckBox. Но в последних компонентах я мог видеть эффект выбора, даже если визуальный выбор остается тем же самым, то есть флажок остается установленным даже после щелчка, но код показывает результат без флажка.

Но в случае JTextField, даже эффект не показывает. Также я не могу удалить тестовый текст, который я поместил в JTextField. Пытался использовать isEditable(), grabFocus() а также isFocusable(), Может ли это быть ошибка Java?

/**
* Example 10.9
 * 
 * This program prints the given text in the font inputted by the user in JTextField
 */
package ASJ_Examples;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JTextField;

import acm.graphics.GLabel;
import acm.program.GraphicsProgram;

public class FontSampler extends GraphicsProgram implements ActionListener{
/**
 * Eclispe Generated
 */
private static final long serialVersionUID = -5734136235409079420L;
private static final String TEST_STRING = "This is a test";
private static final double LEFT_MARGIN = 3;
private static final int MAX_FONT_NAME = 10;

public void init(){
    addJFontLabel();
    addJFontTextField();
    lastY = 0;
    addGLabel(); 
}
/**
 * Adds a text field to enter the required font
 */
private void addJFontTextField() {
    String test = "new";
    fontField = new JTextField(test, MAX_FONT_NAME);    //added to see if Jtextfiled is responding 
//      fontField.setEnabled(true);
//      fontField.setEditable(true);
    fontField.addActionListener(this);
    //added these to give focus to jtextfield but no effect
    fontField.isEditable();
    fontField.grabFocus();
    fontField.isFocusable();
    //add to window
    add(fontField, SOUTH);

}
/**
 * Adds JFontLAbel to denote the text input field
 */
private void addJFontLabel() {
    add(new JLabel("Font"), SOUTH);

}

/**
 * Adds the test label to canvas
 */
private void addGLabel() {
    lastLabel = new GLabel(TEST_STRING);
    add(lastLabel, 20, 20);

}

public void ActionPerformed(ActionEvent e){
    if(e.getSource() == fontField){
        GLabel label = new GLabel(TEST_STRING);
        label.setFont(lastLabel.getFont()); //to display the text even if the suer entered a non-allowed font
        label.setFont(fontField.getText()); //change the font to u4ser demanded font
        addGlabel(label);
        lastLabel = label;
    }
}
/**
 *adds a Glabel on the next line adjusting for heights
 * @param label
 */
private void addGlabel(GLabel label) {
    lastY += label.getHeight();
    lastY += lastLabel.getDescent() - label.getDescent();
    add(label, LEFT_MARGIN, lastY);

}
/**
 * JTextField to enter font
 */
private JTextField fontField;
/**
 * GLabel which is being worked on
 */
private GLabel lastLabel;
/**
 * 
 */
private double lastY;
}

3 ответа

Решение

Как указывал @andrew-thompson, проблема была в том, что это была смесь wt и swing. Я полагаю, что каким-то образом GComponent наложил компонент Swing JTextField, что сделало его недоступным. Таким образом, обходной путь заключается в создании JPanel и KeyListener для JTextField, как отмечает @marco . Это код, который работает: SSCCE Code

 /**
 * 
 * This program prints the given text in the font inputted by the user in JTextField
 */

import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.JTextField;

import acm.graphics.GLabel;
import acm.program.GraphicsProgram;

public class FontSampler extends GraphicsProgram implements KeyListener{
private static final String TEST_STRING = "This is a test";
private static final double LEFT_MARGIN = 3;
private static final int MAX_FONT_NAME = 10;

public void init(){
    initPanel();    //init panel
    addJFontTextField();    //adds fontField to enter the font type
    addGLabel();    //adds default label to GCanvas
    lastY = 0;  //default y offset for post-processed label
    add(panel); //adds panel to canvas
}

/**
 * initialises panel 
 */
private void initPanel() {
    panel = new JPanel();
    panel.setLayout(new BorderLayout());

}

/**
 * Adds a text field to enter the required font
 */
private void addJFontTextField() {
    fontField = new JTextField( MAX_FONT_NAME);//added to see if Jtextfiled is responding
    panel.add(fontField, BorderLayout.SOUTH);
    fontField.addKeyListener(this); //adds key listener
}

/**
 * Adds the test label to canvas
 */
private void addGLabel() {
    lastLabel = new GLabel(TEST_STRING);
    add(lastLabel, 20, 20);

}

    /**
     * Called when any key is pressed
     */
public void keyPressed(KeyEvent e){
    if(e.getKeyCode() == KeyEvent.VK_ENTER){//check for enter key pressed
        GLabel label = new GLabel(TEST_STRING);
        label.setFont(lastLabel.getFont()); 
        label.setFont(fontField.getText());
        addGlabel(label);
        lastLabel = label;
    }
}

/**
 *adds a Glabel on the next line adjusting for heights
 * @param label
 */
private void addGlabel(GLabel label) {
    lastY += label.getHeight();
    lastY += lastLabel.getDescent() - label.getDescent();
    add(label, LEFT_MARGIN, lastY);
}

/**
 * JTextField to enter font
 */
private JTextField fontField;
/**
 * GLabel which is being worked on
 */
private GLabel lastLabel;
/**
 * 
 */
private double lastY;

private JPanel panel;

}

Спасибо:)

Попробуйте использовать fontField.requestFocus(); вместо fontField.grabFocus();а также fontField.setEditable(true); вместо fontField.isEditable();fontField.setFocusable(true); вместо fontField.isFocusable();

кстати fontField.setEditable(true); а также fontField.setFocusable(true); не являются необходимыми по умолчанию, они установлены в true.

Но в последних компонентах я мог видеть эффект выбора, даже если визуальный выбор остается тем же самым, то есть флажок остается установленным даже после щелчка, но код показывает результат без флажка.

Это звучит очень странно. Может быть GraphicsProgram класс делает что-то непослушное. Не могу сказать без его кода, хотя.

fontField.isEditable();
fontField.grabFocus();
fontField.isFocusable();

Первый возвращает логическое значение, если поле доступно для редактирования (по умолчанию). Второй не должен использоваться клиентскими программами, используйте fontField.requestFocusInWindow() вместо. Третий возвращает логическое значение, если поле является фокусируемым (по умолчанию).

fontField.addActionListener(this);

ActionListener на JTextField ничего не делает. Попробуйте сделать это:

fontfield.getDocument().addDocumentListener(new DocumentListener() {

    @Override
    public void removeUpdate(DocumentEvent e) {
        // TODO Auto-generated method stub
    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        // TODO Auto-generated method stub  
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        // TODO Auto-generated method stub
    }
});
Другие вопросы по тегам