1

I'm building a classic form GUI with a variable amount and order of JTextFields, JCheckBoxes and JComboBoxes, with separate JPanels containing several groups of them.

For now I just build them in a builder method that adds a JLabel + the appropriate input Element to a JPanel and returns the JPanel to the main initialize method.

Therefore, I can only access the elements by

Component[] panels = frame.getContentPane().getComponents();  
JPanel panel = (JPanel) panels[f];  
Component[] components = panel.getComponents();  

[...] determining the element class  
JTextField field = (JTextField) components[u + 1]

Reading works fine with this method, but setting values is harder because I'm currently not accessing the elements directly. Am I doing something wrong or do I have to rebuild the panel from the start?

4

2 回答 2

2

你没有做坏事,你在正确的轨道上。实际上,这就是通常的做法。

您的 GUI 属于某个类 - 您需要确定该 GUI 的哪些元素是“交互式的” - 即稍后在执行期间对它们执行一些操作。这些可以是控制元素,例如文本字段、按钮等……还有一些元素不是交互式的,并且在创建后不使用。这些是标签、面板等......它们的目的只是在 GUI 上绘制。

因此,当您决定哪些元素是“重要”元素时,您只需将这些元素从局部变量提升到类字段。如果您使用任何体面的 IDE(例如 NetBeans 或 Eclipse),甚至可以在 Refactoring 选项卡下为您提供该选项。尽管如此,结果应该是这样的:

public class GUI{
    public void create GUI{
        //code before...
        JTextField field = new JTextField();
        //code after...
    }
}

将改为:

public class GUI{
    private JTextField textField;

    public void create GUI{
        //code before...
        textField = new JTextField();
        //code after...
    }
}

或者,如果这些字段数量不定,则可以在数组或集合中声明它们:

public class GUI{
    private JTextField[] textFields;

    public void create GUI{
        //code before...
        for(int i = 0; i < dbResultCount; i++){
            textFields[i] = new JTextField();
        }
        //code after...
    }
}
于 2012-10-10T12:48:52.023 回答
1

您使用的方法听起来不是一个好主意。维护这个应用程序真的很难。

如果您需要访问某些组件,那么我建议您将它们声明为实例变量。

于 2012-10-10T12:48:26.430 回答