使用Button刷新java程序

时间:2015-01-07 20:28:47

标签: 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();
    }

} 

2 个答案:

答案 0 :(得分:2)

刷新或重启是什么意思?

你的意思是:

  1. 让应用程序保持原样,只需更新它显示的内容?
  2. 真的重启了应用程序?
  3. 更新应用程序显示的内容

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

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

    重新启动应用程序

    您想再次浏览main()吗?除非您有一个支持自我更新的应用程序,否则实际上不需要这样做。即便如此,有时可以通过智能使用ClassLoader来避免它。

    关于代码的更多说明

    使用扩展名反模式

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

    引用静态成员

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

    错字

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

    例外信息

    您可能实际上想要使用stderr将例外打印到exc.printStackTrace()而不是完全忽略它,因为当您在LaF班级名称中输入拼写错误时,就像你一样,并且你没有&#39} ;打印异常,你可能真的不知道出了什么问题。

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

    UIManager.setLookAndFeel()和有效new JFrame()来自super(...)的序列并不能保证整个用户界面都在Nimbus中,部分可能仍在Metal中。我建议在构建第一个小部件之前设置LaF,以确保安全。据我记忆,除非你告诉UIManager更新LaF,否则不能保证在组件构造后更改LaF有效。另请参阅UIManager的文档中的引用:

      

    一旦外观发生变化,就必须在所有JComponents上调用updateUI。 SwingUtilities.updateComponentTreeUI(java.awt.Component)方法可以轻松地将updateUI应用于包含层次结构。有关详细信息,请参阅它。更改外观后未调用updateUI的确切行为未指定。很可能会收到意外的异常,绘画问题或更糟糕的情况。

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

    setSize()pack() 的帮助下,

    InsetsBorder进行对比

    您可能希望使用InsetsBorderJFrame.pack()来玩,而不是手动设置尺寸,以获得合适的窗口布局。手动设置大小假定您对屏幕分辨率和用户的字体大小有很多了解。 pack()方法根据内容执行自动大小计算。 InsetsBorder允许您在组件周围创建一些空间和边框,即使有一些设计或标签也是如此,因此它们不会在窗口中紧紧夹住,但间隔很好。

答案 1 :(得分:1)

首先,您必须为ReFresh Jbutton分配actionListener

你可以在类中实现ActionListener接口,并覆盖像这样的actionPerformed()方法

public class View extends JFrame implements ActionListener{

private JButton ReFresh;

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 
    ReFresh = new JButton("ReFresh");
    ReFresh.addActionListener(this);
    add(Search);
    add(Search1);
    add(ReFresh);

    setVisible(true);
}

private void setLookAndFeel() { //right way for nimbus: http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/nimbus.html
   try {
        for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
             if ("Nimbus".equals(info.getName())) {
                  UIManager.setLookAndFeel(info.getClassName());
                  break;
             }
         }
   }
   catch (Exception e) {
       e.printStackTrace();
   }
}

@Override
public void actionPerformed(ActionEvent e)
{
    if(e.equals(ReFresh))
    {
        super.repaint();
    }
}}

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

或者你可以对addActionListener进行内联赋值,就像这样

ReFresh.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                super.repaint();
            }
        });

您可以尝试使用这些方法刷新/重新加载JFrame,

invalidate();
validate();
repaint();

您还可以使用dispose();然后new View();创建新的JFrame,但按此顺序关闭窗口并创建新窗口。

或者你甚至可以尝试setVisible(false);然后setVisible(true);

我推荐前3个。