1

嗨,我有MainFrame课:

public class MainFrame extends JFrame{

    private JLabel originalLabel;
    private JLabel filteredImage;

    public MainFrame(){
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        initComponents();
        setVisible(true);
    }

    private void initComponents(){
        ImageFilterMenuBar menuBar = new ImageFilterMenuBar();

        originalLabel = new JLabel("Test1");
        filteredImage = new JLabel("Test2");

        Component verticalStrut = Box.createVerticalStrut(10);

        JPanel central = new JPanel();
        central.add(originalLabel);
        central.add(verticalStrut);
        central.add(filteredImage);


        add(new RadioButtonsPanel(), BorderLayout.SOUTH);
        add(central, BorderLayout.CENTER);

        setJMenuBar(menuBar);
    }

}

MenuBar类:

public class ImageFilterMenuBar extends JMenuBar{

    private JMenu fileMenu;
    private JMenuItem openImage;
    private JMenuItem exit;


    public ImageFilterMenuBar(){
        initCompoments();
    }

    private void initCompoments() {
        fileMenu = new JMenu("File");
        setMenuItems();
        add(fileMenu);
    }

    private void setMenuItems(){
        openImage = new JMenuItem("Open Image");
        exit = new JMenuItem("Exit");

        openImage.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
                InputEvent.CTRL_MASK));

        exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_CANCEL,InputEvent.SHIFT_MASK));

        openImage.addActionListener(new OpenListener());
        exit.addActionListener(new ExiteListener());

        fileMenu.add(openImage);
        fileMenu.add(exit);
    }

}

在 MenuBar 类中,您可以使用 OpenButton。它打开 JFileChooser 并返回我选择的文件的 url。所以现在我不知道如何将这个 url 发送到我想显示这个文件的 MainFrame 类中。有什么想法吗?

4

2 回答 2

4

最简单的解决方案是将引用传递MainFrameImageFilterMenuBar

ImageFilterMenuBar menuBar = new ImageFilterMenuBar(this);

然后,在 MainFrame 中添加如下方法:

public void setImageFile(File file) {
  // do whatever here
}

在中,ImageFilterMenuBar您将保留对MainFrame成员变量中的引用,并setImageFile()JFileChooser返回文件后使用它来调用。

更难实现的解决方案是实现观察者模式。这就是监听器在 Swing 中的工作方式。您将主框架注册为侦听器,而另一个类将是通知文件选择更改的类。

要打开文件选择器并获取所选文件:

JFileChooser chooser = new JFileChooser(path);
int result = chooser.showOpenDialog(mainFrame);
File file = chooser.getSelectedFile();
if (result == JFileChooser.APPROVE_OPTION && file != null && file.exists()) {
  mainFrame.setImageFile(file);
}
于 2012-09-21T11:47:43.300 回答
2

不要扩展菜单栏或框架,只需在同一个应用程序中保留对它们的引用。..

我正要添加“具有 URL 类属性”。但不清楚您如何使用该 URL。如果是针对 aJEditorPane我可能会声明它的实例来代替 URL 属性,并直接在侦听器中的选择上设置页面。

于 2012-09-21T11:59:11.470 回答