Java Swing在几个JPanels中改变JTextField的上下文在1个JFrame中

时间:2012-11-14 23:11:45

标签: java swing jframe jpanel jtextfield

也许你可以帮帮我:) 我想像10个机器站一样“模拟”。在我的JFrame / Container(我试过两个)中,我把这10个机器(= 10个JPanels包含x个按钮,文本字段,无论我想要的设计),我想要有不同的关于每一个的信息并根据我的需要改变它们。

我尝试用JTextField更改JButton的值(比如设置机器的优先级+ 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的值,但我不能......这件事花了我几个小时的搜索和尝试但却找不到东西。

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

1 个答案:

答案 0 :(得分:2)

你必须更多地使用对象,尤其是视图(比如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();
            }
        });
    }
}