首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FileDialog与复合材料

FileDialog与复合材料
EN

Stack Overflow用户
提问于 2013-02-22 07:58:50
回答 1查看 2K关注 0票数 0

我试图在Java中使用FileDialog和composite创建一个浏览按钮。(复合因为,我使用的是CTabFolderCTabItem。我觉得向CTabItem复合材料中添加组件已经足够好了)

代码语言:javascript
复制
import java.io.BufferedReader; 
import java.io.File;
import java.io.FileReader;
import java.util.StringTokenizer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
 import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.custom.CBanner;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.wb.swt.SWTResourceManager;

public class DemoShell extends Shell {
  protected Composite composite;
  private Text filename;
  private Table table;
  protected Shell shell;

public static void main(String args[]) {
  try {
Display display = Display.getDefault();
DemoShell shell = new DemoShell(display);
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
    display.sleep();
}
}
} catch (Exception e) {
e.printStackTrace();
 }
}

private static boolean parseFile(Table table, String filename) { 
    try { 
          BufferedReader br = new BufferedReader( new FileReader(filename) ); 
          String line = ""; 
          StringTokenizer token = null, subtoken = null; 

          int tokenNum = 1; 

          while((line = br.readLine()) != null) { 

              //  lineNum++;                     
              // break comma separated file line by line

                token = new StringTokenizer(line, ";"); 
                String sno = null;

                while(token.hasMoreTokens()) { 
                    subtoken = new StringTokenizer(token.nextToken().toString(), ",");
                    sno = "";
                    sno = Integer.toString(tokenNum);
                    TableItem item = new TableItem (table, SWT.NONE);
                    item.setText (0, sno );
                    item.setText (1, subtoken.nextToken());
                    item.setText (2, subtoken.nextToken());
                    item.setText (3, subtoken.nextToken());
                    item.setText (4, subtoken.nextToken());
                    item.setText (5, subtoken.nextToken());
                      tokenNum++; 
                      System.out.println("S.No # " + tokenNum + token.nextToken()); 
                } 

                tokenNum = 0; 
          } 
          br.close(); 
          return true; 
    } catch(Exception e) { 
          System.err.println("Parse Error: " + e.getMessage()); 
          return false; 
    } 
  }


public void displayFiles(String[] files) {
      for (int i = 0; files != null && i < files.length; i++) {
          filename.setText(files[i]);
          filename.setEditable(false);
      }
    }
/**
 * Create the shell.
 * @param display
 */
public DemoShell(Display display) {
    super(display, SWT.SHELL_TRIM);

    TabFolder tabFolder = new TabFolder(this, SWT.NONE);
    tabFolder.setBounds(10, 10, 462, 268);

    TabItem re_item = new TabItem(tabFolder, SWT.NONE);
    re_item.setText("Road Network");

    TabItem ttable_item = new TabItem(tabFolder, SWT.NONE);
    ttable_item.setText("Time Table");

    createContents_tt(tabFolder, ttable_item );
}

/**
 * Create contents of the shell.
 */
protected void createContents_tt(TabFolder tabFolder, TabItem ttable_item) {
    setText("SWT Application");
    setSize(530, 326);


    //Table declaration
    table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
    table.setBounds(10, 153, 450, 107);
    table.setHeaderVisible(true);
    table.setLinesVisible(true);
    String[] titles = {"S.No", "Route", "Transport #", "Cross Point", "Start Time", "End Time"};
    for (int i=0; i<titles.length; i++) {
        TableColumn column = new TableColumn (table, SWT.NONE);
        column.setText (titles [i]);
    }
    for (int i=0; i<titles.length; i++) {
        table.getColumn (i).pack ();
    }   


    Composite composite = new Composite(tabFolder, SWT.NONE);
            composite.setLayout(new FillLayout());

    Group group_1 = new Group(shell, SWT.NONE);
    group_1.setBounds(10, 10, 450, 127);

    filename = new Text(group_1, SWT.BORDER);
    filename.setBounds(31, 95, 377, 21);
    filename.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));


    Group group = new Group(group_1, SWT.NONE);
    group.setBounds(81, 46, 245, 43);

    Label lblEitherBrowseFor = new Label(group_1, SWT.NONE);
    lblEitherBrowseFor.setBounds(10, 19, 430, 21);
    lblEitherBrowseFor.setText("Either Browse for a file or Try to upload the time table data through Manual entry");

    Button btnManual = new Button(group, SWT.NONE);
    btnManual.setBounds(162, 10, 75, 25);
    btnManual.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {

        }
    });
    btnManual.setText("Manual");

    Button btnBrowser = new Button(group, SWT.NONE);
    btnBrowser.setBounds(27, 10, 75, 25);
    btnBrowser.setText("Browse");
    btnBrowser.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {

            FileDialog dialog = new FileDialog(composite, SWT.NULL);
            String path = dialog.open();
            if (path != null) {

              File file = new File(path);
              if (file.isFile())
              {
                  displayFiles(new String[] { file.getAbsolutePath().toString()});
                  DemoShell.parseFile(table, file.toString());
              }

              else
              displayFiles(file.list());

            }
        }
    });
    ttable_item.setControl(composite);

}

@Override
protected void checkSubclass() {
    // Disable the check that prevents subclassing of SWT components
}

}

在尝试以上述方式添加时,我将得到以下错误。

线程"main“java.lang.Error中的异常:未解决的编译问题:构造函数FileDialog(复合,int)未定义,不能引用在不同方法中定义的内部类中的非最终变量组合。

我请求提供建议/帮助,以清除错误或重新使用任何其他方式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-22 08:04:14

您正在尝试从定义的composite (SelectionAdapter)中访问Listener。用于创建侦听器的符号隐式地创建了一个新类。因此,您实际上正在尝试从内部类访问变量composite,这只能在composite是外部类的static字段或生成composite final时才能完成。

因此,只需做以下几点:

代码语言:javascript
复制
final Composite composite = new Composite(tabFolder, SWT.NONE);

它会成功的。

此外,由于错误状态,不存在接受Composite的构造函数。您必须使用Shell。因此,只需做以下几点:

代码语言:javascript
复制
FileDialog dialog = new FileDialog(composite.getShell(), SWT.NULL);

但是,这将给您另一个例外,因为您使用的字段shell位于该行的某个位置,即null。因为您的类是Shell,所以将所有出现的shell替换为this,它就能工作了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15019415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档