将文本集中在JMenu中

时间:2012-07-30 19:51:04

标签: java swing jmenu

好吧,我一直在网上寻找一些帮助,但我尝试的任何东西似乎都没有用。我希望所有菜单文本都以菜单按钮为中心。当我使用setHorizontalTextPosition(JMenu.CENTER)时,没有任何变化。事实上,无论我使用哪种常量,菜单文本都保持左对齐。

有什么想法吗?

* 更新1

仍然没有运气。在重新阅读JMenu API之后,我意识到setHorizontalTextPosition(int)setVerticalTextPosition(int)仅设置了与图标相关的文本,而setHorizontalAlignment(int)setVerticalAlignment(int)设置了文本和JMenu中的图标。

文本定位方法在与图标一起使用时似乎与宣传的一样。

垂直对齐方法似乎适用于文本或图标或两者。

然而,水平对齐方法似乎根本不起作用。即使只在文本或图标或两者上单独使用它,似乎没有任何改变。我已将菜单大小增加到150x50,无论组合如何,我都无法获取文本或图标或者水平居中。

5 个答案:

答案 0 :(得分:3)

继续MadProgrammer使用HTML的主题,我使用CSS来定位和设置菜单中的文本样式。 style="text-align:center;"是用于将文字放在中心的CSS。就我而言,我将JMenu标题封装在<p>元素内的<html>段落标记中;

clientFilter = new JMenu("<html><p style='text-align:center;'>Client</p></html>");
siteFilter = new JMenu("<html><p style='text-align:center;'>Site</p></html>");
employeeFilter = new JMenu("<html><p style='text-align:center;'>Employee</p></html>");
jobtypeFilter = new JMenu("<html><p style='text-align:center;'>Job Type</p></html>");

看起来像这样;

enter image description here

值得注意的是,在上图中我还在style属性中使用了width:90px;color:blue;,但为了简单起见,我从上面的代码示例中删除了这两个样式。希望这会有所帮助。

答案 1 :(得分:2)

尝试setHorizontalTextPosition(SwingConstants.CENTER);,然后invalidate();

或者使用margins

JMenu optionsMenu = new JMenu("Option");
optionsMenu.setMargin(new Insets(5, 50, 5, 5));

我做了一个简短的SSCCE,看看我是否可以重新解决这个问题,但是从一开始我就完全一致,不需要上述任何一个:

链接到屏幕截图:http://img713.imageshack.us/img713/1489/67449235.jpg

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.SwingUtilities;

public class JMenuCenterTest extends JFrame {

    public JMenuCenterTest() {
        createUI();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JMenuCenterTest().setVisible(true);
            }
        });
    }

    private void createUI() {
        setTitle("JMenu Center Test");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 300);
        JMenuBar bar = new JMenuBar();
        JMenu menu1 = new JMenu("File");
        //menu1.setMargin(new Insets(5, 50, 5, 5));
        JMenu menu2 = new JMenu("Options");
        JMenu menu3 = new JMenu("Help");
        //menu1.setHorizontalTextPosition(SwingConstants.CENTER);
        // invalidate();
        bar.add(menu1);
        bar.add(menu2);
        bar.add(menu3);
        getContentPane().add(bar, BorderLayout.NORTH);
    }
}

参考:

答案 2 :(得分:2)

好的,我已经玩过这个了,我得出的结论是,我认为通过设置JMenu的属性是不可能的。

你做的任何事情都被UI代表覆盖了。

试试这个:

JMenu menu = new JMenu("<html><table width='100%'><tr><td halign='center' align='center' bgcolor='red'>File</td></tr></table></html>");

menuBar.add(menu);

您会发现,无论您制作菜单的宽度如何,提供给文本的区域也足以渲染它。

Example of menu text

我可以看到你离开的唯一选择是提供你自己的UI委托,这是恕我直言,一个非常非常糟糕的主意,最终只会在你面前爆炸,但这只是我的意见:P

答案 3 :(得分:1)

我认为setHorizontalAlignment应该做你想要的,而setHorizontalTextPosition指定相对于图标的文字位置。

答案 4 :(得分:1)

所以解决方案是:

private JMenuBar menu;
private JMenu file;

Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
double height = (double)screenSize.getHeight();
double widht = (double)screenSize.getWidth();

double frameh = 0.3*height; int frameH =(int)Math.ceil(frameh);
double framew = 0.3*widht;  int frameW = (int)Math.ceil(framew);

double menuh = 0.1*frameh;      int menuH = (int)Math.ceil(menuh);
double menuw = framew;          int menuL = frameW;

double fileh = menuh;       int fileH = menuH;
double filew = 0.1*menuw;   int fileW = (int)Math.ceil(filew);

    int textPos= fileW-10; //at the start of the button you have a little margin and you must leave somme pixel to fixe the center.

Window(){

    initialisation();
    construction();

    this.setTitle("Tutoriel 1.3 HS");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(frameW, frameH);
    this.setLocationRelativeTo(null);
    this.setVisible(true);
}

public void initialisation(){       
    file = new JMenu(("<html><table width='"+textPos+"'><tr><td align='center'>File</td></tr></table></html>"));// this is accept


    file.setPreferredSize(new Dimension(fileW, fileH));
    menu = new JMenuBar();
    menu.setPreferredSize(new Dimension(menuL, menuH));
    menu.add(file);     
}

public void construction(){
    this.setJMenuBar(menu);
}