【问题标题】:Add JTextField to OverlayLayout将 JTextField 添加到 OverlayLayout
【发布时间】:2014-01-11 23:53:50
【问题描述】:

我有一个 JTextField 添加到 OverlayLayout,但 JTextField 会自动缩放为整个面板的尺寸,这是我不想要的。我也不想弄乱 JTextField 的尺寸,因为默认高度正好适合字体,而宽度应该由构造函数中的列数定义。解决此问题的正确方法是什么?

这是我现在拥有的相关代码: 框架 = 新的 JFrame("框架"); frame.setResizable(false);

panel = new GamePanel();
panel.setPreferredSize(new Dimension(500,300));
panel.setLayout(new OverlayLayout(panel));
JTextField t = new JTextField(50);
panel.add(t);

frame.add(panel);
frame.pack();
frame.setVisible(true);

GamePanel 只是 JPanel 的一个子类;它不会做任何会影响 JTextField 的事情。

编辑:好的,我现在听说使用默认的 Swing 布局管理器并不是最好的主意。 kleopatra 链接了一个页面,该页面引用了三个第三方布局,这些布局应该可以完成您需要做的几乎所有事情,但是我找不到任何可以让我将文本字段(或其他组件)覆盖到另一个自定义渲染面板上的东西。什么是正确的方法?

【问题讨论】:

标签: java swing jtextfield


【解决方案1】:

这是否如您所愿?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.LayoutManager;

import javax.swing.JTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.OverlayLayout;

public class OverlaySampleAlignment0 {
  public static void main(String args[]) {
    JFrame frame = new JFrame("Overlay Example");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel = new JPanel();
    panel.setPreferredSize(new Dimension(500,300));

    LayoutManager overlay = new OverlayLayout(panel);
    panel.setLayout(overlay);

    JTextField field = new JTextField("", 12);
    field.setMaximumSize(field.getPreferredSize());

    //button.setMaximumSize(new Dimension(25, 25));
    field.setBackground(Color.white);
    field.setAlignmentX(0.0f);
    field.setAlignmentY(0.0f);    
    panel.add(field);


    frame.add(panel);
    frame.setResizable(false);
    frame.pack();
    frame.setVisible(true);
  }
}

高度正是字体所需的高度,宽度是(在我的示例中)12 个“列”(在我的 Java 设置中,JTextField 默认不使用等宽字体)。另外我把它对齐在左上角。

这也可能有助于解决布局问题: Link

大部分代码都从这里复制:Link。我刚刚添加了 setMaximumSize(...) 并使用了 JTextField 而不是按钮等。

【讨论】:

  • @kleopatra:你能澄清一下吗?这些是大小提示,告诉 LayoutManager 这个对象想要什么。我提供的链接中甚至提到了它:•Another way to give size hints is to invoke the component's setMinimumSize, setPreferredSize, and setMaximumSize methods.。您说不信任 Oracle,或者您基于什么建议不要使用这些方法?
  • 阅读引用的线程并进行一些搜索 - 有点厌倦重复自己:-)
猜你喜欢
  • 2012-07-02
  • 2015-12-16
  • 2015-05-14
  • 1970-01-01
  • 2015-12-16
  • 2017-10-11
  • 2014-10-29
  • 1970-01-01
  • 2018-04-18
相关资源
最近更新 更多