当前位置: 首页 > 知识库问答 >
问题:

如何自定义JPanel在JPanel中位置

龙洛城
2023-03-14
 public void createDisplay(){
    frame = new JFrame();
    frame.setTitle(title);
    frame.setSize(new Dimension(width, height));
    frame.setVisible(true);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    this.setPreferredSize(new Dimension(width, height));
    this.setMaximumSize(new Dimension(width, height));
    this.setMinimumSize(new Dimension(width, height));

    this.setLayout(null); //have tried default and BorderLayout
    this.setSize(new Dimension(width, height));
    this.setBounds(0, 0, width, height);

    //basically trying everything

    frame.add(this);
    frame.pack();

}

但是,我的程序稍后尝试将一个新的JPanel添加到类的扩展JPanel中,方法是:

    public void gameOverWindow(){ ;
    JPanel panel = new JPanel(new BorderLayout());
    panel.setPreferredSize(new Dimension(200, 100));
    JLabel label = new JLabel("Game Over");
    label.setPreferredSize(new Dimension(40, 15));

   //trying setPosition also doesn't work with BorderLayout or FlowLayout

    JButton button_01 = new JButton("new");
    button_01.setPreferredSize(new Dimension(100, 10));
    JButton button_02 = new JButton("exit");
    button_02.setPreferredSize(new Dimension(100, 10));


    panel.add(label, BorderLayout.NORTH);
    panel.add(button_01, BorderLayout.WEST);
    panel.add(button_02, BorderLayout.EAST);



    this.add(panel);
    this.revalidate();


}

这个新的JPanel以正确的BorderLayout格式显示内容,但是JPanel本身将保持在扩展JPanel的顶部中心,我知道这是因为默认布局设置为FlowLayout,但是将其设置为BorderLayout只会导致面板占用整个屏幕。将布局设置为null将完全破坏框架,除了框架的最小化和关闭按钮之外,什么也没有出现。试图设置这个JPanel的位置或边界也不适用于任何布局。我在网上读过很多其他关于这个的帖子,但它们似乎都不同,变得令人困惑,我如何控制我的新JPanel的位置?

共有1个答案

壤驷乐邦
2023-03-14

通常,我建议使用CardLayout在不同视图之间切换,但很难从可用的信息中确定这是否有帮助

相反,您可以使用复合布局。也就是说,使用不同的布局将一个容器包装在另一个容器中。

在本例中,我简单地使用了BorderLayoutGridBagLayout的组合

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            JButton gameOver = new JButton("Game over man");
            gameOver.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JPanel panel = new JPanel(new BorderLayout());
                    panel.add(new JLabel("Game Over Man", JLabel.CENTER), BorderLayout.NORTH);
                    panel.add(new JButton("New"), BorderLayout.WEST);
                    panel.add(new JButton("Exit"), BorderLayout.EAST);

                    removeAll();
                    JPanel inner = new JPanel(new GridBagLayout());
                    inner.add(panel);
                    add(inner);
                    revalidate();
                    repaint();
                }
            });
            JPanel inner = new JPanel(new GridBagLayout());
            inner.add(gameOver);
            add(inner);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}

然后,我想在里面弹出一个小的Jpanel并且不引人注目

您可以使用框架的glasspane或使用overlayLayout

例如:

    null
 类似资料:
  • 我似乎无法为JPanel设置按钮的自定义位置。它总是在左上角添加按钮,然后继续向右。我还有一个背景图像,这让事情变得更加困难。框架如下所示:imageshack.com/a/img838/3240/ez6l.png我的代码是: 我想将按钮“MusicButton”添加到右下角/中间/或左侧。如果您可以在JPanel中定制JButton,请分享。谢谢

  • 问题内容: 我将JPanel包裹在JScrollPane中,我希望始终将矩形绘制在同一位置上=使用滚动条移动不会影响矩形的可见性。 我尝试了以下代码: 但是仅当更改整个JPanel的大小时才重新绘制矩形。 问题答案: IIRC 将尝试最大程度地减少滚动完成时的重绘次数,因此它不会总是导致组件被更新。 标准技术是使用。将您添加到下层,并在其上面添加不透明的玻璃面板组件。请参阅Swing教程中的如何使

  • Java自定义拖放--对TransferHandler没有回调。 我想为JPanel子类实现自定义拖放功能。I遵循标准DnD教程的指导方针: 拖放和数据传输 从表面上看,事情似乎很进步,但当我实际尝试时,我没有得到任何迹象表明任何DnD行为正在发生。事实上,没有调用我的TransferHandler中的任何方法。 所以,让我们回顾一下我所做的... 我创建了自己的容器类,它声明自己来扩展JPane

  • 我需要一个帮助来定位一个JPanel在一个特定的位置到一个Jframe。 我在一个扩展JFrame的类中有一个JPanel,我需要将这个JPanel放在一个特定的x,y位置。 是这样的: 我不需要一个LayoutManager的位置的JPanel,因为我需要把JPanel在一个特定的位置(像150,150的例子)。但是如果我panel.set位置(150,150),就像上面的代码一样,什么都不会发

  • 我想将包含send按钮和textfield(现在使用flowlayout)的JPanel放置在JTextArea(白色区域)的底部。我怎样才能做到这一点?

  • 我已经创建了一个JFrame包含2。我已经在panel1中添加了panel2。panel1.add(panel2); 我在面板2中添加了一个文本区域。 最后panel1到getContentPane 现在我得到了textarea的位置 textarea.get位置(); 我创建了一个保存按钮,用于保存textarea(x,y)值。我使用xml存储(x,y)值。 现在,当我关闭并重新打开jar文件时