Jbutton 定位在选项卡式窗格内

Jbutton positioning inside a tabbed pane

我目前正在制作数字学校规划器,并希望在 JTabbedPane 中使用多个 JButton。但是我目前遇到一个问题,即使一个按钮也会占据整个窗格,并且想要解决这个问题。

我创建了一个测试程序来反映我编写主程序的方式:

 import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTabbedPane;

public class tabTest extends JFrame {
    private static final long serialVersionUID = 5101892517858668104L;
    private JFrame frame;
    private int WIDTH = 450;
    private int HEIGHT = 600;

    private JTabbedPane tab;

    public tabTest() {

        frame = new JFrame();
        // frame.setUndecorated(true);
        /****************************************************
         * Set up frame
         *****************************************************/
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH, HEIGHT);
        frame.setLocation(50, 50);
        frame.getContentPane().setBackground(Color.GRAY);
        frame.getContentPane().setLayout(null);

        /******************************************************
         * Set up Tabbed pane and buttons
         ******************************************************/
        tab = new JTabbedPane();
        tab.setBounds(20, 50, 400, 500);
        tab.setBackground(Color.white);
        tab.setFocusable(false);

        JButton tabButton1 = new JButton("test");

        tab.addTab("Week 1", tabButton1);
        tab.addTab("Week 2", null);
        tab.addTab("Week 3", null);
        tab.addTab("Week 4", null);
        frame.getContentPane().add(tab);
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        new tabTest();

    }
}

我已经尝试使用 BorderLayout.POSITION 并且它在错误之后抛出了错误任何替代解决方案都会很棒 :)

您的 tabbedPane 只能容纳一个 "object"。如果您添加一个按钮,则您的窗格已满。但是,您可以向窗格添加一个具有更多空间的容器。例如 JPanel。 JPanel 现在可以容纳任意数量的 "objects",并且可以使用它自己的 LayoutManager。

JPanel moreButtons = new JPanel();
moreButtons.add(new JButton("test1"));
moreButtons.add(new JButton("test2"));
moreButtons.add(new JButton("test3"));
moreButtons.add(new JButton("test4"));

tab.addTab("Week 1", moreButtons); 

您还可以在构造函数中创建和初始化整个 GUI。定义像 initializeGUI() 这样的第二个方法来分离对象的创建和 GUI 的初始化可能会更清晰。您还应该使用 invokeLater

将 GUI 线程和主线程分开
public static void main(String[] args) {
   SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    Gui g = new Gui();
    g.initalizeGUI();
    Gui.setVisible(true);
  }
  });
}

无需扩展 JFrame 并在 JFrame 中创建单独的 JFrame。删除 extends JFrame 或在 class 中创建 JFrame。您可以从扩展 class.

内部访问 JFrame 方法
public class MyFrame extends JFrame {

public MyFrame () {
    /**
     * Set up frame 
     */
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(WIDTH, HEIGHT);
    setLocation(50, 50);
    getContentPane().setBackground(Color.GRAY);
    getContentPane().setLayout(null);
}
}

在您的 JTabbedPane 中添加另一个容器,例如 JPanel,如下所示:

    JPanel panel = new JPanel();
    panel.setLayout(new FlowLayout());   // you can change layout according to your need.
    p.add(tabButton1);
    tab.addTab("Week 1", panel);
    tab.addTab("Week 2", null);
    tab.addTab("Week 3", null);
    tab.addTab("Week 4", null);

将所有组件添加到要在选项卡上显示的 JPanel