在 JFrame 上的 JPanel 之间切换
Switching between JPanels on a JFrame
目前仅出于测试目的,我想在每次单击 JFrame 时更改 JPanel。我循环浏览 3 panels/pages 个,每个都有其独特的背景颜色。
目前它会改变,但只会在第一个添加的面板上绘制,否则显示默认的灰色。
代码:
@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 提到我下面的代码不符合最佳实践,请参考以下内容 link 如何使用 CardLayout。
How to use CardLayout - The Java Tutorials
just for testing purposes
继续强调上面的内容,这里有一些示例代码。这是 NOT 生产级,只是一个 POC,不需要 @camickr 提到的 CardLayout。
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,0,100, 40);
panelOne.setBackground(Color.BLACK);
panelOne.add(lblPanelOne);
panelTwo = new JPanel();
lblPanelTwo = new JLabel("Panel Two");
panelTwo.setBounds(0,0,100, 40);
panelTwo.setBackground(Color.BLUE);
panelTwo.add(lblPanelTwo);
panelThree = new JPanel();
lblPanelThree = new JLabel("Panel Three");
panelThree.setBounds(0,0,100, 40);
panelThree.setBackground(Color.GREEN);
panelThree.add(lblPanelThree);
b=new JButton("Panel Two");
b.setBounds(130,100,100, 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;
}
}
}
}
目前仅出于测试目的,我想在每次单击 JFrame 时更改 JPanel。我循环浏览 3 panels/pages 个,每个都有其独特的背景颜色。
目前它会改变,但只会在第一个添加的面板上绘制,否则显示默认的灰色。
代码:
@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 提到我下面的代码不符合最佳实践,请参考以下内容 link 如何使用 CardLayout。
How to use CardLayout - The Java Tutorials
just for testing purposes
继续强调上面的内容,这里有一些示例代码。这是 NOT 生产级,只是一个 POC,不需要 @camickr 提到的 CardLayout。
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,0,100, 40);
panelOne.setBackground(Color.BLACK);
panelOne.add(lblPanelOne);
panelTwo = new JPanel();
lblPanelTwo = new JLabel("Panel Two");
panelTwo.setBounds(0,0,100, 40);
panelTwo.setBackground(Color.BLUE);
panelTwo.add(lblPanelTwo);
panelThree = new JPanel();
lblPanelThree = new JLabel("Panel Three");
panelThree.setBounds(0,0,100, 40);
panelThree.setBackground(Color.GREEN);
panelThree.add(lblPanelThree);
b=new JButton("Panel Two");
b.setBounds(130,100,100, 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;
}
}
}
}