我正在构建一个程序,需要将当前可见的JPanel换成另一个。不幸的是,似乎有很多事情要做,我的所有尝试都以失败告终。我可以成功地让第一个JPanel出现在我的JFrame中,但是交换JPanel会产生一个空白的JFrame。
我的主要JFrame:
public class ShellFrame {
static CardLayout cl = new CardLayout(); //handles panel switching
static JFrame frame; //init swing on EDT
static MainMenu mm;
static Panel2 p2;
static Panel3 p3;
public static void main(String[] args) {
initFrame();
}
public static void initFrame() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame = new JFrame();
frame.setDefaultCloseOperation(3);
frame.setLayout(cl);
mm = new MainMenu();
pp = new PlacementPanel();
//first panel added to frame will always show first
frame.add(mm, "MainMenu");
frame.pack(); //sizes frame to fit the panel being shown
frame.setVisible(true);
}
});
}
public static void switchPanel(String name) {
cl.show(frame.getContentPane(), name);
frame.pack();
}
public static void updatePanel2(/* args */) {
frame.removeAll();
p2 = new Panel2(/* args */);
frame.add(pp, "PlacementPanel");
frame.pack();
frame.validate();
frame.repaint();
}
我尝试使用updatePanel2将现有面板换成新的Panel2,但它似乎无法正常工作。 Panel2在它自己的工作正常,但试图将它与我的程序结合使用只会产生一个空白窗口。任何帮助将不胜感激!
答案 0 :(得分:2)
that requires swapping out the current, visible JPanel with another
请查看CardLayout,了解如何正确完成此操作的完整示例。
答案 1 :(得分:0)
我有一个Swing应用程序'交换'当用户按下“空格”时的面板。键,显示正在运行的模拟的实时情节。我做的是这样的:
public class MainPanel extends JPanel implements Runnable {
// Called when the JPanel is added to the JFrame
public void addNotify() {
super.addNotify();
animator = new ScheduledThreadPoolExecutor(1);
animator.scheduleAtFixedRate(this, 0, 1000L/60L, TimeUnit.MILLISECONDS);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (spacePressed)
plot.render(g);
else
simulation.render(g);
}
public void run() {
simulation.update();
repaint();
}
}
public class PlotView {
public void render(Graphics g) {
//draw the plot here
}
}
public class SimulationView {
public void render(Graphics g) {
//draw simulation here
}
}
这适用于我的直播情节'问题。还有CardLayout
方法,如果遇到问题,您可以将其变成一个新的单独问题。祝你好运!
答案 2 :(得分:0)
您应该对要更换的面板.setVisible(false);
进行操作。
这是一个工作示例,当您按“ENTER”时它会切换面板; 如果在IDE中复制它,则自动获取导入(在Eclipse中移位+ o);
public class MyFrame extends JFrame implements KeyListener {
private JButton button = new JButton("Change Panels");
private JPanel panelOnFrame = new JPanel();
private JPanel panel1 = new JPanel();
public MyFrame() {
// adding labels to panels, to distinguish them
panelOnFrame.add(new JLabel("panel on frame"));
panel1.add(new JLabel("panel 1"));
setSize(new Dimension(250,250));
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(button);
add(panelOnFrame);
setVisible(true);
addKeyListener(this);
addKeyListener(this);
setFocusable(true);
}
public static void main(String[] args) {
MyFrame frame = new MyFrame();
}
@Override
public void keyPressed(KeyEvent k) {
if(k.getKeyCode() == KeyEvent.VK_ENTER){
// + -------------这是替代品:
panelOnFrame.setVisible(false);
this.add(panel1);
}
}
@Override
public void keyReleased(KeyEvent arg0) {
}
@Override
public void keyTyped(KeyEvent arg0) {
}
}