我正在尝试创建一个刷新按钮,当我单击按钮时,它将基本上重新启动程序。我不知道该怎么做才能做到这一点。
我已经决定使用图形用户界面完成此操作。任何和所有的帮助将不胜感激。
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();
}
}
答案 0 :(得分:2)
刷新或重启是什么意思?
你的意思是:
首先需要确定应用程序刷新的实际内容。你已经谈过一个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()
的帮助下,Insets
与Border
进行对比
您可能希望使用Insets
或Border
和JFrame.pack()
来玩,而不是手动设置尺寸,以获得合适的窗口布局。手动设置大小假定您对屏幕分辨率和用户的字体大小有很多了解。
pack()
方法根据内容执行自动大小计算。 Insets
和Border
允许您在组件周围创建一些空间和边框,即使有一些设计或标签也是如此,因此它们不会在窗口中紧紧夹住,但间隔很好。
答案 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个。