java可以面板重叠不,java – 重叠面板摆动

我正在尝试执行以下布局,其中所有JPanels在程序启动时除panel2外都可见.当用户单击btn1时,JCalendar和panel3将设置为不可见,并且panel2变为可见.我遇到的问题是panel2没有显示btn1被点击.但是,如果我将panel2的borderlayout更改为未使用的(在这种情况下为WEST),它将显示单击按钮的时间,但它在左侧对齐,我希望它在整个表单中居中.

码:

public class GUI extends JFrame implements ActionListener, PropertyChangeListener

{

private JPanel panel1, panel2, panel3;

private com.toedter.calendar.JCalendar calendar;

private Button btn1, btn2;

private JLabel label1, label2;

public GUI()

{

init();

}

private void init()

{

//panel1 components

panel1 = new JPanel();

btn1 = new JButton("Click me");

panel1.add(btn1);

//panel2 components

panel2 = new JPanel();

label1 = new JLabel("Time:");

label2 = new JLabel("Date:");

panel2.add(label1); panel2.add(label2);

//JCalendar

calendar = new com.toedter.calendar.JCalendar();

//panel3

panel3 = new JPanel();

//Add panels to JFrame

add(panel1, BorderLayout.NORTH);

add(calendar, BorderLayout.CENTER);

add(panel2, BorderLayout.CENTER); //if i set this to WEST it show!!

add(panel3, BorderLayout.EAST);

//event handling

btn1.addActionListener(this);

//hide panel2

panel2.setVisible(false);

pack();

}

public void actionPerformed(ActionEvent ae)

{

if(ae.getSource().equals(btn1)

{

calendar.setVisible(false);

panel3.setVisible(false);

panel2.setVisible(true); //make panel2 visible

panel2.updateUI();

revalidate();

repaint();

}

}

public static void main(String args[])

{

javax.swing.SwingUtilities.invokeLater(new Runnable()

{

public void run()

{

new GUI().setVisible(true);

}

});

}

当我单击btn1时,JCalendar和panel3是不可见的,但panel2不显示

解决方法:

我可以找到很多问题……

> BorderLayout只允许单个组件占用任何给定的位置.也就是说,无论一个组件是否不可见,两个组件不能同时共享CENTER位置.

>您永远不应该调用updateUI,这用于告诉UI组件外观已经改变,应该更新它们以响应它.

>使用revalidate告诉容器布局发生了一些变化,它应该执行新的布局过程…

点击之前……

点击后……

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.beans.PropertyChangeEvent;

import java.beans.PropertyChangeListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.border.LineBorder;

public class GUI extends JFrame implements ActionListener, PropertyChangeListener {

private JPanel panel1, panel2, panel3;

// private com.toedter.calendar.JCalendar calendar;

private JPanel calendar;

private JButton btn1, btn2;

private JLabel label1, label2;

public GUI() {

setDefaultCloseOperation(EXIT_ON_CLOSE);

init();

}

private void init() {

//panel1 components

panel1 = new JPanel();

btn1 = new JButton("Click me");

panel1.add(btn1);

//panel2 components

panel2 = new JPanel();

label1 = new JLabel("Time:");

label2 = new JLabel("Date:");

panel2.add(label1);

panel2.add(label2);

//JCalendar

calendar = new JPanel();//new com.toedter.calendar.JCalendar();

calendar.setBorder(new LineBorder(Color.RED));

calendar.add(new JLabel("Calendar"));

//panel3

panel3 = new JPanel();

panel3.setBorder(new LineBorder(Color.BLUE));

panel3.add(new JLabel("Panel3"));

panel2.setBorder(new LineBorder(Color.GREEN));

//Add panels to JFrame

add(panel1, BorderLayout.NORTH);

add(calendar, BorderLayout.WEST);

add(panel2, BorderLayout.CENTER);

add(panel3, BorderLayout.EAST);

//event handling

btn1.addActionListener(this);

//hide panel2

panel2.setVisible(false);

pack();

}

public void actionPerformed(ActionEvent ae) {

if (ae.getSource().equals(btn1)) {

calendar.setVisible(false);

panel3.setVisible(false);

panel2.setVisible(true); //make panel2 visible

// panel2.updateUI();

revalidate();

repaint();

}

}

public static void main(String args[]) {

javax.swing.SwingUtilities.invokeLater(new Runnable() {

public void run() {

new GUI().setVisible(true);

}

});

}

@Override

public void propertyChange(PropertyChangeEvent evt) {

}

}

现在,我很确定这不会满足你的所有要求(我看到它们)……你至少有两种选择……

>单击按钮时,删除日历组件并将panel2添加到CENTER位置

>最好使用CardLayout

标签:java,swing

来源: https://codeday.me/bug/20190620/1244102.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值