jpanel下拉菜单关闭

tcbh2hod  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(378)

我正在通过创建一个文本分析程序(wordcount、tf-idf等)来练习java。
我现在正在构建一个显示在框架顶部的小gui。我想要一个下拉菜单,我正在尝试创建一个使用 JPanel 还有几个 JButton 组件。但是为了使下拉列表可重用,我一直在尝试构造一个类来管理它。
但是,我遇到了一个问题:当我尝试创建下拉菜单时,它只在框架的左上角可见,如果我尝试移动它,它会被切断或完全消失。
我尝试创建一个简单的方法来做同样的事情,但问题仍然是一样的。以下是相关代码(忽略处理器和 State 材料):

public class ExperimentState extends State {

    private JFrame frame;

    public ExperimentState(Processor processor) {
        super(processor);
        initialize();
    }

    private void initialize() {
        int width, height;
        //these variables are temporary, for testing
        width = 800;
        height = 640;

        //Set up the frame
        frame = new JFrame();
        frame.setSize(width, height);
        frame.getContentPane().setLayout(null);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Test code
        String[] buttonNames = { "42", "Don't panic!", "Towel"};
        //                         x, y, width, height, button names
        JPanel panel = createPanel(0, 0, 100, 25, buttonNames);
        frame.getContentPane().add(panel);  
    }

    public JPanel createPanel(int x, int y, int width, int height, String[] names) {
        //Create and setup the panel
        JPanel panel = new JPanel();
        panel.setLayout(null);
        panel.setBounds(x, y, width, height);

        JButton[] buttons = new JButton[names.length];
        for(int i = 0; i < names.length; i++) {
            JButton button = new JButton(names[i]);
            button.setBounds(x, y + height*i, width, height); //each button has the size of the panel, and are placed on top of each other
            panel.add(button);
            buttons[i] = button;
        }
        buttons[0].addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                panel.setBounds(x, y, width, height*names.length); //the panel extends to reveal all the buttons
            }   
            public void mouseExited(MouseEvent e) {
                panel.setBounds(x, y, width, height); //the panel retracts
            }
        });

        return panel;   
    }

    @Override
    public void display() {
        frame.setVisible(true); 
    }

    @Override
    public void hide() {
        frame.setVisible(false);    
    }
}

我认为鼠标侦听器会有问题,因为我不知道它们是如何工作的,并且认为它们无法访问 x , y , width 以及 height 变量,但没有问题。
我打电话的时候问题就出现了 createPanel() 比如说 createPanel(50, 0, 100, 25, buttonNames) .
这里,x是50而不是0。当面板显示时,它会像应该的那样向右移动,但是它的按钮现在被一些不可见的线切成两半。如果x=100,它将完全不可见。
为什么会这样?我错过了什么?

ttvkxqim

ttvkxqim1#

容器中的组件只有在这些组件的边界完全在容器中时才会完全显示(没有layoutmanager)。通过将x坐标从0更改为50,可以移动按钮的位置。如果你不改变它的大小或你的容器大小你的按钮将被切断。
解决此问题的最简单方法是将按钮位置中的x和y替换为0,并将面板位置中的0替换为x和y。
编辑:这里有类似的问题:组件没有显示在第二个jpanel中

相关问题