【问题标题】:Java Swing Change Context of JTextField in several JPanels In 1 JFrameJava Swing 在 1 个 JFrame 中的几个 JPanel 中更改 JTextField 的上下文
【发布时间】:2012-11-14 23:11:45
【问题描述】:

也许你可以在这里帮助我:)
我想“模拟”比如 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 的值,但我不能...这件事花了我几个小时的搜索和尝试,但无法找到。

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

【问题讨论】:

  • 尽量遵守 Java 命名约定(类以大写字母开头,变量以小写字母开头)。这样便于阅读代码
  • 谢谢。我有点不习惯,对不起:/link

标签: java swing jframe jpanel jtextfield


【解决方案1】:

您必须更多地使用对象,尤其是视图(例如在 MVC 中)。一个视图代表一个对象,在这种情况下它看起来像一些机器(它是一个名称、一个 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();
            }
        });
    }
}

【讨论】:

  • Awww 非常感谢!这给了我正确开始的正确想法! 1 年没接触过 Java,很难再像 Java 一样思考;)
猜你喜欢
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多