Java 如何从JPanel中删除组件?然后重新显示帧?
此代码的某些上下文, 我试图做的是创建一个验证警告,如果输入包含“”作为值, 因此,如果显示错误,它将显示消息。 如果有效,则不显示消息, 那么,当文本字段有效时,如何删除消息 消息是一个JPanel,其中包含一个带有文本的JLabel, 当这个JPanel无效时,我将它添加到帧中, 当它有效时,我会尝试删除它 那么我做错了什么? 我在挥杆方面处于基本水平Java 如何从JPanel中删除组件?然后重新显示帧?,java,swing,Java,Swing,此代码的某些上下文, 我试图做的是创建一个验证警告,如果输入包含“”作为值, 因此,如果显示错误,它将显示消息。 如果有效,则不显示消息, 那么,当文本字段有效时,如何删除消息 消息是一个JPanel,其中包含一个带有文本的JLabel, 当这个JPanel无效时,我将它添加到帧中, 当它有效时,我会尝试删除它 那么我做错了什么? 我在挥杆方面处于基本水平 import java.awt.EventQueue; import javax.swing.JFrame; import javax.s
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JButton;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class Test {
private JFrame frame;
private JTextField textField;
private JTextField textField_1;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Test window = new Test();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Test() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 401, 232);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JPanel panel = new JPanel();
panel.setBounds(10, 11, 330, 94);
frame.getContentPane().add(panel);
panel.setLayout(null);
JLabel lblNewLabel = new JLabel("Firstname :");
lblNewLabel.setBounds(10, 11, 104, 14);
panel.add(lblNewLabel);
textField = new JTextField();
textField.setBounds(76, 8, 244, 20);
panel.add(textField);
textField.setColumns(10);
JLabel lblLastname = new JLabel("Lastname :");
lblLastname.setBounds(10, 42, 78, 14);
panel.add(lblLastname);
textField_1 = new JTextField();
textField_1.setBounds(76, 39, 244, 20);
panel.add(textField_1);
textField_1.setColumns(10);
JButton btnValidate = new JButton("Validate");
btnValidate.addMouseListener(new MouseAdapter() {
@SuppressWarnings("deprecation")
@Override
public void mousePressed(MouseEvent arg0) {
JPanel panel_1 = new JPanel();
JPanel panel_2 = new JPanel();
if(textField.getText().equals("")) {
panel_1.setBackground(new Color(30, 144, 255));
panel_1.setBounds(100, 116, 330, 26);
JLabel lblMessage = new JLabel("0 :");
lblMessage.setForeground(new Color(255, 255, 255));
lblMessage.setFont(new Font("Tahoma", Font.BOLD, 13));
panel_1.add(lblMessage);
frame.getContentPane().add(panel_1);
frame.revalidate();
frame.repaint(10);
frame.revalidate();
}
else if(textField_1.getText().equals("")) {
panel_2.setBackground(new Color(50, 200, 255));
panel_2.setBounds(10, 134, 330, 26);
JLabel lblMessage = new JLabel("1 :");
lblMessage.setBounds(50, 50, 50, 50);
lblMessage.setAlignmentX(50);
lblMessage.setForeground(new Color(255, 255, 255));
lblMessage.setFont(new Font("Tahoma", Font.BOLD, 13));
panel_2.add(lblMessage);
frame.getContentPane().add(panel_2);
frame.remove(panel_1);
frame.revalidate();
frame.repaint(10);
frame.revalidate();
}
}
});
btnValidate.setBounds(231, 71, 89, 23);
panel.add(btnValidate);
}
}
yourpanel.setVisible(false)
应该隐藏您的面板,其中“yourPanel”是您的JPanel实例yourPanel.setVisible(false)
应该隐藏您的面板,其中“yourPanel”是您的JPanel实例最简单的方法就是简单地调整可见性()
如果您真的想完全删除组件,您必须删除并重新验证,如方法中所述
此方法会更改布局相关信息,从而使组件层次结构无效。如果容器已显示,则此后必须验证层次结构,以反映更改
这会导致类似于
panel.remove( componentToRemove );
panel.revalidate();
panel.repaint();
作为旁注:请用适当的
LayoutManager
替换null
布局和那些setBounds
调用。您可能需要查看上的可用功能,以便了解布局管理器的功能。开始使用布局管理器时,on SO包含一些额外有用的链接最简单的方法是简单地调整可见性()
如果您真的想完全删除组件,您必须删除并重新验证,如方法中所述
此方法会更改布局相关信息,从而使组件层次结构无效。如果容器已显示,则此后必须验证层次结构,以反映更改
这会导致类似于
panel.remove( componentToRemove );
panel.revalidate();
panel.repaint();
作为旁注:请用适当的
LayoutManager
替换null
布局和那些setBounds
调用。您可能需要查看上的可用功能,以便了解布局管理器的功能。开始使用布局管理器时,on-SO包含一些额外有用的链接因此,如果我要frame.remove(面板1),然后frame.revalidate()然后frame.repaint()它将删除面板和其中包含的所有组件?我已经更新了问题中的代码。请告诉我,当代码块执行面板时,最后一条else语句有什么错误?1仍然可见?我把它改成我认为应该怎么做?作为旁注,新添加的面板的z指数比之前添加的面板低?@Aaron您的错误在于您没有删除先前添加的面板,而是尝试删除从未添加的面板。请注意,您总是如何在MouseListener
中创建新的panel_1
和panel_2
(MouseListener
对于JButton
,它可能应该被ActionListener
替换)在第一个if语句中,我将panel_1添加到框架中,并尝试在else语句中删除它,但它仍然显示?所以它被添加到if语句中,这让我很困惑?@Aaron No,每次你输入MouseListener
你都会创建新面板(监听器的前两行)。因此,第一次进入监听器时添加的panel_1
与第二次进入监听器并尝试删除它时添加的panel_1
不同,如果我要帧。删除(panel_1)然后帧。重新验证()然后帧。重新绘制()它将删除面板和其中包含的所有组件?我已经更新了问题中的代码。请告诉我,当代码块执行面板时,最后一条else语句有什么错误?1仍然可见?我把它改成我认为应该怎么做?作为旁注,新添加的面板的z指数比之前添加的面板低?@Aaron您的错误在于您没有删除先前添加的面板,而是尝试删除从未添加的面板。请注意,您总是如何在MouseListener
中创建新的panel_1
和panel_2
(MouseListener
对于JButton
,它可能应该被ActionListener
替换)在第一个if语句中,我将panel_1添加到框架中,并尝试在else语句中删除它,但它仍然显示?所以它被添加到if语句中,这让我很困惑?@Aaron No,每次你输入MouseListener
你都会创建新面板(监听器的前两行)。因此,第一次进入监听器时添加的panel_1
与第二次进入监听器并尝试将其删除时添加的panel_1
不同