【问题标题】:Swing: multiline toolbar or using Flowlayout as toolbarSwing:多行工具栏或使用 Flowlayout 作为工具栏
【发布时间】:2018-07-31 05:05:35
【问题描述】:

我的工具栏带有随机数量的按钮,从两个到二十个不等。每个按钮的宽度可以变化。

我必须将它们全部放在顶部区域并使用 JToolBar。在小屏幕分辨率(例如 800x600)上,某些按钮可能会超出屏幕(AFAIK JToolbar 无法增加高度)。

任何想法如何调整 JToolbar 以增加高度或以任何其他方式解决任务(例如使用 Flowlayout)?

【问题讨论】:

  • “多行工具栏或使用 Flowlayout 作为工具栏” 这不是一个非此即彼的决定。例如。 JToolBar tb = new JToolBar(); tb.setLayout(new FlowLayout(..)); // etc.
  • JToolBar() 可以增加高度。为什么说不能?
  • @KDM 能否分享一下 JToolBar 增长的代码?
  • @FoxyBOA 用代码添加了答案:)
  • @AndrewThompson 试过了。也没有帮助(在下面的 cmets 中看到你的名字)。仅在调整屏幕大小后,按钮才会部分可见。

标签: java swing user-interface flowlayout jtoolbar


【解决方案1】:

JToolBar 可以在添加的组件设置时增加高度。这是一个例子:

package toolbar;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;

public class ToolbarTest extends JFrame {
    private static final long serialVersionUID = 1L;

    private int n = 1;

    public ToolbarTest() {
        super(ToolbarTest.class.getName());
        JToolBar tb = new JToolBar();
        tb.add(new AbstractAction("First Action") {
            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                String text = "";
                for (int i = 0; i < n; i++) {
                    text += "Button - " + i + "<br>";
                }
                n++;
                JButton b = new JButton("<html>" + text + "</html>");
                tb.add(b);
                ToolbarTest.this.doLayout();
                ToolbarTest.this.pack();
            }
        });
        getContentPane().add(tb, BorderLayout.NORTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
    }

    public static void main(String[] args) {
        ToolbarTest tbt = new ToolbarTest();
        SwingUtilities.invokeLater(() -> tbt.setVisible(true));
    }
}

【讨论】:

  • 你没有得到我的问题。如果按钮的数量足够大(或屏幕分辨率会很小),那么从按钮 X 开始的所有按钮都将不在屏幕上。我需要工具栏和流程布局之间的共生行为(当所有看不见的按钮都在新行上时)。
  • 按照建议添加到您的样本中 @AndrewThompson tb.setLayout(new FlowLayout());也没有帮助。看不见的按钮仅在调整大小并部分可见后才会出现。
  • 使用 setLayout(new FlowLayout()) 并使用 BorderLayout.CENTER 添加工具栏。使用 BorderLayout.NORTH 时,BorderLayout 似乎没有正确计算高度。看看吧。
【解决方案2】:

我不确定这是否会有所帮助,您要不要使用功能区栏来代替?这样,它对用户来说就不那么复杂了(如果你有超过 7 个按钮)并且看起来很高效。实现如下(动态示例):创建JTabbedPane 并添加以下选项卡文件编辑帮助。在文件中,有新建项目打开保存另存为.. .在Edit中,有Copy、Paste等等。

【讨论】:

    【解决方案3】:

    此解决方案不使用JToolBar,而是使用带有多个按钮的GridLayout。该程序接受 n 个按钮并将它们放置在容器中。每行的列(或按钮)数是恒定的,并且行数会根据按钮的数量而增长。

    例如,如果一行包含 8 个列或按钮 - 12 个按钮被放置在两行中。这是一些代码来显示什么是可能的。请注意,该程序接受整数(按钮数)作为命令行参数。

    import javax.swing.*;
    import java.awt.*;
    public class ToolbarGrid {
        private static final int MAX_BUTTONS_PER_ROW = 4;
        public static void main(String [] args) throws Exception {
            if (args.length == 0) {
                System.out.println("Enter number of buttons as arg> java -cp . ToolbarGrid 9");
                return;
            }
            int noOfButtons = Integer.parseInt(args[0]);
            JFrame frame = new JFrame();
            frame.setTitle("Testing Toolbar in a Grid");
            GridLayout gLayout = new GridLayout(0, MAX_BUTTONS_PER_ROW); // 0 rows = any number of rows
            JPanel panel = new JPanel();
            panel.setLayout(gLayout);
            panel = panelWithButtons(noOfButtons, panel);
            frame.add(panel);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
            frame.pack();       
            frame.setVisible(true);
        }
        private static JPanel panelWithButtons(int noOfButtons, JPanel panel) {
            for (int i = 0; i < noOfButtons; i++) {
                panel.add(new JButton("Button_" + i+1));
            }
            return panel;
        }
    }
    


    编辑:以类似的方式,可以使用多个工具栏。每个工具栏限制 n 个按钮。此外,每个工具栏的按钮数量也可以由按钮的总宽度决定。

    【讨论】:

    • 这是明确的直接解决方案,不幸的是我的按钮具有可变宽度(可变变量)。我可能很悲观,假设每个工具栏只有 3/4 个按钮,但这意味着在某些情况下 UI 会很丑:(第 1 行:bbbb 地狱很多可用空间;第 2 行:bbb)
    • 你能说出按钮的样子吗?它们是否有长文本或大按钮、带图像的按钮等。放置按钮工具栏的窗口大小是多少?
    • 很少有按钮只有图像 (16x16)。大多数按钮都有可本地化的文本(基于此按钮的用户语言宽度可能会有所不同 - ???x16)。 Windows 尺寸必须为 800x600 及以上。
    • 如果可能,请张贴您如何可视化结果的草图。
    猜你喜欢
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2018-12-18
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多