问题描述
目前仅出于测试目的,我想在每次单击 JFrame 时更改 JPanel。我正在循环浏览 3 个面板/页面,每个面板/页面都有其独特的背景颜色。
目前它会改变,但只在添加的第一个面板时绘制,否则显示默认灰色。
代码:
@Override
public void mouseClicked(MouseEvent e) {
mainFrame.changePage();
}
public void changePage() {
if(currentPage != null) {
this.remove(currentPage);
}
currentPage = pages[pageNumber];
this.add(currentPage);
currentPage.setPage();
super.repaint();
pageNumber++;
if(pageNumber > 2) {
pageNumber = 0;
}
}
解决方法
除了@camickr 的评论要使用 CardLayout
,您还需要 revalidate
。更改:
super.repaint();
到
revalidate();
,
编辑:由于@camickr 在下面提到我的代码不符合最佳实践,请参阅以下有关如何使用 CardLayout 的链接。
How to use CardLayout - The Java Tutorials
仅供测试使用
重点放在上面,这里是一些示例代码。这是非生产级,只是一个不需要@camickr提到的CardLayout的POC。
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class FirstSwingExample {
public static void main(String[] args) {
Swinger s = new Swinger();
}
}
class Swinger implements ActionListener {
int currFrame = 1;
JFrame f;
JLabel lblPanelOne,lblPanelTwo,lblPanelThree;
JPanel panelOne,panelTwo,panelThree;
JButton b;
public Swinger() {
setup();
}
private void setup() {
f=new JFrame();
panelOne = new JPanel();
lblPanelOne = new JLabel("Panel One");
panelOne.setBounds(0,100,40);
panelOne.setBackground(Color.BLACK);
panelOne.add(lblPanelOne);
panelTwo = new JPanel();
lblPanelTwo = new JLabel("Panel Two");
panelTwo.setBounds(0,40);
panelTwo.setBackground(Color.BLUE);
panelTwo.add(lblPanelTwo);
panelThree = new JPanel();
lblPanelThree = new JLabel("Panel Three");
panelThree.setBounds(0,40);
panelThree.setBackground(Color.GREEN);
panelThree.add(lblPanelThree);
b=new JButton("Panel Two");
b.setBounds(130,40);
b.setActionCommand("click");
b.addActionListener(this);
panelOne.setVisible(true);
f.add(panelOne);
f.add(b);
f.setSize(400,500);
f.setLayout(null);
f.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
if(e.getActionCommand().equals("click")) {
switch(currFrame) {
case 1:
panelOne.setVisible(false);
f.remove(panelOne);
panelTwo.setVisible(true);
f.add(panelTwo);
b.setText("Panel Three");
currFrame++;
break;
case 2:
panelTwo.setVisible(false);
f.remove(panelTwo);
f.add(panelThree);
panelThree.setVisible(true);
b.setText("Panel One");
currFrame++;
break;
default:
panelThree.setVisible(false);
f.remove(panelThree);
f.add(panelOne);
panelOne.setVisible(true);
b.setText("Panel Two");
currFrame = 1;
break;
}
}
}
}