在JFileChooser中获取Open按钮和JTextField?

时间:2013-01-10 05:05:01

标签: java swing jfilechooser

在我的自定义JFileChooser中,我想获得“打开”按钮,因此我使用以下代码:

private static JButton getOpenButton(Container c) {
  Validator.checkNull(c);

  int len = c.getComponentCount();
  JButton button = null;
  for (int index = 0; index < len; index++) {
    if (button != null) {
      break;
    }
    Component comp = c.getComponent(index);
    if (comp instanceof JButton) {
      JButton b = (JButton) comp;

      if ("Open".equals(b.getText())) {
        return b;
      }
    }
    else if (comp instanceof Container) {
      button = getOpenButton((Container) comp);
    }
  }
  return button;
}

这段代码的问题在于效率低(因为递归),如果使用本地化也会被破坏(因为单词“Open”是硬编码的)。

我还希望得到JTextField,用户可以在其中输入文件的名称和路径。我正在使用此代码来获取此组件:

private static JTextField getTextField(Container c) {
  Validator.checkNull(c);

  int len = c.getComponentCount();
  JTextField textField = null;
  for (int index = 0; index < len; index++) {
    if (textField != null) {
      break;
    }
    Component comp = c.getComponent(index);
    if (comp instanceof JTextField) {
      return (JTextField) comp;
    }
    else if (comp instanceof Container) {
      textField = getTextField((Container) comp);
    }
  }
  return textField;
}

有没有更好的方法可以获得“打开”按钮和JTextField

1 个答案:

答案 0 :(得分:1)

在我的自定义文件选择器的构造函数中,我调用了setApproveButtonText方法并传入了一个自定义字符串以用于“打开”按钮。我在使用下面的getOpenButton方法获取“打开”按钮之前调用了此方法。这样,我保证可以在任何操作系统平台上获取Open按钮,无论JVM使用什么语言环境。

private final String title;

public CustomFileChooser(String title) {
  this.title = title;
  setApproveButtonText(title);
  this.button = getOpenButton(this);
}

private JButton getOpenButton(Container c) {
  Validator.checkNull(c);

  int len = c.getComponentCount();
  JButton button = null;
  for (int index = 0; index < len; index++) {
    if (button != null) {
      break;
    }
    Component comp = c.getComponent(index);
    if (comp instanceof JButton) {
      JButton b = (JButton) comp;

      if (this.title.equals(b.getText())) {
        return b;
      }
    }
    else if (comp instanceof Container) {
      button = getOpenButton((Container) comp);
    }
  }
  return button;
}