Java Swing 更改 1 个 JFrame 中多个 JPanel 中 JTextField 的上下文

标签 java swing jframe jpanel jtextfield

也许你可以帮我:)
我想“模拟”10 个机器站。在我的 JFrame/Container (我都尝试过)中,我放置了这 10 个机器(= 10 JPanels ,其中包含 x 按钮、文本字段,以及我想要的任何内容设计),我希望每一项都有不同的信息,并根据我的需要更改它们。

我尝试用JButton更改JTextField的值(就像设置机器的优先级+1一样。但是我无法区分10“优先级向上” “按钮 :(

你是怎么做到的?我的想法是以某种方式与它来自的 JPanel 进行对话,但我不能。

    Container wizardFrame = new JFrame();
    wizardFrame.setLayout(new GridLayout(2,5));     

    String Name;
    for(int i = 1; i < 11; i++){

    Name = "Maschine " + i;

    fillWizardFrame(wizardFrame, Name, i);      
    }       
    wizardFrame.setVisible(true);       
}

public void fillWizardFrame(Container wizardFrame, String Name, int i) {

    JPanel MaschineId = new JPanel();
    MaschineId.setLayout(new BorderLayout());

    JTextField maschineName = new JTextField(Name ,10);
    MaschineId.add(maschineName, BorderLayout.WEST);
    maschinePrioritaet = new JTextField("20",10);
    MaschineId.add(maschinePrioritaet,BorderLayout.CENTER);
    JButton Higher = new JButton("Higher " + i);   Higher.addActionListener(this); 

    MaschineId.add(Higher, BorderLayout.NORTH);
    wizardFrame.add(MaschineId);        
}

@Override
public void actionPerformed(ActionEvent event) {
    if(event.getActionCommand().contains("Higher")){
        System.out.println("Higher pressed " + event.getActionCommand());
    }
       // i tried .getID , .getSource etc... :/

}

我想用“更高”按钮更改 maschinePrioritaet 的值,但我不能...这件事花了我几个小时的搜索和尝试,但没能找到东西。

非常感谢您的帮助!
最好的,安德里亚

最佳答案

您必须更多地使用对象,尤其是 View (就像在 MVC 中一样)。 View 代表一个对象,在本例中它看起来像某个机器(由名称、ID 和优先级组成)。因此,您需要创建一个附加到该模型的机器面板。

这里有一些更接近的东西(但仍然有很多改进要做):

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

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Wizard {
    public Wizard() {
        JFrame wizardFrame = new JFrame();
        wizardFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        wizardFrame.setLayout(new GridLayout(2, 5));
        String name;
        for (int i = 1; i < 11; i++) {
            name = "Maschine " + i;
            MashinePanel mashinePanel = new MashinePanel(name, i);
            wizardFrame.add(mashinePanel.getPanel());
        }
        wizardFrame.pack();
        wizardFrame.setVisible(true);
    }

    public static class MashinePanel implements ActionListener {
        private final String name;
        private final int id;
        private JTextField maschineNameTF;
        private JFormattedTextField maschinePrioritaetTF;
        private JButton higher;
        private JPanel machinePanel;

        public MashinePanel(String name, int i) {
            super();
            this.name = name;
            this.id = i;
            machinePanel = new JPanel();
            machinePanel.setLayout(new BorderLayout());
            maschineNameTF = new JTextField(name, 10);
            machinePanel.add(maschineNameTF, BorderLayout.WEST);
            maschinePrioritaetTF = new JFormattedTextField(20);
            maschinePrioritaetTF.setColumns(10);
            machinePanel.add(maschinePrioritaetTF, BorderLayout.CENTER);
            higher = new JButton("Higher " + i);
            higher.addActionListener(this);
            machinePanel.add(higher, BorderLayout.NORTH);
        }

        public JPanel getPanel() {
            return machinePanel;
        }

        public String getName() {
            return name;
        }

        public int getId() {
            return id;
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            if (event.getActionCommand().contains("Higher")) {
                Object value = maschinePrioritaetTF.getValue();
                int priority = 20;
                if (value instanceof Integer) {
                    priority = (Integer) value;
                }
                maschinePrioritaetTF.setValue(priority + 1);
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Wizard();
            }
        });
    }
}

关于Java Swing 更改 1 个 JFrame 中多个 JPanel 中 JTextField 的上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13389004/

相关文章:

Java System.currentTimeMillis() 问题

java - 如何根据输入的文本向JtextPane添加规则

java - JTextArea 中的不同文本颜色

java - 如何返回到 Java 中的 JFrames

java - 使用运行时参数执行 JAR 文件

Java拆分和替换

java - 在 2.6.32-5-xen-amd64 上安装 j2re-1_4_2_19-linux-i586.bin 时出现问题

java - 多线程程序中的Swing图形

java - JTable 不添加第一个单元格为空

java - 通过计时器事件添加图像后,图像未出现在 JFrame 中