目的是用 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/