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

JButton定位问题

曾云
2023-03-14

好的,我有一个Jpanel,在下图中使用覆盖布局显示为白色。它包含一个包含图像(“无可用图像”)和JButton(“注释”)的ScrollPane。

我想把这个按钮放在JGroup的右下角。我尝试了多种布局方法,但似乎无法让它工作。最多按钮向东南移动大约3/4,我不知道为什么。

非常感谢任何帮助。。

共有3个答案

陆俊捷
2023-03-14

将第一个带有图像的< code>JPanel添加到内容窗格的< code >中心位置,并将JPanel的布局设置为< code>FlowLayout。右并将您的< code>JButton添加到它,现在将这个< code>JPanel添加到内容窗格的< code>BorderLayout的< code>PAGE_END位置。看看这个例子

import java.awt.*;
import java.awt.event.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ApplicationCloseExample
{   
    private Image image;
    private static final String HTML =
        "<html>" +
        "<style type'text/css'>" +
        "body, html { padding: 0px; margin: 0px; }" +
        "</style>" +
        "<body>" +
        "<img src='http://pscode.org/media/starzoom-thumb.gif'" +
        " width=320 height=240>" +
        "";

    private void displayGUI()
    {
        final JFrame frame = new JFrame("Application Close Example");

        frame.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent we)
            {
                int result = JOptionPane.showConfirmDialog(
                                frame, "Do you want to Exit ?"
                                , "Exit Confirmation : ", JOptionPane.YES_NO_OPTION);
                if (result == JOptionPane.YES_OPTION)               
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                else if (result == JOptionPane.NO_OPTION)   
                    frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
            }
        });

        JPanel contentPane = new JPanel();
        contentPane.setOpaque(true);
        JLabel label = new JLabel(HTML);
        contentPane.add(label);

        JPanel bottomPanel = new JPanel();
        bottomPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5));
        JButton button = new JButton("Comment");
        bottomPanel.add(button);

        frame.getContentPane().add(contentPane, BorderLayout.CENTER);
        frame.getContentPane().add(bottomPanel, BorderLayout.PAGE_END);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new ApplicationCloseExample().displayGUI();
            }
        });
    }
}

以下是输出:

田玉韵
2023-03-14

使用不同的布局管理器有许多可能的解决方案。我不知道OverlayYout,但我喜欢WindowBuilder Pro(免费):https://developers.google.com/java-dev-tools/wbpro/以获得Swing设计方面的帮助。

使用它,我写了一个SpringLayout实现你的问题(如果没有GUI构建器,SpringLayout似乎很痛苦)。

JPanel panel = new JPanel();
SpringLayout sl_panel = new SpringLayout();
panel.setLayout(sl_panel);

JButton button = new JButton("Comments");
sl_panel.putConstraint(SpringLayout.SOUTH, button, 0, SpringLayout.SOUTH, panel);
sl_panel.putConstraint(SpringLayout.EAST, button, 0, SpringLayout.EAST, panel);
panel.add(button);

JScrollPane scrollPane = new JScrollPane();
sl_panel.putConstraint(SpringLayout.NORTH, scrollPane, 5, SpringLayout.NORTH, panel);
sl_panel.putConstraint(SpringLayout.WEST, scrollPane, 3, SpringLayout.WEST, panel);
sl_panel.putConstraint(SpringLayout.SOUTH, scrollPane, 3, SpringLayout.SOUTH, panel);
sl_panel.putConstraint(SpringLayout.EAST, scrollPane, 3, SpringLayout.EAST, panel);
panel.add(scrollPane);

JLabel lblNewLabel = new JLabel();
lblNewLabel.setIcon(new ImageIcon(foo.class.getResource("sSdA3.png")));
scrollPane.setViewportView(lblNewLabel);

下面是代码运行的图片:

你可以看到按钮(我的,不是你的图片......)漂浮在底部的滚动窗格上方。我们可以调整上面的边距,使按钮不会浮动在滚动条的顶部,但这只是为了显示它在z轴上的位置。

葛景龙
2023-03-14

您提到了使用< code > overlay layout ;您希望按钮实际上与图像重叠吗?

如果这对你来说不重要,可以使用其他好的建议,因为它们简单得多。但是,如果您真的希望按钮与图像重叠,这里有一个解决方案:使用<code>JLayeredPaneJLayeredPane没有布局管理器,因此每当调整JLayeredPane的大小时,都需要添加组件侦听器来调整JPanels的大小。

这是一个SSCCE:

public class SSCCE {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new BorderLayout());

        final JLayeredPane layeredPane = new JLayeredPane();
        contentPane.add(layeredPane,BorderLayout.CENTER);

        final JPanel btnPane = new JPanel(new GridBagLayout());
        btnPane.setOpaque(false);

        JButton btn = new JButton("Comment");
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        gbc.anchor = GridBagConstraints.SOUTHEAST;
        btnPane.add(btn,gbc);

        final JPanel lblPane = new JPanel(new GridBagLayout());
        lblPane.setBackground(Color.CYAN);

        JLabel lbl = new JLabel("No Image Available");
        gbc = new GridBagConstraints();
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        gbc.anchor = GridBagConstraints.CENTER;
        lblPane.add(lbl,gbc);

        layeredPane.add(btnPane,0);
        layeredPane.add(lblPane,1);
        layeredPane.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                lblPane.setBounds(0, 0, layeredPane.getWidth(), layeredPane.getHeight());
                btnPane.setBounds(0, 0, layeredPane.getWidth(), layeredPane.getHeight());
            }
        });


        frame.setSize(300,200);
        frame.setVisible(true);
    }

}
 类似资料:
  • 一个正常的火焰图,应该呈现出如官网给出的样例(官网的火焰图是抓 C 级别函数): 从上图可以看出,正常业务下的火焰图形状类似的“山脉”,“山脉”的“海拔”表示 worker 中业务函数的调用深度,“山脉”的“长度”表示 worker 中业务函数占用 cpu 的比例。 下面将用一个实际应用中遇到问题抽象出来的示例(CPU 占用过高)来说明如何通过火焰图定位问题。 问题表现,Nginx worker

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

  • css问题 下面代码 为什么ul使用绝对定位居中 a元素变成块元素 文字会垂直 代码 为什么用绝对定位居中宽度展示文字会被挤下去 如下图 如果用flex布局居中就是没问题 代码如下图 效果如下图

  • 我有很多内置按钮的JPanel。我想在屏幕上的鼠标位置下检测JButton。 我得到鼠标的位置 我要检查这个位置上是否有JButton,并获取这个按钮。 例子: 按钮左角位于屏幕位置(50,50),按钮大小为宽度=100,高度=50,鼠标位于屏幕位置(70,70)。 如何检测此位置上是否存在JButton?

  • 我有一套使用gradle运行后端服务器的代码。我正在终端中运行。当我运行它时,它开始处理,然后抛出关于文件位置的巨大错误。如果我能解决这个问题,我该怎么解决呢。 我正试图弄清楚为什么找不到这些文件。 使现代化 这就是构建。格雷德尔档案。。。我在试着跑gradle:Bootlun

  • 问题内容: 假设您在NxN网格中有一个JButton的GridLayout,其代码如下: 如何通过setText()单独访问网格中的每个按钮以更改按钮的名称?这需要在实际按下相关按钮之外进行。 因为每个按钮在本地实例化为“ b”,所以当前无法获得每个按钮的全局可访问名称。如何独立访问每个按钮?像JButton [] []这样的数组可以容纳对所有按钮的引用吗?如何在上面的代码中进行设置? 任何输入表