自定义 javax.swing.JFileChooser 以包含额外的 JTextField

问题描述 投票:0回答:2

我想在 FileChooser 中包含一个额外的(可选)JTextField,允许用户在选择文件时填写它,而不是在做出选择后给他们一个额外的提示。有没有人尝试过类似的事情并找到可行的解决方案?

我的目标结果看起来像这样:

http://imgur.com/lVMd6

java swing jfilechooser
2个回答
8
投票

JFileChooser 添加控件的

记录
方法是通过 setAccessory(JComponent) 方法。

JTextField field = new JTextField("Hello, World");
JPanel accessory = new JPanel();
accessory.setLayout(new FlowLayout());
accessory.add(field);

JFileChooser chooser = new JFileChooser();
chooser.setAccessory(accessory);
int ret = chooser.showOpenDialog(frame);

但是,这会将新控件布局在对话框的右侧(精确定位可能取决于区域设置)。

要将组件定位到您想要的位置,您可能必须遍历组件图并对其进行操作。这将是一种非常脆弱的方法,您最好构建自己的对话框。

这可以包含一个文件选择器:

JFileChooser chooser = new JFileChooser();
chooser.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent e) {
    // TODO - wire into something
    System.out.println(e);
  }
});

JTextField field = new JTextField("Hello, World");

JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(chooser, BorderLayout.CENTER);
panel.add(field, BorderLayout.SOUTH);

0
投票

多年以后...

我可以使用这种方法很容易地实现这一点:

  1. 获取文件选择器的布局管理器(BorderLayout)。

  2. 使用布局管理器,从文件选择器中获取 SOUTH 组件,保存其引用并将其从文件选择器中删除。

  3. 创建一个新面板,其中包含您想要的任何内容以及原始的 SOUTH 组件。我个人使用垂直的 BoxLayout。我还在组件之间添加了 (1,12) 的 Box.Filler。

  4. 将新面板设置为文件选择的 SOUTH 组件。

  5. 瞧!

    JFileChooser chooser = new JFileChooser();
    
    BorderLayout chooserLayout = (BorderLayout) chooser.getLayout();
    JPanel chooserSouthComponent = (JPanel) chooserLayout.getLayoutComponent( chooser, BorderLayout.SOUTH );
    chooser.remove( chooserSouthComponent );
    
    JPanel newSouthComponent = new JPanel();
    newSouthComponent.setLayout( new BoxLayout( newSouthComponent, BoxLayout.PAGE_AXIS ) );
    
    JPanel utility = new JPanel();
    JTextField field = new JTextField("Hello, World");
    TitledBorder title = BorderFactory.createTitledBorder( "title" );
    utility.setBorder(title);
    utility.add( field );
    
    Dimension fillerDimension = new Dimension( 1, 12 );
    
    newSouthComponent.add( utility );
    newSouthComponent.add( new Box.Filler( fillerDimension, fillerDimension, fillerDimension ) );
    newSouthComponent.add( chooserSouthComponent );
    
    chooser.add( newSouthComponent, BorderLayout.SOUTH );
    
    chooser.showOpenDialog( null );
    
© www.soinside.com 2019 - 2024. All rights reserved.