java - 文件对话框和复合

标签 java swt composite

我正在尝试使用 FileDialog 创建一个浏览按钮并在 Java 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
}

}

尝试以上述方式添加时出现以下错误。

Exception in thread "main" java.lang.Error: Unresolved compilation problems: The constructor FileDialog(Composite, int) is undefined Cannot refer to a non-final variable composite inside an inner class defined in a different method

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

最佳答案

您正在尝试从您定义的Listener (SelectionAdapter) 中访问composite。用于创建监听器的符号隐式创建一个新类。因此,您实际上是在尝试从内部类访问变量 composite ,只有当 composite 是外部类的 static 字段时才能完成此操作。类或者如果您制作composite final

所以只需执行以下操作:

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

它会起作用。

<小时/>

此外,正如错误所述,没有采用 Composite 的构造函数。您必须使用 Shell。因此,只需执行以下操作:

FileDialog dialog = new FileDialog(composite.getShell(), SWT.NULL);
<小时/>

但是,这会给您带来另一个异常(exception),因为您在该行上方的某个位置使用了 shell 字段,该字段为 null。由于您的类是 Shell,因此将所有出现的 shell 替换为 this 即可正常工作。

关于java - 文件对话框和复合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15019415/

相关文章:

java - 获取swing标签文本并将其传递给父类

java - 如何在 SWT 中添加处理 PApplet

perl - ImageMagick:将一张图像的 4 个边缘并排合成到另一张图像中

java - 数组为新数组和非新数组

java - 如何使用 Java 使用 Selenium WebDriver 在 Chrome 中处理身份验证弹出窗口

Java套接字问题

java - 如何从不同文件夹的 FileDialog 获取绝对路径

java - 从 eclipse viewpart 获取内容

java - SWT 复合对齐

java - 有没有办法在Java中对if语句进行分组