【问题标题】:JTextField showing through JComboBox's dropdown after Scrolling滚动后通过 JComboBox 的下拉菜单显示 JTextField
【发布时间】:2015-11-24 22:47:26
【问题描述】:

JTextField 位于JScrollPanel 中时,如果面板已滚动,则只要JComboBox 的下拉列表位于JTextField 上方,文本字段就会通过下拉列表显示。

在内容滚动后发生(而不是在应用程序启动时)。

主要问题是我们如何解决这个问题? 如果回答,则加分:

  • 不是黑客
  • 首先解释为什么会发生这种情况

我尝试过的事情:

  • 将下拉菜单移到滚动窗格之外(无变化)
  • 为我在滚动条上找到的所有容器添加重绘(无变化)
  • 滚动窗格内容的不同布局管理器(无变化)

代码示例:

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

public class TextFieldShowsThrough{

    public static void main(String[] args){
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(createScrollDemo());
        frame.pack();
        // For demonstration purposes
        frame.setSize(frame.getWidth() + 100, frame.getHeight() - 100);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static JScrollPane createScrollDemo(){
        final Box optionsPanel = Box.createVerticalBox();
        optionsPanel.add(createDropDown());
        optionsPanel.add(createTextField("Option1"));
        optionsPanel.add(createTextField("Option2"));
        optionsPanel.add(createTextField("Option3"));
        optionsPanel.add(createTextField("Option4"));
        optionsPanel.add(createTextField("Option5"));
        optionsPanel.add(Box.createVerticalGlue());
        JScrollPane result = new JScrollPane(optionsPanel);
        // Made attempts to fix here, but to no avail
        /*result.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {

            @Override
            public void adjustmentValueChanged(AdjustmentEvent e) {
                result.repaint();
            }
        });*/
        return result;
    }

    public static Box createDropDown(){
        Box b = Box.createVerticalBox();
        b.setAlignmentX(JLabel.LEFT_ALIGNMENT);
        b.add(new JLabel("Language"));
        JComboBox combo = new JComboBox(new String[]{"en", "fr", "es"});
        combo.setMaximumSize(new Dimension(500, 25));
        b.add(combo);
        return b;
    }

    public static Box createTextField(String label){
        Box mainBox = Box.createVerticalBox();
        mainBox.setOpaque(true);
        mainBox.setBackground(new Color((int)(Math.random() * 0x1000000)));  // because fun

        JLabel jLabel = new JLabel(label);
        jLabel.setAlignmentX(JLabel.LEFT_ALIGNMENT);
        mainBox.add(jLabel);

        Box secondaryBox = Box.createHorizontalBox();
        secondaryBox.setAlignmentX(JLabel.LEFT_ALIGNMENT);

        TextField tf = new TextField();
        tf.setMaximumSize(new Dimension(500, 25));
        secondaryBox.add(tf);

        mainBox.add(secondaryBox);

        return mainBox;
    }
}

【问题讨论】:

    标签: java swing jcombobox


    【解决方案1】:

    这是因为您在轻量级容器中使用了 java.awt.TextField,它是重量级组件。 JComboBox 使用的弹出窗口也可以是一个轻量级的组件。

    AWT 组件不能很好地与 Swing 组件配合使用,它们存在 z 顺序问题。

    TextField tf = new TextField(); 更改为JTextField tf = new JTextField();

    您还应该避免使用setPreferred/Minimum/MaximumSize(有关详细信息,请参阅Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?),而应使用布局约束和大小提示(如JTextFieldcolumns 属性)

    【讨论】:

    • 看别人的代码时怎么会错过那个小“J”。容易解决,很好的答案。会尽快接受。
    • 我猜你的意思是this 代码?
    • :P 是的 - 问题中有问题(刷新内容?)我无法重现,所以我无法“修复”这个问题,但它确实激发了好奇心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2019-01-10
    • 2012-05-27
    • 2017-06-09
    相关资源
    最近更新 更多