使用框架状态变量更新 JFrame 中的 JPanel 内容
Updating JPanel content in JFrame by using a frame state variable
我正在尝试找到一种在更改状态变量后如何更新面板内容的方法。
具体在下面的例子中,JFrame里面有一个简单的JPanel,有两个按钮。当应用程序启动时,它的状态变量 ("window") 等于 "home" 因此主页按钮应该是不可见的。单击页面按钮后,状态变量会发生变化,因此两个按钮的可见性在框架重绘后都会发生变化。 (即页面按钮应该消失,主页按钮应该出现)。
在这种情况下,可以在没有状态变量的情况下仅使用按钮的 setVisibility() 方法来解决它。但是在我的应用程序中,我希望有更多的 JComponetns 连接到状态变量。有什么办法吗?
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class JPanelUpdateTest {
private JFrame frame;
private String window = "home";
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JPanelUpdateTest window = new JPanelUpdateTest();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public JPanelUpdateTest() {
initialize();
}
private void initialize() {
frame = new JFrame("JPanelUpdateTest");
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
frame.getContentPane().add(panel, BorderLayout.CENTER);
JButton btnHome = new JButton("home");
btnHome.setVisible(window == "home" ? false : true);
btnHome.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
window = "page";
panel.revalidate();
frame.repaint();
}
});
panel.add(btnHome);
JButton btnPage = new JButton("page");
btnPage.setVisible(window == "page" ? false : true);
btnPage.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
window = "home";
panel.revalidate();
frame.repaint();
}
});
panel.add(btnPage);
}
}
问题是 initialize 只在创建对象时被调用一次,它 应该 只被调用一次,因此 setVisible(...)
代码是没有被 ActionListeners 调用。相反,您需要将更改视图的机制放在 ActionListeners 本身中,而不仅仅是更改状态,除非您使用 "bound property" 和 PropertyChangeListeners.
我自己,我建议使用 CardLayout 来帮助您进行交换,而不是直接更改字符串,而是调用 class 的 public 方法——计划何时以及是否ActionListener(控制器)代码曾经从视图中删除 class.
此外,关于:
btnPage.setVisible(window == "page" ? false : true);
不要使用 ==
或 !=
比较字符串。请改用 equals(...)
或 equalsIgnoreCase(...)
方法。了解 ==
检查两个 对象引用 是否相同,这不是您感兴趣的。另一方面,这些方法检查两个字符串是否相同字符顺序相同,这就是这里的重点。
此外,如果您只想更改 JButton 正在执行的文本和行为,那么您可以通过使用 setText(...)
仅更改文本来轻松更改它,如果要进行更深层次的更改,调用 setAction(Action action)
更改文本和状态。
我正在尝试找到一种在更改状态变量后如何更新面板内容的方法。
具体在下面的例子中,JFrame里面有一个简单的JPanel,有两个按钮。当应用程序启动时,它的状态变量 ("window") 等于 "home" 因此主页按钮应该是不可见的。单击页面按钮后,状态变量会发生变化,因此两个按钮的可见性在框架重绘后都会发生变化。 (即页面按钮应该消失,主页按钮应该出现)。
在这种情况下,可以在没有状态变量的情况下仅使用按钮的 setVisibility() 方法来解决它。但是在我的应用程序中,我希望有更多的 JComponetns 连接到状态变量。有什么办法吗?
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class JPanelUpdateTest {
private JFrame frame;
private String window = "home";
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JPanelUpdateTest window = new JPanelUpdateTest();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public JPanelUpdateTest() {
initialize();
}
private void initialize() {
frame = new JFrame("JPanelUpdateTest");
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
frame.getContentPane().add(panel, BorderLayout.CENTER);
JButton btnHome = new JButton("home");
btnHome.setVisible(window == "home" ? false : true);
btnHome.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
window = "page";
panel.revalidate();
frame.repaint();
}
});
panel.add(btnHome);
JButton btnPage = new JButton("page");
btnPage.setVisible(window == "page" ? false : true);
btnPage.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
window = "home";
panel.revalidate();
frame.repaint();
}
});
panel.add(btnPage);
}
}
问题是 initialize 只在创建对象时被调用一次,它 应该 只被调用一次,因此 setVisible(...)
代码是没有被 ActionListeners 调用。相反,您需要将更改视图的机制放在 ActionListeners 本身中,而不仅仅是更改状态,除非您使用 "bound property" 和 PropertyChangeListeners.
我自己,我建议使用 CardLayout 来帮助您进行交换,而不是直接更改字符串,而是调用 class 的 public 方法——计划何时以及是否ActionListener(控制器)代码曾经从视图中删除 class.
此外,关于:
btnPage.setVisible(window == "page" ? false : true);
不要使用 ==
或 !=
比较字符串。请改用 equals(...)
或 equalsIgnoreCase(...)
方法。了解 ==
检查两个 对象引用 是否相同,这不是您感兴趣的。另一方面,这些方法检查两个字符串是否相同字符顺序相同,这就是这里的重点。
此外,如果您只想更改 JButton 正在执行的文本和行为,那么您可以通过使用 setText(...)
仅更改文本来轻松更改它,如果要进行更深层次的更改,调用 setAction(Action action)
更改文本和状态。