【问题标题】:How to open a URL in Java from a Swing app?如何从 Swing 应用程序中打开 Java 中的 URL?
【发布时间】:2021-11-14 06:45:18
【问题描述】:

我用 GUI 编写了这段代码来打开 URL。代码如下:

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

class TextFieldExample
{  
    public static void main(String args[])  
    {  
        JFrame f= new JFrame("TextField Example");  
        JTextField turl;  
        turl=new JTextField();  
        turl.setBounds(100,50, 300,50);  

        Font font = new Font("Georgia", Font.BOLD,20);
        turl.setFont(font);
        String url=turl.getText(); 

        JButton b1=new JButton(new ImageIcon("button.png"));  
        b1.setBounds(138,100,230,60); 

        b1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                try {
                    Desktop desktop = java.awt.Desktop.getDesktop();
                    URI oURL = new URI(url);
                    desktop.browse(oURL);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }});
        f.add(b1);
        f.add(turl); 
        f.setSize(500,300);  
        f.setLayout(null);  
        f.setVisible(true);//56 
    }  
}

但是当我运行它并输入一个 URL 时,它正在打开文件资源管理器。有人能找到解决办法吗?

【问题讨论】:

  • 它正在打开文件资源管理器 - 你想发生什么?您在文本字段中输入了什么文本?
  • 请了解如何正确格式化您的代码。如果在复制之前它的格式正确,您应该在提交问题之前查看预览以确保它看起来不错。没有任何借口可以发布难以阅读的内容。
  • 您正在使用browse method,它旨在完全按照您的描述发生。如果您还有其他期待,那么我建议您对这些工具进行更多研究,以确保您使用的是正确的工具。
  • 在 UI 还没有显示之前,您在 main 方法中获得了 url,然后您在 actionPerformed 方法中没有获得它,因此 URL 将始终是空字符串。
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: java swing url


【解决方案1】:

Oracle 有一个有用的教程,Creating a GUI With Swing。跳过 Netbeans 部分。

这是我创建的修改后的 GUI。您为JTextField 选择的字体导致JTextField 相当宽。

我做的第一件事是通过调用SwingUtilitiesinvokeLater 方法来启动Swing GUI。此方法确保在Event Dispatch Thread 上创建和执行 Swing 组件。

我将JFrame 的创建与JPanel 的创建分开。尽管您可以将 Swing 组件直接放置在 JFrame 上,但更明智的做法是创建一个或多个 JPanels 以放置在 JFrame 上。

JFrame 方法必须按特定顺序调用。这是我用于所有 Swing 应用程序的顺序。

JFrame 有一个默认的BorderLayout,我使用了它。我使用BorderLayout 来创建JPanel 来保存JTextFieldJButton

我将 ActionListener 移到了它自己的类中。大多数 Swing 应用程序都需要多个类,因此您不妨现在就习惯这个想法。

这是完整的、可运行的代码。我将 URLListener 类设为内部类,因此我可以将此代码作为一个块发布。

import java.awt.BorderLayout;
import java.awt.Desktop;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URI;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class TextFieldExample implements Runnable {

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new TextFieldExample());
    }
    
    private JTextField urlTextField;
    
    @Override
    public void run() {
        JFrame f = new JFrame("TextField Example");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        f.add(createMainPanel(), BorderLayout.CENTER);

        f.pack();
        f.setLocationByPlatform(true);
        f.setVisible(true);
    }
    
    private JPanel createMainPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        
        urlTextField = new JTextField(40);
        Font font = new Font("Georgia", Font.BOLD, 20);
        urlTextField.setFont(font);
        panel.add(urlTextField, BorderLayout.NORTH);

        JButton b1 = new JButton("Submit URL");
        b1.addActionListener(new URLListener());
        panel.add(b1, BorderLayout.SOUTH);
        
        return panel;
                
    }
    
    public class URLListener implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            try {
                Desktop desktop = java.awt.Desktop.getDesktop();
                URI oURL = new URI(urlTextField.getText().trim());
                desktop.browse(oURL);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

}

【讨论】:

  • URI oURL = new URI(urlTextField.getText().trim()); 这确实是解决方案的核心。 IE。 // Get the text when the action is performed.。是否可以将该内部类移到源代码的顶部,并添加注释以突出显示它?如果解决方案位于顶部,无需滚动即可看到,那就太好了。
  • 注意到您进行了编辑以恳求人们提供帮助,我很惊讶您在没有对提供一些答案的单一答案发表任何评论的情况下进行了编辑。这个答案不能解决问题吗?为什么不呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 2014-06-12
  • 2011-01-20
  • 1970-01-01
相关资源
最近更新 更多