扩展简单GUI的功能

时间:2013-07-02 15:44:12

标签: java swing windowbuilder

我正在尝试自学如何使用Java swing和Window Builder Pro创建GUI,观看几个YouTube视频,阅读一些教程,并询问前一个问题here我完成了以下操作。

public class JetstreamFrame extends JFrame {

private static final long serialVersionUID = 1L;
JTabbedPane tabPane;

private JPanel buttonOnePanel;
private JPanel buttonTwoPanel;
private SpringLayout springLayout;
private SpringLayout sl_buttonTwoPanel;
private SpringLayout sl_buttonOnePanel;
private JButton ButtonTwo;
private JButton ButtonOne;
private JScrollPane displayTextPanel;
private JTextArea textArea;
private ScrollPaneLayout sl_displayTextPanel;
private JComboBox<String> comboBox;

public JetstreamFrame() {
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    springLayout = new SpringLayout();
    getContentPane().setLayout(springLayout);

    tabPane = new JTabbedPane(JTabbedPane.TOP);
    setupTabPane();

    buttonOnePanel = new JPanel();
    sl_buttonOnePanel = new SpringLayout();
    setupButtonOnePanel();


    buttonTwoPanel = new JPanel();
    sl_buttonTwoPanel = new SpringLayout();
    setupButtonTwoPanel();

    ButtonOne = new JButton("Click Here!");
    setupButtonOne();

    setupComboBox();

    ButtonTwo = new JButton("Click Here!");
    setupButtonTwo();

    displayTextPanel = new JScrollPane(textArea);
    sl_displayTextPanel = new ScrollPaneLayout();
    setupDisplayTextPanel();

    textArea = new JTextArea();
    displayTextPanel.setViewportView(textArea);
}

private void setupTabPane()
{
    springLayout = new SpringLayout();
    springLayout.putConstraint(SpringLayout.NORTH, tabPane, 0, SpringLayout.NORTH, getContentPane());
    springLayout.putConstraint(SpringLayout.WEST, tabPane, 0, SpringLayout.WEST, getContentPane());
    springLayout.putConstraint(SpringLayout.SOUTH, tabPane, 245, SpringLayout.NORTH, getContentPane());
    springLayout.putConstraint(SpringLayout.EAST, tabPane, 484, SpringLayout.WEST, getContentPane());
    getContentPane().setLayout(springLayout);
    springLayout.putConstraint(SpringLayout.NORTH, tabPane, 0, SpringLayout.NORTH, getContentPane());
    springLayout.putConstraint(SpringLayout.WEST, tabPane, 0, SpringLayout.WEST, getContentPane());
    springLayout.putConstraint(SpringLayout.SOUTH, tabPane, -198, SpringLayout.SOUTH, getContentPane());
    springLayout.putConstraint(SpringLayout.EAST, tabPane, 484, SpringLayout.WEST, getContentPane());
    getContentPane().add(tabPane);
}

private void setupButtonOnePanel()
{
    tabPane.addTab("Tab One", null, buttonOnePanel, null);
    buttonOnePanel.setLayout(sl_buttonOnePanel);
}

private void setupButtonOne()
{
    ButtonOne.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) 
        {
            textArea.append("You pressed button one, ");
            textArea.append("ComboField: " + (String)comboBox.getSelectedItem() + "\n");
        }
    });
    sl_buttonOnePanel.putConstraint(SpringLayout.NORTH, ButtonOne, 99, SpringLayout.NORTH, buttonOnePanel);
    sl_buttonOnePanel.putConstraint(SpringLayout.WEST, ButtonOne, 187, SpringLayout.WEST, buttonOnePanel);
    buttonOnePanel.add(ButtonOne);
}

@SuppressWarnings({ "rawtypes", "unchecked" })
private void setupComboBox()
{
    String[] array = { "1" , "2", "3", "4" };
    comboBox = new JComboBox(array);
    sl_buttonOnePanel.putConstraint(SpringLayout.NORTH, comboBox, 99, SpringLayout.NORTH, buttonOnePanel);
    sl_buttonOnePanel.putConstraint(SpringLayout.WEST, comboBox, 6, SpringLayout.EAST, ButtonOne);
    sl_buttonOnePanel.putConstraint(SpringLayout.EAST, comboBox, 167, SpringLayout.EAST, ButtonOne);
    buttonOnePanel.add(comboBox);
}

private void setupButtonTwoPanel()
{
    tabPane.addTab("Tab Two", null, buttonTwoPanel, null);
    buttonTwoPanel.setLayout(sl_buttonTwoPanel);
}

private void setupButtonTwo()
{
    ButtonTwo.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) 
        {
            textArea.append("You pressed button two\n");
        }
    });
    sl_buttonTwoPanel.putConstraint(SpringLayout.NORTH, ButtonTwo, 99, SpringLayout.NORTH, buttonTwoPanel);
    sl_buttonTwoPanel.putConstraint(SpringLayout.WEST, ButtonTwo, 187, SpringLayout.WEST, buttonTwoPanel);
    buttonTwoPanel.add(ButtonTwo);
}

private void setupDisplayTextPanel()
{
    springLayout.putConstraint(SpringLayout.NORTH, displayTextPanel, 5, SpringLayout.SOUTH, tabPane);
    springLayout.putConstraint(SpringLayout.WEST, displayTextPanel, 5, SpringLayout.WEST, tabPane);
    springLayout.putConstraint(SpringLayout.SOUTH, displayTextPanel, 195, SpringLayout.SOUTH, tabPane);
    springLayout.putConstraint(SpringLayout.EAST, displayTextPanel, -5, SpringLayout.EAST, tabPane);
    getContentPane().add(displayTextPanel);
    displayTextPanel.setLayout(sl_displayTextPanel);
}

public void start()
{
    this.setSize(500, 500);
    this.setVisible(true);
}
}

自上一个问题以来,我已经能够在窗口关闭时实现程序的正确退出,并且组合框的实现,其中按下按钮将打印在组合框内选择的值。

我有一些我想要实现的功能,但我不确定如何继续前进。

我想要完成的第一件事,也许是最简单的,是禁用调整窗口大小的能力。由于我无法找到一种简单的方法来在调整大小时保持字段相对,因此消除调整窗口大小的能力是下一个最佳选择。

我想澄清的另一个选项是在构建后编辑组合框的内容。理想情况下,我希望能够通过按下按钮添加和删除字段中的条目。我无法找到允许我设置框内容的方法,并且看起来实现此目的的唯一方法是每次进行更改时创建一个新的组合框。有没有更有效的方法来做到这一点?

3 个答案:

答案 0 :(得分:1)

关于您的JComboBox问题,您可以使用getItemAt(int index)检索您的商品(还有其他获取者),addItem(E item)添加到您的列表中,最后removeItemAt(int index)从列表中删除项目(还有其他删除方法)。只需确保在其上调用setEditable(true),因为默认情况下JComboBox无法编辑。

此外,要使您的窗口固定大小,请在其上调用setResizable(false);

答案 1 :(得分:1)

  

是禁用调整窗口大小的功能。

frame.setResizable( false );
  

因为我无法找到一种简单的方法来在调整大小时保持字段相对

使用比SpringLayout更容易的布局管理器。此布局通常仅由IDE使用,因为它相对复杂。这就是我们大多数人手工构建GUI的原因,因此我们不受IDE的限制。

  

我无法找到允许我设置框内容的方法

要替换整个内容,您需要更换模型。

comboBox.setModel(...);

这就是所有Swing组件的工作原理,因此理解模型的概念非常重要。您的应用程序代码应该只更新模型。对于JComboBox,该组件有一些辅助方法,可以为您更新模型。

答案 2 :(得分:1)

要使您的框架具有固定大小,请使用setResizable(false)

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);// <- add this line

如果要更改组合框的内容,可以使用多种方法之一,例如

  • removeItem(item)将删除特定元素
  • removeItemAt(index)将删除指定位置的元素(从0开始计算)
  • addItem(item)将在组合框结尾处添加新项目
  • insertItemAt(item, index)会在指定地点插入项目,向下移动当前项目
  • 您还有removeAllItems()猜测它的作用:)

您可以在documentation of that class

中找到许多有用的信息