java - 如何将我的程序拆分为多个类?

标签 java swing class

目的是用 swing 组件构建一个简单的 Java Web 浏览器,并将 JEditorPane 存储在一个类中,将地址栏和要添加的 JButton 存储在另一个类中。我如何让他们像所有东西都在同一个类中时那样相互交互?

原始类:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class JavaBrowser extends JFrame {

private JTextField addressBar;
private JEditorPane contentDisplay;

public JavaBrowser() {

    super("Java Browser v1.0");

    addressBar = new JTextField("Enter URL here, then press enter");
    addressBar.addActionListener(       
    new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            loadContent(event.getActionCommand());
        }
    }   
    );

    add(addressBar, BorderLayout.NORTH);

    contentDisplay = new JEditorPane();
    contentDisplay.setEditable(false);
    contentDisplay.addHyperlinkListener(
            new HyperlinkListener() {
                public void hyperlinkUpdate(HyperlinkEvent event) {
                        if(event.getEventType()==HyperlinkEvent.EventType.ACTIVATED) {
                        loadContent(event.getURL().toString());
                    }
                }
            }
    );

    add(new JScrollPane(contentDisplay), BorderLayout.CENTER);
    setSize(500, 300);
    setVisible(true);
}

public void loadContent(String userInput) {
    try
    {
        contentDisplay.setPage(userInput);
        addressBar.setText(userInput);
    }
    catch (Exception e)
    {
        System.out.println("Invalid URL entered in the address bar!");
    }
}

}

JEditorPane 类:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class JavaBrowser extends JFrame {

private JEditorPane contentDisplay;

public JavaBrowser() {

    super("Java Browser v1.0");

    contentDisplay = new JEditorPane();
    contentDisplay.setEditable(false);
    contentDisplay.addHyperlinkListener(
            new HyperlinkListener() {
                public void hyperlinkUpdate(HyperlinkEvent event) {
                    if(event.getEventType()==HyperlinkEvent.EventType.ACTIVATED) {
                        loadContent(event.getURL().toString());
                    }
                }
            }
    );

    add(new JScrollPane(contentDisplay), BorderLayout.CENTER);
    setSize(500, 300);
    setVisible(true);
}

public void loadContent(String userInput) {
    try
    {
        contentDisplay.setPage(userInput);
           ToolBar.getAddressBar().setText(userInput);
    }
    catch (Exception e)
    {
        System.out.println("Invalid URL entered in the address bar!");
    }
}

}

工具栏类:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;

public class ToolBar {

private static JTextField addressBar;

public static JTextField getAddressBar() {
    return addressBar;
}

public void setAddressBar(JTextField addressBar) {
    this.addressBar = addressBar;
}



public ToolBar() {

    JavaBrowser jb = new JavaBrowser();

    addressBar = new JTextField("Enter URL here, then press enter");
    addressBar.addActionListener(       
    new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            jb.loadContent(event.getActionCommand());
        }
    }   
    );

    jb.add(addressBar, BorderLayout.NORTH);

}

}

最佳答案

您的ToolBar类不是任何类型的Component。它可能应该扩展JPanel。您或许还应该将布局管理器添加到您的 JPanel 中。事实上,您可能应该使用更多的 JPanel,而不是将东西填充到 JFrame 中。

此外,您应该将代码分为 3 个类:一类用于浏览器,一类用于工具栏,一类控制两者。在该控制类中,创建一个 JavaBrowser 实例和一个 ToolBar 实例。更新 ToolBar 类,以便它可以存储对 JavaBrowser 的引用,并扩展 ToolBar 的构造函数以获取 JavaBrowser 的实例。将这两个东西放入控制类的 JPanel 中,并将该 JPanel 放入 JFrame 中。

我的 Swing 有点生锈了,但这里是一个努力:

public class MainApp extends JFrame{
    public MainApp(){
        JavaBrowser browser = new JavaBrowser();
        ToolBar toolbar = new ToolBar(browser);
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(browser, BorderLayout.CENTER);
        panel.add(toolbar, BorderLayout.NORTH);

        add(panel);
    }
}

public class ToolBar extends JPanel{
    public ToolBar(final JavaBrowser browser){
        super(new BorderLayout());
        JTextField addressBar = new JTextField("...");
        addressBar.addActionListener(new ActionListener(){
            @Override public void actionPerformed(ActionEvent e){ browser.loadContent(event.getActionCommand()); }
        });
        add(addressBar, BorderLayout.CENTER);
    }
}

public class JavaBrowser extends JPanel{
    public JavaBrowser(){
        super(new BorderLayout());
        JEditorPane editor = new JEditorPane();
        // set up all your stuff like properties and listeners to the editor
        add(editor, BorderLayout.CENTER);
    }

    // other methods such as loadContent(...)
}

然后,在某个类中(通常在 psvm 中)的某个时刻,您可以使用 SwingUtilities.invokeLater(r) 在 Swing UI 线程上启动 Swing 代码,其中 r 是一个 Runnable,它创建 Controller 的实例,设置其大小并调用 setVisible(true)

关于java - 如何将我的程序拆分为多个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29102331/

相关文章:

java - 无法理解类在 Scala 中的工作原理

java - 如何让 Servlet Filter 处理嵌入式 Jetty 中的欢迎文件?

java - 将 KeyListener 添加到 JToolTip

Java 即时创建类的实例

java - 错误;找不到标志;符号: variable super

java - 使用 JLabels 更新图像的正确方法

java - cucumber-Junit 断言失败 - 无法断言 '£' 符号

java - Hadoop reducer 上的奇怪行为

java - 用 Java 逐行比较文本文件

java - 插入带有动画的 JList