すべてのフィールドに有効なデータ、つまり数値があり、負の数がない場合にのみ有効になるボタンが 2 つあります。
質問する
2473 次
4 に答える
5
JTextField が保持するドキュメントをリッスンする DocumentListener の使用を検討します。このサイトには、この種の例があります (1 つまたは 2 つ書いているので、知っています)。
例えば、
import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.JTextComponent;
public class DocumentListenerFun extends JPanel {
private static final int FIELD_COUNT = 5;
private JTextField[] fields = new JTextField[FIELD_COUNT];
private JButton fooBtn = new JButton("Foo");
private JButton barBtn = new JButton("Bar");
private MyFieldListener myFieldListener = new MyFieldListener();
public DocumentListenerFun() {
fooBtn.setEnabled(false);
barBtn.setEnabled(false);
for (int i = 0; i < fields.length; i++) {
fields[i] = new JTextField(10);
add(fields[i]);
myFieldListener.addTextComponent(fields[i]);
}
myFieldListener.addComponentsToEnable(fooBtn);
myFieldListener.addComponentsToEnable(barBtn);
add(fooBtn);
add(barBtn);
}
private static void createAndShowGui() {
DocumentListenerFun mainPanel = new DocumentListenerFun();
JFrame frame = new JFrame("DocumentListenerFun");
frame.setDefaultCloseOperation(JFrame.EXIT_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();
}
});
}
}
class MyFieldListener {
private List<JTextComponent> textComponents = new ArrayList<JTextComponent>();
private List<Component> componentsToEnable = new ArrayList<Component>();
private MyDocListener myDocListener = new MyDocListener(this);
public void addTextComponent(JTextComponent textComponent) {
textComponents.add(textComponent);
textComponent.getDocument().addDocumentListener(myDocListener);
}
public void addComponentsToEnable(Component comp) {
componentsToEnable.add(comp);
}
public void docsChanged() {
boolean textVerified = true;
for (JTextComponent textComp : textComponents) {
String text = textComp.getText();
textVerified &= verifyText(text);
}
for (Component comp : componentsToEnable) {
comp.setEnabled(textVerified);
}
}
private boolean verifyText(String text) {
try {
int value = Integer.parseInt(text.trim());
if (value > 0) {
return true;
}
} catch (NumberFormatException e) {
return false;
}
return false;
}
}
class MyDocListener implements DocumentListener {
private MyFieldListener myFieldListener;
public MyDocListener(MyFieldListener myFieldListener) {
this.myFieldListener = myFieldListener;
}
@Override
public void changedUpdate(DocumentEvent e) {
myFieldListener.docsChanged();
}
@Override
public void insertUpdate(DocumentEvent e) {
myFieldListener.docsChanged();
}
@Override
public void removeUpdate(DocumentEvent e) {
myFieldListener.docsChanged();
}
}
于 2012-10-12T02:53:24.063 に答える
0
Key リスナーを使用するか、JTextField で focuslost を使用します。
http://www.java2s.com/Tutorial/Java/0240__Swing/ListeningtoJTextFieldEventswithanKeyListener.htm
http://docs.oracle.com/javase/tutorial/uiswing/events/focuslistener.html
于 2012-10-12T02:56:40.910 に答える
0
負の値を許可したくない場合は、DocumentFilter を使用できます。
/**
* REF: http://www.coderanch.com/t/345628/GUI/java/DocumentFilter
*/
public class NumericFilter extends DocumentFilter {
@Override
public void insertString(DocumentFilter.FilterBypass fb, int offset,
String text, AttributeSet attr) throws BadLocationException {
fb.insertString(offset, text.replaceAll("\\D", ""), attr);
}
// no need to override remove(): inherited version allows all removals
@Override
public void replace(DocumentFilter.FilterBypass fb, int offset, int length,
String text, AttributeSet attr) throws BadLocationException {
fb.replace(offset, length, text.replaceAll("\\D", ""), attr);
}
}
次に使用する
((AbstractDocument)(new JTextField).getDocument()).setDocumentFilter(new NumericFilter());
于 2012-10-12T02:59:43.447 に答える