java按钮和标签出现在菜单的JPanel上
我真的希望你能帮我解决这个问题。 我在一个NetBeans应用程序中工作,我用一个JPanel创建了一个动画幻灯片菜单,所以我打算让用户显示滑动的菜单,并覆盖应用程序中当前面板的部分内容,用户与菜单交互(按下菜单上的一个按钮),然后再次隐藏菜单幻灯片
我在这里的问题是,如果菜单(当菜单被释放时)覆盖的内容中有一个jButton或jLabel,它们只是覆盖菜单的内容,它们保持可见,并且它们位于菜单内容的前面
这里的问题:
我尝试过在菜单出现时使用ButtonOrLabel.setVisible(false)
方法,通过隐藏一些按钮和标签来修复它,一旦用户按下隐藏菜单的按钮,它们就会再次被设置为可见,然而维护这是一场噩梦,因为我的应用程序非常大,我需要对每个元素(按钮、翻领、面板等)进行管理当它被释放时,会被菜单覆盖
我注意到的另一个问题是,当按下某个面板中的按钮或用户调整应用程序窗口的大小时,菜单会在中间弹出。它只是立即出现,没有任何动画
那么我做错了什么?如何完成修复? 谢谢
“编辑后:” 我在这里加入了一些代码来说明这个问题。是MRE版本的主要问题
import java.awt.event.ActionEvent;
import javax.swing.JOptionPane;
public class test extends javax.swing.JFrame {
public test() {
initComponents();
this.setLocationRelativeTo(null); }
/////// THIS CODE IS GENERATED BY THE IDE/ / // ///////////////////////////////////////////////////////////////////////////
private void initComponents() { // You can skip this part, since this is the init of each component
menu = new javax.swing.JPanel();
goToA = new javax.swing.JButton();
hideMenu = new javax.swing.JButton();
goToA1 = new javax.swing.JButton();
interfaces = new javax.swing.JPanel();
sttings = new javax.swing.JPanel();
keepVisibleAlwaysThisTitle = new javax.swing.JLabel();
showMenu = new javax.swing.JButton();
home = new javax.swing.JPanel();
panelA = new javax.swing.JPanel();
textArea = new javax.swing.JTextArea();
cleares = new javax.swing.JButton();
writes = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setAlwaysOnTop(true);
setBackground(new java.awt.Color(255, 255, 255));
setBounds(new java.awt.Rectangle(0, 0, 1206, 808));
setLocation(new java.awt.Point(0, 0));
setMaximizedBounds(new java.awt.Rectangle(0, 0, 1206, 808));
setMinimumSize(new java.awt.Dimension(1206, 808));
setModalExclusionType(java.awt.Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
setName("Main"); // NOI18N
setSize(new java.awt.Dimension(1206, 808));
menu.setBackground(new java.awt.Color(38, 39, 40));
menu.setAlignmentX(0.0F);
menu.setAlignmentY(0.0F);
menu.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
menu.setDebugGraphicsOptions(javax.swing.DebugGraphics.NONE_OPTION);
menu.setDoubleBuffered(false);
menu.setMaximumSize(new java.awt.Dimension(293, 1808));
menu.setMinimumSize(new java.awt.Dimension(0, 808));
menu.setPreferredSize(new java.awt.Dimension(295, 808));
menu.setRequestFocusEnabled(false);
menu.setVerifyInputWhenFocusTarget(false);
goToA.setBackground(new java.awt.Color(38, 39, 40));
goToA.setFont(new java.awt.Font("Dialog", 1, 13)); // NOI18N
goToA.setForeground(new java.awt.Color(255, 255, 255));
goToA.setText("GO TO A");
goToA.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
goToA.setContentAreaFilled(false);
goToA.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
goToA.setMaximumSize(new java.awt.Dimension(235, 50));
goToA.setMinimumSize(new java.awt.Dimension(235, 50));
goToA.setPreferredSize(new java.awt.Dimension(235, 50));
goToA.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
goToAMouseClicked(evt); } });
goToA.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException("Not supported yet."); } });
hideMenu.setBackground(new java.awt.Color(102, 102, 102));
hideMenu.setForeground(new java.awt.Color(255, 255, 255));
hideMenu.setText("CLOSE THE MENU");
hideMenu.setToolTipText("");
hideMenu.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
hideMenu.setBorderPainted(false);
hideMenu.setContentAreaFilled(false);
hideMenu.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
hideMenuMouseClicked(evt); } });
goToA1.setBackground(new java.awt.Color(38, 39, 40));
goToA1.setFont(new java.awt.Font("Dialog", 1, 13)); // NOI18N
goToA1.setForeground(new java.awt.Color(255, 255, 255));
goToA1.setText("GO TO HOME");
goToA1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
goToA1.setContentAreaFilled(false);
goToA1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
goToA1.setMaximumSize(new java.awt.Dimension(235, 50));
goToA1.setMinimumSize(new java.awt.Dimension(235, 50));
goToA1.setPreferredSize(new java.awt.Dimension(235, 50));
goToA1.addMouseListener(new java.awt.event.MouseAdapter() { });
goToA1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
goToA1ActionPerformed(evt); } });
javax.swing.GroupLayout menuLayout = new javax.swing.GroupLayout(menu);
menu.setLayout(menuLayout);
menuLayout.setHorizontalGroup(
menuLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(menuLayout.createSequentialGroup()
.addGroup(menuLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(menuLayout.createSequentialGroup()
.addGap(28, 28, 28)
.addGroup(menuLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(goToA1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(goToA, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGroup(menuLayout.createSequentialGroup()
.addGap(72, 72, 72)
.addComponent(hideMenu, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGap(32, 32, 32)) );
menuLayout.setVerticalGroup(
menuLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(menuLayout.createSequentialGroup()
.addGap(102, 102, 102)
.addComponent(goToA, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 186, Short.MAX_VALUE)
.addComponent(hideMenu, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(159, 159, 159)
.addComponent(goToA1, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(225, 225, 225)) );
interfaces.setBackground(new java.awt.Color(255, 255, 255));
interfaces.setAlignmentX(0.0F);
interfaces.setAlignmentY(0.0F);
interfaces.setDebugGraphicsOptions(javax.swing.DebugGraphics.NONE_OPTION);
interfaces.setMaximumSize(new java.awt.Dimension(1206, 808));
interfaces.setMinimumSize(new java.awt.Dimension(100, 808));
interfaces.setPreferredSize(new java.awt.Dimension(1206, 808));
interfaces.setLayout(new java.awt.CardLayout());
sttings.setBackground(new java.awt.Color(255, 255, 255));
sttings.setAlignmentX(0.0F);
sttings.setAlignmentY(0.0F);
sttings.setDebugGraphicsOptions(javax.swing.DebugGraphics.NONE_OPTION);
sttings.setMaximumSize(new java.awt.Dimension(1206, 100));
sttings.setMinimumSize(new java.awt.Dimension(0, 0));
sttings.setOpaque(false);
sttings.setPreferredSize(new java.awt.Dimension(1206, 808));
keepVisibleAlwaysThisTitle.setBackground(new java.awt.Color(238, 206, 62));
keepVisibleAlwaysThisTitle.setFont(new java.awt.Font("Dialog", 1, 26)); // NOI18N
keepVisibleAlwaysThisTitle.setForeground(new java.awt.Color(255, 255, 255));
keepVisibleAlwaysThisTitle.setText(" KEEP THIS TITLE ALWAYS ON TOP");
keepVisibleAlwaysThisTitle.setMaximumSize(new java.awt.Dimension(interfaces.getWidth(), 40));
keepVisibleAlwaysThisTitle.setMinimumSize(new java.awt.Dimension(interfaces.getWidth(), 40));
keepVisibleAlwaysThisTitle.setOpaque(true);
keepVisibleAlwaysThisTitle.setPreferredSize(new java.awt.Dimension(interfaces.getWidth(), 40));
showMenu.setText("SHOW MENU");
showMenu.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
showMenuActionPerformed(evt); } });
home.setBackground(new java.awt.Color(255, 255, 255));
javax.swing.GroupLayout homeLayout = new javax.swing.GroupLayout(home);
home.setLayout(homeLayout);
homeLayout.setHorizontalGroup(
homeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 1206, Short.MAX_VALUE) );
homeLayout.setVerticalGroup(
homeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 808, Short.MAX_VALUE) );
panelA.setBackground(new java.awt.Color(255, 255, 255));
panelA.setAlignmentX(0.0F);
panelA.setAlignmentY(0.0F);
panelA.setDebugGraphicsOptions(javax.swing.DebugGraphics.NONE_OPTION);
panelA.setMaximumSize(new java.awt.Dimension(1206, 808));
panelA.setMinimumSize(new java.awt.Dimension(1206, 808));
panelA.setPreferredSize(new java.awt.Dimension(1206, 808));
textArea.setColumns(20);
textArea.setFont(new java.awt.Font("Dialog", 0, 18)); // NOI18N
textArea.setForeground(new java.awt.Color(255, 255, 255));
textArea.setRows(5);
textArea.setBorder(javax.swing.BorderFactory.createMatteBorder(1, 1, 1, 1, new java.awt.Color(255, 212, 57)));
textArea.setOpaque(false);
cleares.setText("WIPES THE TEXT BELOW");
cleares.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
clearesActionPerformed(evt); } });
writes.setText("WRITE A TEXT BELOW");
writes.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
writesActionPerformed(evt); } });
javax.swing.GroupLayout panelALayout = new javax.swing.GroupLayout(panelA);
panelA.setLayout(panelALayout);
panelALayout.setHorizontalGroup(
panelALayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelALayout.createSequentialGroup()
.addGap(33, 33, 33)
.addGroup(panelALayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(panelALayout.createSequentialGroup()
.addComponent(writes)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(cleares))
.addComponent(textArea, javax.swing.GroupLayout.PREFERRED_SIZE, 1140, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(33, Short.MAX_VALUE)) );
panelALayout.setVerticalGroup(
panelALayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelALayout.createSequentialGroup()
.addGap(280, 280, 280)
.addGroup(panelALayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(writes)
.addComponent(cleares))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(textArea, javax.swing.GroupLayout.PREFERRED_SIZE, 416, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(78, Short.MAX_VALUE)) );
javax.swing.GroupLayout sttingsLayout = new javax.swing.GroupLayout(sttings);
sttings.setLayout(sttingsLayout);
sttingsLayout.setHorizontalGroup(
sttingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, sttingsLayout.createSequentialGroup()
.addGap(0, 11, Short.MAX_VALUE)
.addComponent(showMenu, javax.swing.GroupLayout.PREFERRED_SIZE, 113, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(keepVisibleAlwaysThisTitle, javax.swing.GroupLayout.PREFERRED_SIZE, 1076, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(sttingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(panelA, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(sttingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(home, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));
sttingsLayout.setVerticalGroup( sttingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(sttingsLayout.createSequentialGroup()
.addGap(41, 41, 41)
.addGroup(sttingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(keepVisibleAlwaysThisTitle, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(showMenu, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(728, Short.MAX_VALUE))
.addGroup(sttingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(panelA, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(sttingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(home, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) );
interfaces.add(sttings, "card2");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 1206, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(menu, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(0, 911, Short.MAX_VALUE)))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(interfaces, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) );
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 808, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(menu, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(interfaces, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) );
menu.getAccessibleContext().setAccessibleDescription(""); pack(); }
/////////// END OF THE INIT OF THE COMPONENTS /////// THIS CODE IS GENERATED BY THE IDE/ / // ///////////////
/// HERE IS MY CODE:
private void hideMenuMouseClicked(java.awt.event.MouseEvent evt) {
System.out.println("Closing Menu");
if (menu.getWidth() > 0) {
menu.setFocusable(true);
Thread th = new Thread(){
public void run () {
try {
for (double i = menu.getMaximumSize().width; i > -1; i=i-1.5) {
Thread.sleep(1);
menu.setSize((int) i, menu.getHeight()); } /*LOOP END*/
} catch (Exception e) {JOptionPane.showMessageDialog(null, e); } } };
th.start(); } }
private void goToAMouseClicked(java.awt.event.MouseEvent evt) {
panelA.setVisible(true);
keepVisibleAlwaysThisTitle.setText(" PANEL A");
hideMenuMouseClicked(evt);
}
private void showMenuActionPerformed(java.awt.event.ActionEvent evt) {
if (menu.getWidth() == 0) {
menu.setSize(0, menu.getHeight());
Thread th = new Thread(){
public void run () {
try {for (double i = 0; i < menu.getMaximumSize().width + 1; i=i+1.5) {
Thread.sleep(1);
menu.setSize((int) i, menu.getHeight()); } /*LOOP END*/
} catch (Exception e) {JOptionPane.showMessageDialog(null, e); } } };
th.start();
menu.setSize(menu.getMaximumSize().width, menu.getHeight());
menu.setFocusable(true); } }
private void clearesActionPerformed(java.awt.event.ActionEvent evt) {
textArea.setText(""); }
private void writesActionPerformed(java.awt.event.ActionEvent evt) {
textArea.setText("PANEL A IS ONE OF THE DIFFERENT PANELS THAT THE APP WILL HAVE, AND THE USER WILL ACCESS TO THOSE VIA THE MENU"); }
private void goToA1ActionPerformed(java.awt.event.ActionEvent evt) {
panelA.setVisible(false);
home.setVisible(true);
keepVisibleAlwaysThisTitle.setText("You are now in home"); }
/////////////////// THIS IS THE MAIN CLASS ///////////// THIS CODE IS GENERATED BY THE IDE/ / // //////////////////
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break; } } } catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(mreForStackOverflow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(mreForStackOverflow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(mreForStackOverflow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(mreForStackOverflow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new mreForStackOverflow().setVisible(true); } }); }
public javax.swing.JButton hideMenu;
private javax.swing.JPanel interfaces;
private javax.swing.JPanel sttings;
private javax.swing.JButton cleares;
private javax.swing.JButton goToA;
private javax.swing.JButton goToA1;
private javax.swing.JPanel home;
private javax.swing.JLabel keepVisibleAlwaysThisTitle;
private javax.swing.JPanel menu;
private javax.swing.JPanel panelA;
private javax.swing.JButton showMenu;
private javax.swing.JTextArea textArea;
private javax.swing.JButton writes;}
据我所知,我确信你可以复制并编译这段代码,希望你能重现我所描述的问题
# 1 楼答案
好吧,仍然不是MRE,因为:
所以你只需要:
所有其他组件都与您描述的问题无关
我能解决一些问题,但不是所有问题
鼠标事件被传递给添加了鼠标侦听器的组件。当菜单可见时,当鼠标移动到菜单下的按钮上时,您在菜单上移动鼠标,该按钮会被绘制,因为该按钮添加了鼠标侦听器来处理按钮的滚动效果
在大多数情况下,我可以通过在面板上添加一个假鼠标听筒来防止这种情况:
但是,当您单击“显示菜单”按钮,然后移动鼠标时,仍然会出现问题。不知道为什么
你的逻辑只会操纵setSize(…)方法来隐藏/显示它
但是,当调整框架大小时,将调用布局管理器,该管理器将根据菜单的首选大小重置菜单的大小(),并重新绘制菜单
我使用的解决方案是添加:
在“隐藏菜单”逻辑中添加
在“显示菜单”逻辑中
我从未使用过群组布局。我也不使用布局管理器来显示三维组件,所以我不确定使用GroupLayout是否是解决此类问题的最佳方案
也许相反,菜单应该是框架的
Glass Pane
,您可以在需要时显示/隐藏该框架或者你应该使用JLayeredPane
以上两种设计都可以更好地在层中显示组件
阅读Swing Tutorial了解更多信息。特别是关于: