当前位置: 首页 > 知识库问答 >
问题:

如何将JScrollPane添加到JMenu?

贺栋
2023-03-14

请帮助我,我正在创建像sublime text editor这样的软件。我想显示可用的字符集列表,下面是主要问题的图片。在这张图片中,我看到的菜单弹出窗口至少有200多个字符集,但只有显示。。。某物但是要显示所有字符集。没有为该弹出菜单添加滚动条的选项

我的软件图片有问题,请看那个红色圆圈。

请任何人帮助我如何添加滚动条到那个JMenu

共有1个答案

葛鸿熙
2023-03-14

与其使用JScrollPane,我建议在该子菜单中添加几个(可能是最流行的)字符集(菜单项),并将最后一个菜单项称为更多...,单击它将打开一个JDialog弹出窗口窗口中包含供用户选择的完整字符列表。

但是,如果您仍然想要使用JScrollPane,我刚刚实现了一个变通解决方案(如下所示)。因为JMenuItemcoms似乎不能在JScrollPane中使用(一旦鼠标悬停,菜单将自动关闭),所以使用了JLabelcoms。一个鼠标监听器被添加到每个标签中,以模仿菜单项的行为,即在鼠标进入/退出时改变颜色,以及在单击项目时“做某事”(在这种情况下,标签的文本被打印出来,这将有助于决定接下来会发生什么)。您可能需要调整scrollPane.setPreferredsize以满足您的要求,以及鼠标进入/退出项时的颜色(尽管,为了方便起见,当前LookAndFe为JMenuItem使用的默认颜色>被使用)。

编辑:使用

菜单xample.java

import javax.swing.*;
import java.awt.*;
import java.util.Random;

public class MenuExample {
    Random rand = new Random();
    Color menuBackCol;
    Color mItemBackCol;
    Color mItemForegCol;
    Color mItmSelBackCol;
    Color mItmSelForegCol;

    MenuExample() {
        menuBackCol = UIManager.getColor("Menu.background");
        mItemBackCol = UIManager.getColor("MenuItem.background");
        mItemForegCol = UIManager.getColor("MenuItem.foreground");
        mItmSelBackCol = UIManager.getColor("MenuItem.selectionBackground");
        mItmSelForegCol = UIManager.getColor("MenuItem.selectionForeground");

        Box box = new Box(BoxLayout.Y_AXIS);

        for (int i = 0; i < 250; i++) {
            box.add(Box.createRigidArea(new Dimension(0, 2))); // creates space between the components
            JLabel lbl = new JLabel("<html>" + i + " : " + rand.nextInt(10000) + "</html>");
            lbl.setOpaque(true);
            lbl.setBackground(mItemBackCol);
            lbl.addMouseListener(
                    new LabelController(lbl, mItemBackCol, mItemForegCol, mItmSelBackCol, mItmSelForegCol));
            box.add(lbl);
        }

        JScrollPane scrollPane = new JScrollPane(box);
        scrollPane.getVerticalScrollBar().setUnitIncrement(20); // adjusts scrolling speed
        scrollPane.setPreferredSize(new Dimension(100, 300));
        scrollPane.setBorder(BorderFactory.createEmptyBorder());
        scrollPane.getViewport().setBackground(menuBackCol);

        JMenuBar mb = new JMenuBar();
        JMenu menu = new JMenu("Menu");
        JMenu submenu = new JMenu("Sub Menu");
        submenu.add(scrollPane);
        menu.add(new JMenuItem("Item 1"));
        menu.add(new JMenuItem("Item 2"));
        menu.add(new JMenuItem("Item 3"));
        menu.add(submenu);
        mb.add(menu);

        JFrame f = new JFrame("Menu with ScrollBar Example");
        f.setJMenuBar(mb);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(640, 480);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String args[]) {
        new MenuExample();
    }
}

标签控制器。JAVA

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

public class LabelController implements MouseListener {

    JLabel lbl;
    Color mItemBackCol;
    Color mItemForegCol;
    Color mItmSelBackCol;
    Color mItmSelForegCol;

    public LabelController(JLabel lbl, Color mItemBackCol, Color mItemForegCol, Color mItmSelBackCol,
            Color mItmSelForegCol) {
        this.lbl = lbl;
        this.mItemBackCol = mItemBackCol;
        this.mItemForegCol = mItemForegCol;
        this.mItmSelBackCol = mItmSelBackCol;
        this.mItmSelForegCol = mItmSelForegCol;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        String selectedText = lbl.getText().replaceAll("<[^>]*>", "");
        System.out.println(selectedText);
        javax.swing.MenuSelectionManager.defaultManager().clearSelectedPath(); // close the menu
        lbl.setBackground(mItemBackCol);
        lbl.setForeground(mItemForegCol);
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        lbl.setBackground(mItmSelBackCol);
        lbl.setForeground(mItmSelForegCol);
    }

    @Override
    public void mouseExited(MouseEvent e) {
        lbl.setBackground(mItemBackCol);
        lbl.setForeground(mItemForegCol);
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }
}

 类似资料:
  • 问题内容: 我有一个gui,它的Panel包含一系列标签和TextField,并使用spring布局(这是mainPanel),而另一个Panel仅包含button(buttonPanel)。我正在尝试使我的mainPanel也具有垂直滚动条。我想实现我的GUI,以便在JFrame中有2个面板。mainPanel出现在框架的顶部,而buttonPanel出现在mainPanel的下方。 我的问题是

  • 问题内容: 我有一个JList,我需要将其放置在滚动窗格中,因为我是从数据库中获取JList的,其值可能会大大增加。我需要能够向下滚动它们,所以我写道: 因为看不到任何ScrollPane,我在做什么错? 问题答案: 该列表已经包含在滚动窗格中,因此您不能将列表添加到主面板。仅滚动窗格。 您做错的另一件事是不使用布局管理器,而是设置组件的边界和大小。不要那样做 让布局管理器为您定位和调整组件的大小

  • 我有一个关于向Java框架添加组件的问题。 我有一个带有两个按钮的JGroup和一个添加了JTable的JScrollPane。我想将这两个都添加到JFrame中。 我可以将JPanel添加到JFrame,或者将JScrollPane添加到JFrame,并且它们可以正确显示。我很难将它们都添加到JFrame并显示它们。 是否有与JFrames相关的东西不允许这样做?任何帮助都将不胜感激。 编辑 问

  • 我目前有一个主JFrame包含几个JPanels,每个面板中都有一些文本。创建JPanels的代码在一个单独的类中(它“实现”JPanels)。如何仅向单个面板添加JScrollPane? 我已经花了一些时间尝试这样做,但什么也没有发生。顺便说一下,我的JPanel使用GridLayout 上面的类是另一个面板类的实例变量,它是主面板“MenuHold”的实例变量。但使用“MenuHolder”的

  • 我试图将JTable添加到JScrollPane中。但是做完这个我就看不到桌子了。 我怎么了?

  • 问题内容: 我正在尝试向JTable中的特定列添加滚动功能。我已经实现了一个自定义的TableCellRenderer组件,并且可以看到表中的滚动窗格很好,但是我无法滚动它。我也尝试实现TableCellEditor,但没有任何运气。 有谁知道如何使包含scrollPane的单元格可滚动? 问题答案: 使用TableCellRenderer不可能添加任何滚动行为,因为它不接收任何事件,仅绘制组件。