【问题标题】:Using scrollbars with absolute layout in Swing在 Swing 中使用具有绝对布局的滚动条
【发布时间】:2012-02-27 08:53:10
【问题描述】:

我无法在 Swing 中使用绝对布局的滚动条。

我不希望使用此布局,但我必须在单击按钮时在面板上显示动态对象并使用 setBounds 对齐它们,这只能使用此布局来完成(我猜)。

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

public class clothes2 extends javax.swing.JFrame {

    JTextField n=null;
    JButton m=null;

    public clothes2(){
        initComponents();
    }

    public void initComponents() {
        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());
        final JPanel jp = new JPanel();
        contentPane.setPreferredSize(new Dimension(320,200));
        jp.setLayout(null);
        m=new JButton("add");
        m.setBounds(0,0,50,50);
        jp.add(m);
        m.addMouseListener( new MouseAdapter() {

            int x=0;
            int y=0;

            public void mouseClicked(MouseEvent me){
                x+=100;
                y+=100;
                jp.add(n=new JTextField("Name"));
                n.setBounds(x, y, 50, 50);
                jp.add(n=new JTextField("code"));
                x+=100;
                n.setBounds(x,y, 50, 50);
                jp.revalidate();
                jp.repaint();
                x=0;
            }
        });

        int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS;
        int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS;
        JScrollPane jsp = new JScrollPane(jp, v, h);
        contentPane.add(jsp, BorderLayout.CENTER);
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame f= new clothes2();
                f.setVisible(true);
                f.setSize(640,320);
            }
        });
    }
}

【问题讨论】:

  • 我不希望使用这种布局 - 好主意,只需遵循它 :-) 您手动执行的操作(对齐、大小和位置) LayoutManager 的工作,找到一个能正确完成这项工作的人。
  • 似乎这段代码试图在从 GUI 左上角开始的列中创建一系列大的方形文本字段(宽度和高度都相同)。对吗?

标签: java swing user-interface layout absolutelayout


【解决方案1】:

设置容器的首选大小。

【讨论】:

【解决方案2】:

JScrollBar 使用其中组件的首选大小来确定滚动条应该有多大,以及是否应该显示它们。

通常,布局管理器使用 preferredLayoutSize 方法来处理这个问题。这可以通过显式设置组件的首选大小来覆盖。

因此,您要么必须设置首选大小,要么使用自定义布局管理器为您计算它。

另见here

可能会对你有所帮助。

【讨论】:

  • 伙计们,我也尝试过首选尺寸,这是我的代码的链接yousendit.com/download/M3BuS3hmYWJlM1M5TE1UQw 谢谢
  • 我之前也尝试过首选尺寸,但没有成功。请检查代码。
  • 如果代码小于 1 KB,请将其编辑到问题中,而不是链接到它! (我已经做到了。)
【解决方案3】:

显示动态对象 .. 只能使用此布局来完成(我猜)。

你猜错了。

参见this GUI,它不仅可以在运行时更改 PLAF,还可以动态添加新组件1。点击到..

添加另一个标签

  1. 此示例将新标签添加到 GridLayout - 但任何布局(或任何组件)的原理都是相同的。

【讨论】:

  • 我的意思是我要放置动态对象!是的,其他人也可以做到!同意。尝试过网格布局。但我必须提供保证金。必须正确对齐它们。它不仅仅是在面板上扔物体。这就是为什么我使用绝对布局,以便我可以使用 setBounds 。也搜索了组布局,但添加动态对象不成功。
  • “这不仅仅是将物体扔到面板上。” 当然不是,但是,您不会将它们“扔”到面板上,您到底在哪里把它们?如果您可以用文字来描述,我相信我们可以确定一个 J2SE 或 3rd 方布局,它将以动态方式适应该组件的定位。我并不是说GridLayout 是您用例的最终答案,这就是为什么我添加(这次声音更大一点)此示例将新标签添加到 GridLayout - 但原理是相同的对于任何布局(或任何组件)。
【解决方案4】:

添加布局
jp.setLayout(new FlowLayout());

【讨论】:

    猜你喜欢
    • 2014-12-15
    • 2015-12-04
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多