gpt4 book ai didi

Java:为什么验证不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 06:48:25 26 4
gpt4 key购买 nike

我想动态更改面板,如下所示 answer展示时,他们推荐使用cardLayout。但我想改变整个UI(没有旧按钮留下)和cardLayout似乎不太方便。所以我有以下代码:

 JFrame frame = new JFrame ("Key test");
MyDrawPanel1 dp1 = new MyDrawPanel1(frame);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible (true);
JPanel p = new JPanel ();
p.setLayout(new BorderLayout());
p.add(dp1,BorderLayout.CENTER);

frame.getContentPane().add(p);
frame.pack();
frame.setVisible (true);

在 MyDrawPanel1 中有一个更改面板的按钮:

  public MyDrawPanel1(final JFrame frame) {
clickButton.addActionListener(new ActionListener(){

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
frame.getContentPane().removeAll();
//frame.validate();
frame.getContentPane().add(new MyDrawPanel2());
((JPanel)frame.getContentPane()).revalidate();

}

});
this.add(clickButton);

}

编辑:MyDrawPanel1中的更多代码。

  JButton clickButton  = new JButton("click");

Image image = new ImageIcon("D:/0.jpg").getImage();
public void paintComponent (Graphics g) {
super.paintComponent(g);
g.drawImage(image, 3, 40, null);
}
public Dimension getPreferredSize() {
if (image != null) {
return new Dimension(image.getWidth(null), image.getHeight(null));
}
return super.getPreferredSize(); // default
}

但是第一个面板不会消失,我必须将其最小化才能刷新它,这样我才能看到第二个面板。我的问题是为什么验证不起作用以及是否有其他选择。谢谢。

编辑:这是我截取的有关面板的图片。(第一个面板):enter image description here

(点击后):enter image description here

编辑:madProgrammer 和 Adarsh Singhal 提供了两种解决该问题的方法。第一个是第二个面板不调用 super.paintComponent(),所以添加它然后它就可以正常工作(正如 answer 所说,它是橡皮擦,所以第一个面板消失了)。第二个是调用frame.repaint(),但我不明白为什么?

最佳答案

我们必须使用 repaint() 来告诉组件重新绘制自己。将其想象为您的情况。而 revalidate 用于更新布局。因此,无论何时动态添加/删除组件,都需要调用它们。

以下编写的代码显示设置为 CardLayoutJFrame,以将 Red dp1(JPanel) 完全绘制在 JFrame 上。在 dp1 上,有一个 Jbutton。如果单击该按钮,dp1 将被删除并绘制 dp2(JPanel)。 dp2 为绿色以区分变化。您似乎忘记了repaint()

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class MyFrame extends JFrame{
JButton button;
private static MyFrame frame;
public MyFrame(){
this.setSize(400, 400);
this.setLayout(new CardLayout());
this.setLocationRelativeTo(null);
JPanel dp1 = new JPanel();
dp1.setBackground(Color.RED);
add(dp1);
button = new JButton("Click me to remove dp1 & draw dp2");
dp1.add (button);
JPanel dp2 = new JPanel ();
dp2.setBackground(Color.GREEN);


button.addActionListener(new ActionListener(){

@Override
public void actionPerformed(ActionEvent arg0) {
frame.getContentPane().remove(dp1);
frame.add(dp2);
frame.revalidate();
frame.repaint();

}});

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible (true);
}

public static void main(String[] args) {
frame = new MyFrame();
}
}

关于Java:为什么验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23668631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com