簡體   English   中英

如何將 JButton 值添加到選定的 JTextField?

[英]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();
    }


    
    
}

它是我的 GUI

你會想看看如何編寫一個焦點監聽器

基本上,您需要將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM