[英]How to add a JButton value to a JTextField selected?
我正在學習 JAVA GUI
如何通過單擊將 JButton(1,2,3,[...]) 中的值添加到特定的 JTextField?
例子:
首先>點擊JTextField 1
2nd>點擊JButton 3
如何將值 JButton 3 添加到我選擇的 JTextField?
我知道如何將 JButton 值放在單個 JTextField 中,但我不知道如何在幾個不同的 JTextField 中執行此操作
我看到了一些相關的帖子,但我無法在我的代碼中實現它們,可能是因為我不太懂英語,最終可能會混淆一些東西
我正在嘗試這個:
package jamilzin.magicsquare;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MagicSquare implements ActionListener {
//declarando
JFrame frame;
JPanel panel,panelFunctions;
JButton[] numbers = new JButton[10];
JTextField[] positions = new JTextField[9];
JButton[] functions = new JButton[2];
void magicSquare(){
frame = new JFrame("Quadrado Magico");
frame.setSize(500,500);
panel = new JPanel();
panelFunctions = new JPanel();
numbers[1] = new JButton("1");
numbers[2] = new JButton("2");
numbers[3] = new JButton("3");
numbers[4] = new JButton("4");
numbers[5] = new JButton("5");
numbers[6] = new JButton("6");
numbers[7] = new JButton("7");
numbers[8] = new JButton("8");
numbers[9] = new JButton("9");
functions[0]= new JButton("Limpar");
functions[1]= new JButton("Sair");
for(int i=1;i<10;i++){
numbers[i].addActionListener(this);
numbers[i].setBackground(Color.lightGray);
}
for(int i=0; i<9;i++){
positions[i] = new JTextField();
positions[i].addActionListener(this);
}
panel.setBounds(0, 0, 500, 400);
panel.setLayout(new GridLayout(6,3,0,0));
panelFunctions.setBounds(50,410,400,30);
panelFunctions.setLayout(new GridLayout(1,2,250,0));
panel.add(positions[0]);
panel.add(positions[1]);
panel.add(positions[2]);
panel.add(positions[3]);
panel.add(positions[4]);
panel.add(positions[5]);
panel.add(positions[6]);
panel.add(positions[7]);
panel.add(positions[8]);
panel.add(numbers[1]);
panel.add(numbers[2]);
panel.add(numbers[3]);
panel.add(numbers[4]);
panel.add(numbers[5]);
panel.add(numbers[6]);
panel.add(numbers[7]);
panel.add(numbers[8]);
panel.add(numbers[9]);
panelFunctions.add(functions[0]);
panelFunctions.add(functions[1]);
frame.setLayout(null);
frame.setVisible(true);
frame.add(panel);
frame.add(panelFunctions);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==positions[1]){
positions[1].setText("5");
// positions[1].setText(e.getActionCommand());
}
}
public static void main(String[] args) {
MagicSquare quadrado = new MagicSquare();
quadrado.magicSquare();
}
}
你會想看看如何編寫一個焦點監聽器
基本上,您需要將FocusListener
附加到每個文本字段。 當文本字段獲得焦點時,您需要為獲得焦點的JTextField
的實例設置一個屬性。 當你點擊一個按鈕時,你使用這個屬性來設置文本(假設它不是null
)
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JTextField[] positions = new JTextField[9];
private JButton[] numbers = new JButton[10];
private JTextField lastFocusedField;
public TestPane() {
JPanel textFieldPane = new JPanel(new GridLayout(3, 3));
FocusListener focusListener = new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
lastFocusedField = (JTextField) e.getSource();
}
};
for (int index = 0; index < positions.length; index++) {
positions[index] = new JTextField(10);
positions[index].addFocusListener(focusListener);
textFieldPane.add(positions[index]);
}
ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (lastFocusedField != null) {
lastFocusedField.setText(e.getActionCommand());
}
}
};
JPanel buttonGridPane = new JPanel(new GridLayout(3, 3));
for (int index = 0; index < numbers.length; index++) {
numbers[index] = new JButton(Integer.toString(index));
numbers[index].addActionListener(actionListener);
}
for (int index = 0; index < 9; index++) {
buttonGridPane.add(numbers[index]);
}
JPanel numbersPane = new JPanel(new GridLayout(2, 1));
numbersPane.add(buttonGridPane);
numbersPane.add(numbers[9]);
GridBagConstraints gbc = new GridBagConstraints();
setLayout(new GridBagLayout());
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(textFieldPane, gbc);
add(numbersPane, gbc);
}
}
}
現在,您需要做出一些決定,當您點擊一個按鈕時,您是否應該重置“最后聚焦的文本字段”。 因為否則,您可以繼續點擊按鈕,最后一個焦點文本字段將不斷更新。
這意味着有不止一種方法可以解決它。 使用FocusListener
的原始答案是因為它“簡單”並且對於新開發人員來說很容易實現,並且不需要深入了解 Swing API 的內部工作原理。
KeyboardFocusManager
這有點繁瑣,因為它會在任何組件成為焦點時通知您,因此您需要努力隔離那些您感興趣的組件。
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JTextField[] positions = new JTextField[9];
private JButton[] numbers = new JButton[10];
private JTextField lastFocusedField;
public TestPane() {
JPanel textFieldPane = new JPanel(new GridLayout(3, 3));
KeyboardFocusManager.getCurrentKeyboardFocusManager().addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
Object newValue = evt.getNewValue();
if (newValue instanceof JTextField) {
JTextField textField = (JTextField) newValue;
// If there are other text fields in the view, we need
// to ignore them
if (isOfInterest(textField)) {
lastFocusedField = textField;
} else {
lastFocusedField = null;
}
}
}
protected boolean isOfInterest(JTextField field) {
for (JTextField other : positions) {
if (field == other) {
return true;
}
}
return false;
}
});
for (int index = 0; index < positions.length; index++) {
positions[index] = new JTextField(10);
textFieldPane.add(positions[index]);
}
ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (lastFocusedField != null) {
lastFocusedField.setText(e.getActionCommand());
}
}
};
JPanel buttonGridPane = new JPanel(new GridLayout(3, 3));
for (int index = 0; index < numbers.length; index++) {
numbers[index] = new JButton(Integer.toString(index));
numbers[index].addActionListener(actionListener);
}
for (int index = 0; index < 9; index++) {
buttonGridPane.add(numbers[index]);
}
JPanel numbersPane = new JPanel(new GridLayout(2, 1));
numbersPane.add(buttonGridPane);
numbersPane.add(numbers[9]);
GridBagConstraints gbc = new GridBagConstraints();
setLayout(new GridBagLayout());
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(textFieldPane, gbc);
add(numbersPane, gbc);
}
}
}
TextAction
正如camickr所指出的,您還可以使用TextAction
,如此處所示。
有關更多詳細信息,請參閱如何使用操作
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.JTextComponent;
import javax.swing.text.TextAction;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JTextField[] positions = new JTextField[9];
private JButton[] numbers = new JButton[10];
private JTextField lastFocusedField;
public TestPane() {
JPanel textFieldPane = new JPanel(new GridLayout(3, 3));
for (int index = 0; index < positions.length; index++) {
positions[index] = new JTextField(10);
textFieldPane.add(positions[index]);
}
JPanel buttonGridPane = new JPanel(new GridLayout(3, 3));
for (int index = 0; index < numbers.length; index++) {
numbers[index] = new JButton(new NumberAction(Integer.toString(index)));
}
for (int index = 0; index < 9; index++) {
buttonGridPane.add(numbers[index]);
}
JPanel numbersPane = new JPanel(new GridLayout(2, 1));
numbersPane.add(buttonGridPane);
numbersPane.add(numbers[9]);
GridBagConstraints gbc = new GridBagConstraints();
setLayout(new GridBagLayout());
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(textFieldPane, gbc);
add(numbersPane, gbc);
}
protected class NumberAction extends TextAction {
private String value;
public NumberAction(String value) {
super(value);
setName(value);
this.value = value;
}
public void actionPerformed(ActionEvent e) {
JTextComponent component = getFocusedComponent();
component.replaceSelection(value);
}
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
JButton btnPressed = (JButton)e.getSource();
for(int i=0; i<numbers.length;i++){
if(numbers[i] == btnPressed){
positions[i-1].setText(btnPressed.getText());
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.