JTextField在每次输入内容时创建自身的副本



在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时得到的结果。

我得到的是boxOne垂直一分为二。这绝对不是期望的结果。

更奇怪的是,当在boxTwo中输入文本时,它似乎在同一位置复制了自己。两个奇怪的重叠

我的目标是把boxOne放在顶部,不间断,boxTwo在它下面,能够在没有这里描述的奇怪行为的情况下输入它。我是Java新手,所以可能我错过了一些明显的东西。

因为您将opaque设置为true, Swing假设标签和文本框背景不是半透明的,并且在绘制背景之前不会清除正在被背景颜色绘制的区域。然后,使用为组件设置的背景颜色,使用矩形绘制背景。这将在每次绘制时覆盖一个新的矩形,例如每次键入一个键。这就是为什么它看起来像在复制控件,尽管它不是。

如果你将opaque设置为false,它甚至不会尝试绘制背景。

将alpha通道从这些背景颜色中移除,这样就可以了。

相关内容

  • 没有找到相关文章

最新更新