Java Swing:多行工具栏或使用Flowlayout作为工具栏

Java Swing:多行工具栏或使用Flowlayout作为工具栏,java,swing,user-interface,flowlayout,jtoolbar,Java,Swing,User Interface,Flowlayout,Jtoolbar,我有一个工具栏,上面有从两个到二十个随机数目的按钮。每个按钮的宽度可以不同 我必须把它们都放在顶部区域,并使用JToolBar。在小屏幕分辨率(例如800x600)上,一些按钮可能会在屏幕外(AFAIK JToolbar不能在高度上生长) 如何调整JToolbar以适应高度增长或以任何其他方式(例如使用Flowlayout)解决任务?我不确定这是否有帮助,不如改用ribbonbar?这样,对用户来说就不那么复杂了(如果您有7个以上的按钮),而且似乎效率很高。实现步骤如下(动态示例):创建JTab

我有一个工具栏,上面有从两个到二十个随机数目的按钮。每个按钮的宽度可以不同

我必须把它们都放在顶部区域,并使用JToolBar。在小屏幕分辨率(例如800x600)上,一些按钮可能会在屏幕外(AFAIK JToolbar不能在高度上生长)


如何调整JToolbar以适应高度增长或以任何其他方式(例如使用Flowlayout)解决任务?我不确定这是否有帮助,不如改用ribbonbar?这样,对用户来说就不那么复杂了(如果您有7个以上的按钮),而且似乎效率很高。实现步骤如下(动态示例):创建
JTabbedPane
并添加以下选项卡文件、编辑、帮助。在文件中,新建项目、打开、保存、另存为。。。在编辑中,进行复制、粘贴等操作。。依此类推。

此解决方案不使用
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;
    }
}
import javax.swing.*;
导入java.awt.*;
公共类工具栏网格{
私有静态最终整数最大按钮每行=4;
公共静态void main(字符串[]args)引发异常{
如果(args.length==0){
System.out.println(“将按钮的数量输入为arg>java-cp.ToolbarGrid 9”);
回来
}
int noOfButtons=Integer.parseInt(args[0]);
JFrame=新JFrame();
frame.setTitle(“网格中的测试工具栏”);
GridLayout gLayout=新的GridLayout(0,每行最多按钮);//0行=任意行数
JPanel面板=新的JPanel();
面板设置布局(玻璃窗);
面板=带按钮的面板(无按钮,面板);
框架。添加(面板);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(空);
frame.pack();
frame.setVisible(true);
}
带按钮的专用静态JPanel面板(int noOfButtons,JPanel面板){
for(int i=0;i


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

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

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));
    }
}
包工具栏;
导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入javax.swing.AbstractAction;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JToolBar;
导入javax.swing.SwingUtilities;
公共类工具栏测试扩展了JFrame{
私有静态最终长serialVersionUID=1L;
私有int n=1;
公共测试(){
super(ToolbarTest.class.getName());
JToolBar tb=新的JToolBar();
tb.add(新抽象动作(“第一动作”){
私有静态最终长serialVersionUID=1L;
@凌驾
已执行的公共无效操作(操作事件e){
字符串文本=”;
对于(int i=0;i”;
}
n++;
JButton b=新JButton(“+text+”);
tb.添加(b);
ToolbarTest.this.doLayout();
ToolbarTest.this.pack();
}
});
getContentPane().add(tb,BorderLayout.NORTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
包装();
}
公共静态void main(字符串[]args){
ToolbarTest tbt=新ToolbarTest();
SwingUtilities.invokeLater(()->tbt.setVisible(true));
}
}

“多行工具栏或使用Flowlayout作为工具栏”这不是一个非此即彼的决定。例如
JToolBar tb=新的JToolBar();tb.setLayout(新的FlowLayout(..);//等等。
JToolBar()可以增加高度。为什么你说它不能?@KDM你能分享一下JToolBar长得很高的代码吗?@FoxyBOA用代码补充了一个答案:)@andrethompson试过了。也没有帮助(请参见下面评论中的您的姓名)。仅在调整屏幕大小后按钮部分可见。您没有收到我的问题。若按钮的数量足够大(或者屏幕分辨率很小),那个么从按钮X开始的所有按钮都将离开屏幕。我需要工具栏和flowlayout之间的simbiosis行为(当所有看不见的按钮都位于新行时);也没用。“看不见”按钮仅在调整大小并部分可见后才显示。使用
setLayout(new FlowLayout())
并添加带有BorderLayout.CENTER的工具栏可以正常工作。使用BorderLayout.NORTH时,BorderLayout似乎没有正确计算高度。这是一个明确的直接解决方案,不幸的是我的按钮有可变宽度(可变)。我可能很悲观,假设每个工具栏只有3/4个按钮,但这意味着在某些情况下UI会很难看:(第1行:bbbb有很多可用空间;第2行:bbb)你能告诉我按钮是什么样子吗?它们是否有长文本或大按钮、带图像的按钮等。按钮工具栏所在窗口的大小是多少?很少有按钮只有图像(16x16)。大多数按钮都有可本地化的文本(根据用户语言,此按钮的宽度可以变化-???x16)。窗口大小必须为800x600及以上。如果可能的话,发布一份你的简历