我知道有类似的问题,但我有一些不同的问题...
我想在单击按钮后删除 JFrame 的所有元素:
有效:
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0)
{
frame.getContentPane().removeAll();
frame.revalidate();
frame.repaint();
}
});
所有元素都消失了。但是在那之后我需要在这个 JFrame 上放置元素...在上面的这 3 行之后(frame.repaint()
下方)我调用方法 initialize
(我调用的方法我在开始时创建了我的窗口):
private void initialize()
{
frame = new JFrame();
frame.setBounds(100, 100, 1454, 860);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JButton btnNewSubject = new JButton("New subject");
btnNewSubject.setBounds(647, 788, 137, 23);
frame.getContentPane().add(btnNewSubject);
JButton btnRefresh = new JButton("Refresh");
btnRefresh.setBounds(1339, 788, 89, 23);
frame.getContentPane().add(btnRefresh);
JLabel lblNewLabel = new JLabel("Subject");
lblNewLabel.setBounds(235, 11, 75, 14);
frame.getContentPane().add(lblNewLabel);
JLabel lblOwner = new JLabel("Owner");
lblOwner.setBounds(662, 11, 46, 14);
frame.getContentPane().add(lblOwner);
JLabel lblStatus = new JLabel("Status");
lblStatus.setBounds(883, 11, 46, 14);
frame.getContentPane().add(lblStatus);
JLabel lblDateOfAdded = new JLabel("Date of added");
lblDateOfAdded.setBounds(1104, 11, 116, 14);
frame.getContentPane().add(lblDateOfAdded);
}
没有任何反应。 :( JFrame 仍然是空的。即使我调用 revalidate 和 repaint()。
怎么了?
最佳答案
您在这里的方法中创建了一个全新的 JFrame
frame = new JFrame();
并且您从不显示它,您从不对其调用 setVisible(true)
,因此它将保持不可见状态。听起来好像您正在创建两个 JFrames 而没有意识到,您正在向第二个未显示的 JFrame 添加组件,但只显示第一个 JFrame,即没有新组件的那个。
更重要的是,您需要使用 CardLayout 来帮助您交换 JPanel View ,因为它正是为这种情况而构建的。此外,您的程序使用 null 布局和 setBounds(...) 会导致僵硬的 GUI 在一个系统上看起来不错,但在任何其他系统或屏幕分辨率上通常看起来很差。以这种方式创建的程序很难调试、维护和升级。而是使用布局管理器,因为这是他们擅长的:创建可以轻松增强和更改的复杂灵活的 GUI。
请注意,您的 removeAll()
调用不会像 Ludovic 所说的那样删除根 Pane ,因为您是在 contentPane 而不是 JFrame 上调用它,并且 contentPane 不包含根 Pane 。
编辑
例如,
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class CardLayoutEg extends JPanel {
private CardLayout cardlayout = new CardLayout();
private TitlePanel titlePanel = new TitlePanel(this);
private SubjectPanel subjectPanel = new SubjectPanel(this);
public CardLayoutEg() {
setLayout(cardlayout);
add(titlePanel, titlePanel.getName());
add(subjectPanel, subjectPanel.getName());
}
public void nextCard() {
cardlayout.next(this);
}
public void showCard(String key) {
cardlayout.show(this, key);
}
private static void createAndShowGui() {
JFrame frame = new JFrame("CardLayout Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new CardLayoutEg());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class TitlePanel extends JPanel {
public static final String TITLE_PANEL = "title panel";
private static final int PREF_W = 900;
private static final int PREF_H = 750;
private static final String TITLE = "My Application Title";
private static final float POINTS = 46f;
private CardLayoutEg cardLayoutEg;
public TitlePanel(CardLayoutEg cardLayoutEg) {
setName(TITLE_PANEL);
this.cardLayoutEg = cardLayoutEg;
JLabel titleLabel = new JLabel(TITLE, SwingConstants.CENTER);
titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD, POINTS));
JButton subjectButton = new JButton(new SubjectAction("Subjects"));
JPanel buttonPanel = new JPanel();
buttonPanel.add(subjectButton);
setLayout(new BorderLayout());
add(titleLabel, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.PAGE_END);
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
private class SubjectAction extends AbstractAction {
public SubjectAction(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
cardLayoutEg.showCard(SubjectPanel.SUBJECT_PANEL);
}
}
}
class SubjectPanel extends JPanel {
public static final String SUBJECT_PANEL = "subject panel";
private static final String[] COLUMN_NAMES = {"Subject", "Owner", "Status", "Date Added"};
DefaultTableModel tableModel = new DefaultTableModel(COLUMN_NAMES, 10);
private JTable table = new JTable(tableModel);
private CardLayoutEg cardLayoutEg;
public SubjectPanel(CardLayoutEg cardLayoutEg) {
setBorder(BorderFactory.createTitledBorder("Subject Panel"));
setName(SUBJECT_PANEL);
this.cardLayoutEg = cardLayoutEg;
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(1, 0, 10, 0));
buttonPanel.add(new JButton("New Subject"));
buttonPanel.add(new JButton("Refresh"));
buttonPanel.add(new JButton(new TitleAction("Title")));
buttonPanel.add(new JButton(new ExitAction("Exit")));
JPanel bottomPanel = new JPanel();
bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.LINE_AXIS));
bottomPanel.add(Box.createHorizontalGlue());
bottomPanel.add(buttonPanel);
setLayout(new BorderLayout());
add(new JScrollPane(table), BorderLayout.CENTER);
add(bottomPanel, BorderLayout.PAGE_END);
}
private class TitleAction extends AbstractAction {
public TitleAction(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
cardLayoutEg.showCard(TitlePanel.TITLE_PANEL);
}
}
private class ExitAction extends AbstractAction {
public ExitAction(String name) {
super(name);
int mnemonic = KeyEvent.VK_X;
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
Component component = (Component) e.getSource();
Window win = SwingUtilities.getWindowAncestor(component);
win.dispose();
}
}
}
关于java - 如何刷新 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27277800/