gpt4 book ai didi

java - JPopupMenu 菜单项和组件

转载 作者:行者123 更新时间:2023-12-02 04:08:44 26 4
gpt4 key购买 nike

我有一个弹出菜单,其中包含一个带有图标 (I) 的 JMenuItem 和一个 JList。见下图。

------------------------
| I | Clear |
|----------------------|
| | List |^|
| | Item A | |
| | Item B | |
| | Item C | |
| | |v|
------------------------

当我最初创建弹出窗口时,列表与左侧对齐,并且没有考虑图标偏移。

我能够找到一种使用 sun.swing.SwingUtilities2.BASICMENUITEMUI_MAX_TEXT_OFFSET 客户端属性来移动列表的方法。

// Move the items out of the gutter (Run inside of the show(Component, int, int) method)
final Integer gutter = (Integer) getClientProperty(SwingUtilities2.BASICMENUITEMUI_MAX_TEXT_OFFSET);
panelList.removeAll();
panelList.add(Box.createHorizontalStrut(gutter));
panelList.add(scrollList);

但是,我无法在生产代码中使用该常量(因为它位于 sun 包中)。

如何在不依赖 Java 内部的情况下检索最大文本/图标偏移量?

最佳答案

对此的一种常见解决方案是为每个菜单项添加一个与菜单图标大小相同的空图标。

您也许可以使用下面代码中的概念,其中使用:

SwingUtilities.layoutCompoundLabel(...);

基本上,它获取标签的布局信息,以确定文本和图标相对于整个标签的实际绘制位置。如果您知道该信息,您应该可以得到补偿。

此示例仅在标签中的图标上绘制网格线:

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

public class LabelLayout extends JLabel
{
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);

Graphics grid = g.create();
grid.setColor( Color.ORANGE );

Rectangle viewR = new Rectangle();
viewR.width = getSize().width;
viewR.height = getSize().height;
Rectangle iconR = new Rectangle();
Rectangle textR = new Rectangle();

String clippedText = SwingUtilities.layoutCompoundLabel
(
this,
grid.getFontMetrics(),
getText(),
getIcon(),
getVerticalAlignment(),
getHorizontalAlignment(),
getVerticalTextPosition(),
getHorizontalTextPosition(),
viewR,
iconR,
textR,
getIconTextGap()
);

int gridSize = 10;
int start = iconR.x;
int end = iconR.x + iconR.width;

System.out.println( iconR );

for (int i = start; i < end; i += gridSize)
{
grid.drawLine(i, iconR.y, i, iconR.y + iconR.height);
}

grid.dispose();

// g.setColor( getForeground() );
// g.drawString(display, textR.x, textR.y + fm.getHeight());
// System.out.println(iconR + " : " + textR);
}

private static void createAndShowGUI()
{
LabelLayout label = new LabelLayout();
label.setBorder( new LineBorder(Color.RED) );
label.setText( "Some Text" );
label.setIcon( new ImageIcon( "DukeWaveRed.gif" ) );
label.setVerticalAlignment( JLabel.CENTER );
label.setHorizontalAlignment( JLabel.CENTER );
// label.setVerticalTextPosition( JLabel.BOTTOM );
label.setVerticalTextPosition( JLabel.TOP );
label.setHorizontalTextPosition( JLabel.CENTER );

JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( label );
frame.setLocationByPlatform( true );
frame.pack();
frame.setSize(300, 200);
frame.setVisible( true );
}

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
}

我认为 JMenu 会使用相同的布局。

关于java - JPopupMenu 菜单项和组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34007751/

26 4 0