Java 玻璃材质窗格玻璃重新喷漆后脱落

Java 玻璃材质窗格玻璃重新喷漆后脱落,java,swing,jpanel,glasspane,Java,Swing,Jpanel,Glasspane,我对玻璃窗有问题。当我第一次显示面板时,一切正常。但当我想重新绘制此面板,因为组件应该更改(方法createPanel())时,玻璃面板就会消失。当我调整框架大小时,它再次可见。我不知道为什么会这样 我的面板看起来像: package GUI; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; impo

我对玻璃窗有问题。当我第一次显示面板时,一切正常。但当我想重新绘制此面板,因为组件应该更改(方法
createPanel()
)时,玻璃面板就会消失。当我调整框架大小时,它再次可见。我不知道为什么会这样 我的面板看起来像:

package GUI;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class TurnajPanel extends JPanel {

    private static final long serialVersionUID = 1L;
    private GridBagConstraints c = new GridBagConstraints();
    private JFrame frame;

    public TurnajPanel(JFrame frame) throws Exception {
        this.frame = frame;
        createPanel();
    }

    public void createPanel() throws Exception {
        removeAll();
        setLayout(new GridBagLayout());

        addMenu();

        revalidate();
        repaint();
    }

    private void addMenu() {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 20));
        panel.setBorder(BorderFactory.createTitledBorder("aaaaaaaaaaaaaa"));
        JPanel innerPanelTlacidiel = new JPanel(new GridBagLayout());
        panel.add(innerPanelTlacidiel);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 1;
        c.gridy = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.FIRST_LINE_END;
        c.insets = new Insets(0, 5, 0, 0);
        final JPanel panelTlacidiel = new JPanel(new GridLayout(0, 1, 5, 5));
        innerPanelTlacidiel.add(panelTlacidiel, c);
        frame.setGlassPane(panel);
        frame.getGlassPane().setVisible(true);

    }

    public static void main(String[] args) throws Exception {

        JFrame frame = new JFrame();
        final TurnajPanel turnaj = new TurnajPanel(frame);
        JScrollPane scrolovaciPanel = new JScrollPane(turnaj);
        frame.add(scrolovaciPanel);

        frame.setSize(new Dimension(400, 400));
        frame.setVisible(true);
        frame.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void keyReleased(KeyEvent e) {
                System.out.println("????????????????");
                try {
                    turnaj.createPanel();
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }

            @Override
            public void keyPressed(KeyEvent e) {
                // TODO Auto-generated method stub

            }
        });
    }
}
当我向方法
createPanel()添加一行时


然后它就像一个符咒。有人能给我解释一下这种行为吗?

如果你在
frame.getGlassPane().setVisible(true)
之后简单地添加
frame.revalidate()
,它会工作的。

  • 应该是

  • frame.rootPane.setGlassPane()

  • 将LayoutManager添加到GlassPane或覆盖JPanel的getPreferredSize

  • 不应该

  • KeyListener到JFrame,默认情况下JFrame在API中为KeyEvents发送消息通知

  • 为什么要重载void,创建父JPanel作为局部变量

  • 为什么要重载void,子JPanel应该只创建一次,然后只使用setVisible(真/假),重置setVisible上JComponents中的值(假)


您希望窗格玻璃做什么?窗格玻璃中的菜单是什么?但是你为什么想知道呢?试着弄清楚你想做什么。如果你发了一个帖子,你会更容易帮助你,你能更具体一点吗?我错过的也许我真的是瞎了,但框架没有这个method@hudi它只出现在Java7中。而是调用
frame.getRootPane().revalidate()但是frame.validate()也有帮助。但我还是不明白玻璃窗为什么会坏。我调用要添加到框架的面板上的removeAll。在这个面板中,我还创建了一个菜单,我想将它设置为框架的玻璃窗格,但我并没有删除它。也许我只是不知道removeAll到底是什么doing@hudi
removeAll
删除容器的所有子组件。问题是,您从未将
TurnajPanel
添加到层次结构中。您只需将玻璃窗格设置为在方法createPanel中创建的面板。实际上,您不需要在类面板中扩展
JPanel
。至于调用validate/revalidate,有必要这样做,因为根窗格的LayoutManager尚未对glasspane进行布局(即,glasspane的大小为(0,0))。当您调用validate()/revalidate()时,glasspane会获得适当的大小并变得可见,因此它也会删除不是此面板子级的glasspane。我正在将滚动面板添加到包含TurnajPanel的框架中。因此,我希望turnajPanel在层次结构中。然后面板不能有玻璃窗格。我正在将其添加到框架中为什么需要添加layoutManager?默认值是flow,我对此很满意。我添加KeyListner只是为了举个简单的例子。我没有用它。顺便问一下。我应该用什么来代替KeyListener?击键?使用KeyBinding,而不是KeyListener,使用排他性:-)和mouseListener到frame也是糟糕的解决方案?@mKorbel无需重写getPreferredSize。根窗格(RootLayout)的LayoutManager会自动将玻璃窗格拉伸到框架的大小。我认为它甚至不会在glasspane上调用getPreferredSize()。
public void createPanel() throws Exception {
    removeAll();
    FrameFactory.turnajFrame.getGlassPane().setVisible(false); // new line
    setLayout(new GridBagLayout());

    addMenu();

    revalidate();
    repaint();
}