当FieldSize不够时,如何在PopupMenu中使项目更紧密空白更少

问题描述

|| 我正在尝试格式化PopupMenu,并注意到当我使FieldSize-> 7时,菜单中的一项将换行,即使在我看来似乎有足够的空白可以使用在右边。 当我将FieldSize-> 8增大时,fieldSize现在就足够了,并且所有菜单项都不会环绕。 但是在我看来,现在已经浪费了空白空间。我尝试了PopupMenu的许多选项,例如ContentPadding等,以使项目更紧密,但是当我将fieldSize设置回7时,它坚持要包装该项目。 可能是字体样式问题?我想知道是否有人对此有窍门。 这是代码,并显示问题
Manipulate[
opt,Control[{ {opt,Style[\"display\",11]},{0->Text@Style[\"bob only\",Small],4->Text@Style[\"L + bob\",1->Text@Style[\"L only\",2->Text@Style[\"L resolved\",3->Text@Style[\"L + resolved\",5->Text@Style[\"L resolved + bob\",6->Text@Style[\"show all above\",Small]        
},ControlType->PopupMenu,FieldSize->7,ImageMargins->0,FrameMargins->0,ContentPadding->True,ImageSize->Small}]

]
这是我打开菜单时的屏幕截图 所以,现在我更改FieldSize-> 8,现在看起来像这样: 但是请注意上面的内容,我认为右边的空白太多,并且FieldSize-> 7应该足够宽,以至于该项目不会被包裹起来? 我尝试了FontFamily-> \“ Times \”和\“ Courier \”,效果相同:
Manipulate[opt,Small,FontFamily->\"Courier\"],FontFamily->\"Courier\"]
},ImageSize->Small}]
]
实际上,现在使用Courier,我不得不去FieldSize-> 9来使该字段现在不环绕。因此,使用Courier变得更糟。 是否可以使领域变得比现在更紧密? 编辑1: 回复MrWizard: 编辑2: 使用FieldSize-> Automatic,使整个菜单大小根据所选项目而改变大小。
Manipulate[opt,Control[{{opt,{0->Style[\"bob only\",1->Style[\"L + bob\",2->Style[\"L only\",3->Style[\"L resolved\",4->Style[\"L + resolved\",5->Style[\"L resolved + bob\",6->Style[\"show allabove\",Small]},FieldSize->Automatic,ImageSize->Small}]]
更新12月21日凌晨1点 下图显示了如何使用Leonid宏方法使其变得更容易 通过使用来构建UI并减少用于UI对象定制的代码重复 宏。我目前大量使用此方法,并且具有超过 仅用于UI本身的4,000行,我不可能用旧的方式完成, 因为我只会失去对事物的控制。 宏使管理代码布局更容易,而且更重要的是,现在我 可以通过编辑小代码而不是 宏代表的较大代码。没有GUI构建器,宏 接下来是最好的东西:) 这是上面的代码
Manipulate[

 Row[{opt1,opt2}],Evaluate@With[{
    popUpMenu1Options = MenuStyle -> {Red},popUpMenu2Options = MenuStyle -> {Black},popUpMenuCommonoptions = {BaseStyle -> 20,ImageMargins -> 0,FrameMargins -> 0,ImageSize -> All}
    },With[{

     menu1 = PopupMenu[Dynamic[opt1],{\"A\",\"B\"
        },Sequence[popUpMenu1Options,popUpMenuCommonoptions]
       ],menu2 = PopupMenu[Dynamic[opt2],{\"C\",\"D\"
        },Sequence[popUpMenu2Options,popUpMenuCommonoptions]
       ]
     },Row[{menu1,menu2}]

    ]
   ],{{opt1,\"A\"},None},{{opt2,\"D\"},TrackedSymbols :> {opt1,opt2}
 ]
    

解决方法

        根据Simon的答案进行略微修改会更好:
Manipulate[opt,Control[{{opt,Style[\"display\",11]},{0 -> Style[\"bob only\",Small],1 -> Style[\"L only\",4 -> Style[\"L + bob\",2 -> Style[\"L resolved\",3 -> Style[\"L + resolved\",5 -> Style[\"L resolved + bob\",6 -> Style[\"show all above\",Small]},ControlType -> PopupMenu,ImageMargins -> 0,FrameMargins -> 0,ImageSize -> All}]]
    ,        我不得不删除所有的
Text@
内容,因为这会导致系统上的行显示为空白。 这里似乎有两个问题。 您可以使用小数
FieldSize
您必须考虑下拉箭头的宽度 您可以看到,我可以在最长的直线上得到相当紧密的配合:
Manipulate[opt,FieldSize -> 6.4,ImageSize -> Small}]]
通常,我认为Mathematica最好不要将文本压缩为箭头。我不知道一种实现这种效果的方法,如果那是您所追求的。     ,        我猜一个愚蠢的解决办法是将所有字符串都填充到相同(最大)长度,然后使用
FieldSize->Automatic
StringPad[str_String,n_Integer] := StringJoin[PadRight[Characters[str],n,\" \"]]

menuItems = {0->\"bob only\",1->\"L only\",2->\"L resolved\",3->\"L + resolved\",4->\"L + bob\",5->\"L resolved + bob\",6->\"show all above\"};

maxStr = Max@StringLength@menuItems[[All,2]]

(* Out[3]= 16*)

f[str_String] := StringPad[str,maxStr]

Manipulate[opt,MapAt[f,#,2]&/@menuItems,ControlType->PopupMenu,FieldSize->maxStr,ContentPadding->False,ImageMargins->0,FrameMargins->0,ImageSize->Small}]]
这可以用您自己的自定义
PopupMenu
自动执行。     ,        只是在寻找其他答案时碰到了这一点。在可能的情况下,我希望将样式与功能分开,因此,对于上述示例,我的偏好是仅列出一组样式选项,而不是对每个标签进行样式设置,例如
Manipulate[opt,Style[
  Control[{{opt,\"display\"},{0 -> \"bob only\",1 -> \"L only\",4 -> \"L + bob\",2 -> \"L resolved\",3 -> \"L + resolved\",5 -> \"L resolved + bob\",6 -> \"show all above\"},ControlType -> PopupMenu}],DefaultOptions -> {PopupMenu -> {BaseStyle -> 10,ImageSize -> All,MenuStyle -> {Red,11}}}]]
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...