java - 用按钮刷新java程序

标签 java swing button refresh listener

我正在尝试制作一个刷新按钮,当我单击该按钮时,该按钮基本上会重新启动程序。我不知道我应该如何去做这件事。

我已经放置了我决定使用的图形用户界面来完成此操作。任何和所有的帮助将不胜感激。

package pdfView;

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

public class View extends JFrame {
    public View() {
        super("PDF Viewer");
        setLookAndFeel();
        setSize(500, 125);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        FlowLayout flo = new FlowLayout();
        setLayout(flo);
        JTextField Search = new JTextField ("Search", 29);
        JButton Search1 = new JButton("Search");
        //this is where i have the button 
        JButton ReFresh = new JButton("ReFresh");
        add(Search);
        add(Search1);
        add(ReFresh);

        setVisible(true);
    }

    private void setLookAndFeel() {
        try {
            UIManager.setLookAndFeel(
                    "com.sun.java.squing.plaf.nimbus.NimbusLookAndFeel"
                    );
        } catch (Exception exc){

        }
    }

    public static void main(String[] args) {
        View pdf = new View();
    }

} 

最佳答案

刷新或重新启动是什么意思?

你的意思是:

  1. 让应用保持原样,只更新其显示的内容?
  2. 真的要重新启动应用程序吗?

更新应用程序显示的内容

您首先需要决定实际应该导致应用程序刷新的原因。您已经讨论过 Button。激活按钮之类的机制称为Action。您可以使用 ActionListener 手动执行这些操作,也可以扩展 AbstractAction,这是我推荐的。扩展 AbstractAction 允许您在 UI 上的多个位置使用相同的逻辑操作。看看典型的应用程序,它们通过菜单、工具栏、弹出菜单和键盘快捷键提供剪切/复制/粘贴。在 Java 中实现此目的的最简单方法是通过扩展 AbstractAction 来使用 Action

更新应用程序需要调用的方法是 invalidate()validate()repaint()

重新启动应用程序

那么您想再次运行 main() 吗?这实际上不是必需的,除非您有一个支持自身更新的应用程序。即使这样,有时也可以通过巧妙地使用ClassLoader来避免这种情况。

关于代码的更多注释

扩展反模式的使用

我不会仅仅为了在屏幕上显示一个窗口而扩展JFrame。扩展使用是一种反模式。您无需扩展 JFrame 即可在屏幕上显示 JFrame 并执行您想要的操作。

引用静态成员

我会通过常量的原始声明来引用常量。 IE。我会通过 WindowConstants.EXIT_ON_CLOSE 引用 EXIT_ON_CLOSE,而不是 JFrame.EXIT_ON_CLOSE

打字错误

您的 UIManager.setLookAndFeel() 代码中有拼写错误。搜索 swing,您会看到拼写错误。

异常信息

您实际上可能想使用 exc.printStackTrace() 将异常打印到 stderr,而不是完全忽略它,因为当您在 LaF 类名中出现拼写错误时,正如您所做的那样,并且不打印异常,您实际上可能不知道出了什么问题。

小部件构造顺序和UIManager.setLookAndFeel()

UIManager.setLookAndFeel() 的顺序和通过 super(...) 有效的 new JFrame() 并不能保证你整个 UI 将采用 Nimbus,其中部分可能仍采用 Metal。为了安全起见,我建议在构建第一个小部件之前设置 LaF。据我记得,不能保证在组件构建后更改 LaF 会产生效果,除非您告诉 UIManager 更新 LaF。另请参阅 UIManager 文档中的引用:

Once the look and feel has been changed it is imperative to invoke updateUI on all JComponents. The method SwingUtilities.updateComponentTreeUI(java.awt.Component) makes it easy to apply updateUI to a containment hierarchy. Refer to it for details. The exact behavior of not invoking updateUI after changing the look and feel is unspecified. It is very possible to receive unexpected exceptions, painting problems, or worse.

http://docs.oracle.com/javase/8/docs/api/javax/swing/UIManager.html

setSize()pack() 的比较,在 InsetsBorder 的帮助下

您可能希望使用 InsetsBorderJFrame.pack() 来获取大小,而不是手动设置大小一个不错的窗口布局。手动设置大小假设您非常了解用户的屏幕分辨率和字体大小。 pack() 方法根据内容执行自动大小计算。 InsetsBorder 允许您在组件周围创建一些空间和边框,即使有一些设计或标签,这样它们就不会被紧紧地挤在窗口中,而是间隔良好.

关于java - 用按钮刷新java程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27828079/

相关文章:

java - 向下转换 Graphics 实例 - 为什么允许这样做?

java - 字符串无法转换为 java 错误

twitter-bootstrap - 带有中心底切的 Bootstrap 按钮

java - 如何使用java为MySQL启用LDAP连接?

java - 使用adjustViewBounds和scaleType后ImageView左右两边仍然出现空白

java - 如何创建一个方法来获取 HashMap 中值(字符串)的键

java - 在 GUI 中处理未处理的异常

java - 使用 thread.start() 连续调用重绘不起作用

asp.net - 确认 javascript 和 ASP.net 中的警告框,如 Hotmail

java.math.BigDecimal 无法转换为 [Ljava.lang.Object;