【问题标题】:putting two JMenu's next eachother JAVA将两个 JMenu 彼此相邻放置 JAVA
【发布时间】:2022-01-20 17:13:03
【问题描述】:

我在一个框架上添加了两个JMenus

JFrame frame = new JFrame();
//Menu :
menuBar = new JMenuBar();
menu = new JMenu("Fichier");
menu2 = new JMenu("Options");
JSeparator sep = new JSeparator(SwingConstants.VERTICAL);
JButton btn = new JButton();
btn.addActionListener(MyListener);
menuBar.add(menu);
menuBar.add(sep);
menuBar.add(menu2);
frame.setJMenuBar(menuBar);

这是我想要的结果:

这是我得到的结果:

请给我关于这个框架是如何制作的任何想法:

我尝试使用JWindow 执行此操作并添加JTextArea,但它占用了整个窗口的大小,我什至无法在上面写字。

JWindow 的代码:

public class Fenetre extends JWindow
{
    int X;
    int Y;
    JTextArea ta;

    Fenetre()
    {
        setBounds(50, 50, 300, 300);
        ta = new JTextArea();
        JScrollPane scrollPane = new JScrollPane(ta);
        add(ta);
        
        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) 
            {
                X = e.getX();
                Y = e.getY();
            }
        });
        
        addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) 
            {
                Point p = getLocation();
                setLocation(p.x + (e.getX() - X), p.y + (e.getY() - Y));
            }
        });
        
        this.setVisible(true);
    }
}

【问题讨论】:

  • 删除分隔符
  • @MadProgrammer 确实有效,谢谢,你能帮我解决我的问题的第二部分吗?
  • 我同意 MadProgrammer。垂直分隔符不是必需的。除非您使用一些LayoutManager 并将其添加到JMenuBar,否则您将有那种“奇怪”的行为。基本上,有一种方法可以做你想做的事,但付出的努力可能不值得。
  • @hfontanez 哦,我明白了,我就用 menu2 = new JMenu("Options |");,谢谢!
  • 不知道为什么你个人需要JWindow,这不是我的首选,事实上,未装饰的JFrame 会是一个更好的起点

标签: java swing awt


【解决方案1】:

不要使用JWindow它有焦点问题(实际上我认为这是设计使然,但我不熟悉细节)

相反,只需使用未装饰的窗户(假设您想要的不是窗户装饰)

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {                
                JTextArea ta = new JTextArea(20, 40);

                JFrame frame = new JFrame();
                frame.setUndecorated(true);
                frame.add(new JScrollPane(ta));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

现在,如果您“需要”边缘周围的一些填充,请使用允许您指定填充的布局管理器或使用 EmptyBorder

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JTextArea ta = new JTextArea(20, 40);

                JFrame frame = new JFrame();
                JPanel content = new JPanel(new BorderLayout());
                content.setBorder(new EmptyBorder(16, 16, 16, 16));
                frame.setContentPane(content);
                frame.setUndecorated(true);
                frame.add(new JScrollPane(ta));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

我想你会发现:

一个更好的起点。

另外,以后,请提出 1 个具体问题,否则您可能会因“需要更多关注”而关闭问题

【讨论】:

    【解决方案2】:

    由于 MadProgrammer 在 cmets 中已经回答了第一部分,因此我将重点关注第二部分。据我了解,您希望在框架中放置一个占据整个空间的文本区域。

    第 1 步:创建内容窗格:

        JPanel contentPane = new JPanel(new BorderLayout());
        JTextArea console = new JTextArea(5, 30);
        scrollPane = new JScrollPane(console);
        contentPane.add(scrollPane, BorderLayout.CENTER);
    

    第 2 步:将其添加到框架中

        frame.setContentPane(contentPane);
    

    由于没有其他组件添加到框架中,框架布局管理器将允许此内容窗格“伸展”并占据整个空间。

    当框架首次渲染时,您不会看到滚动条。当您在文本区域中输入文本时,您最终会看到滚动条,因为组件中充满了信息。或者,您可以使文本区域的大小(当前设置为 5 x 30)大于框架的大小,您将看到滚动条。例如,如果您手动调整框架大小以使其小于 5 行(高)和 30 列(宽),您将看到滚动条呈现。为什么我这样说?这样您就可以决定您希望文本区域的正确大小。

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 2015-10-29
      • 2020-07-22
      • 2017-05-08
      相关资源
      最近更新 更多