0

我正在尝试使用FileDialogJava SWT 创建一个浏览按钮并进行复合。(复合,因为,我用CTabFolderCTabItem。我觉得向CTabItem复合中添加组件就足够了)

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(Composite, int) 未定义 无法引用以不同方法定义的内部类中的非最终变量组合

我请求建议/帮助以清除错误或以任何其他方式重做。

4

1 回答 1

2

您正在尝试compositeListener您定义的 ( SelectionAdapter) 中访问。您用于创建侦听器的表示法隐式地创建了一个新类。因此,您实际上是在尝试composite从内部类访问变量,只有当composite它是外部类的一个static字段或者您将composite final.

所以只需执行以下操作:

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

它会起作用。


此外,正如错误所述,没有构造函数采用Composite. 你必须使用一个Shell. 所以只需执行以下操作:

FileDialog dialog = new FileDialog(composite.getShell(), SWT.NULL);

但是,这会给您另一个例外,因为您在shell该行上方的某处使用该字段,即null. 由于您的课程是 a Shell,替换所有出现的shellwiththis并且它会起作用。

于 2013-02-22T08:04:14.547 回答