每次在其中输入内容时,JTextField 都会创建自身的副本[关闭]
Posted
技术标签:
【中文标题】每次在其中输入内容时,JTextField 都会创建自身的副本[关闭]【英文标题】:JTextField creating copies of itself every time something is typed in it [closed] 【发布时间】:2021-11-12 18:48:05 【问题描述】:在 BoxLayout 中使用 JTextField 时,我遇到了一些非常奇怪的行为。这是产生问题的代码:
public static void main(String[] args)
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(new Dimension(900,500));
f.getContentPanel().setBackground(Color.BLACK);
f.setLayout(new BoxLayout(f.getContentPane(), BoxLayout.PAGE_AXIS));
JLabel boxOne = new JLabel();
boxOne.setBackground(new Color(33,255,240,75));
boxOne.setOpaque(true);
boxOne.setMinimumSize(new Dimension(900,50));
boxOne.setMaximumSize(new Dimension(900,50));
boxOne.setPreferredSize(new Dimension(900,50));
boxOne.setForeground(Color.WHITE);
boxOne.setText("This is the first box.");
JTextField boxTwo = new JTextField();
boxTwo.setBackground(new Color(33,255,240,75));
boxTwo.setOpaque(true);
boxTwo.setMinimumSize(new Dimension(900,50));
boxTwo.setMaximumSize(new Dimension(900,50));
boxTwo.setPreferredSize(new Dimension(900,50));
boxTwo.setForeground(Color.WHITE);
f.add(boxOne);
f.add(boxTwo);
f.setVisible(true);
我期望的是一个顶部显示 boxOne 的窗口,然后在其下方显示 boxTwo。这是将 boxTwo 设为 JLabel 而不是 JTextField 时得到的结果。 This looks as desired.
我得到的是 boxOne 垂直分成两部分。 This is definitely not the desired result.
更奇怪的是,当在 boxTwo 中输入文本时,它似乎在同一位置复制了自身。 boxTwo bizarre overlap.
我的目标是让 boxOne 位于顶部,不间断,而 boxTwo 在其下方,能够在没有此处描述的奇怪行为的情况下输入它。我是 Java 新手,所以也许我遗漏了一些明显的东西。
【问题讨论】:
1)new Color(33,255,240,75)
Swing 不适用于半透明颜色。 2) 为鼓励人们测试代码,请发帖minimal reproducible example。
在布局组件时,避免使用 setMinimumSize、setMaximumSize 和 setPreferredSize。相反,使用您使用的 LayoutManager(BoxLayout、GridLayout 等)中的功能来完成它。
【参考方案1】:
因为您将 opaque 设置为 true,Swing 假定标签和文本框背景不是半透明的,并且在绘制背景之前不会清除背景颜色所绘制的区域。然后它继续使用为组件设置的背景颜色使用矩形绘制背景。每次绘制时都会覆盖一个新矩形,例如每次键入键时。这就是为什么它看起来像是在复制控件,但实际上并非如此。
如果将 opaque 设置为 false,它甚至不会尝试绘制背景。
从这些背景颜色中删除 alpha 通道,你应该会很好。
【讨论】:
从这些背景颜色中删除 Alpha 通道 - 但是您将没有透明度。如果您真的想要透明度,请查看:Backgrounds With Transparency 以获得解决方案。以上是关于每次在其中输入内容时,JTextField 都会创建自身的副本[关闭]的主要内容,如果未能解决你的问题,请参考以下文章