JAVA JTabbedPane - 移除堆叠选项卡的边框

标签 java swing border

我有简单的 GUI,应该显示一些信息。我创建了多个 JTabbedPanes 的菜单,并且选项卡按预期相互堆叠。我试图删除每个选项卡左侧、右侧和底部的边框,这样它看起来就不会堆叠起来。我还没有找到任何可以解决我的问题的方法,是否真的有办法做到这一点?

感谢您提前答复。

这是屏幕截图:

/image/60L3n.png

这是我的代码:

import java.awt.*;
import java.awt.event.*;
import java.io.FileNotFoundException;
import javax.swing.*;

public class Convertor implements ItemListener {

public void addComponentToPane(Container pane) throws FileNotFoundException {
    //main panel containing all below
    JPanel mainPanel = new JPanel(new GridBagLayout());

    GridBagConstraints gbc = new GridBagConstraints();

    //Menu panel
    JPanel menuPanel = new JPanel();
    menuPanel.setMinimumSize(new Dimension(1200, 30));
    menuPanel.setMaximumSize(new Dimension(1200, 30));
    menuPanel.setPreferredSize(new Dimension(1200, 30));
    menuPanel.setBackground(Color.BLUE);
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.weightx = 0;
    gbc.weighty = 0;
    gbc.ipadx = 0;
    gbc.ipady = 0;
    gbc.insets = new Insets(0, 0, 0, 0);        
    gbc.gridx = 0;
    gbc.gridy = 0; 
    mainPanel.add(menuPanel, gbc); 

    //Menu panel buttons
    JButton importButton = new JButton("Import");
    importButton.setPreferredSize(new Dimension(75, 20));
    menuPanel.add(importButton, BorderLayout.EAST); 
    JButton button2 = new JButton("XXX");
    button2.setPreferredSize(new Dimension(75, 20));
    menuPanel.add(button2, BorderLayout.EAST); 

    //PAYER PANEL CONTAINER - containing payer panel
    JPanel payerPanelContainer = new JPanel(new BorderLayout());    
    //payerPanelContainer.setBackground(Color.RED);
    gbc.fill = GridBagConstraints.BOTH;
    gbc.weightx = 0;
    gbc.weighty = 1;
    gbc.ipadx = 0;
    gbc.ipady = 0;
    gbc.insets = new Insets(0, 0, 0, 0);        
    gbc.gridx = 0;
    gbc.gridy = 1; 
    mainPanel.add(payerPanelContainer, gbc); 

    //PAYER PANEL 
    JPanel payerPanel = new JPanel(new GridBagLayout());    
    payerPanel.setBackground(Color.YELLOW);
    payerPanelContainer.add(payerPanel); 

    //PAYER PANEL TABBED PANE
    JTabbedPane payerTabbedPane = new JTabbedPane();
    gbc.fill = GridBagConstraints.BOTH;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.ipadx = 0;
    gbc.ipady = 0;
    gbc.insets = new Insets(0, 0, 0, 0);        
    gbc.gridx = 0;
    gbc.gridy = 0; 
    payerPanel.add(payerTabbedPane, gbc); 

    //Create payer tabs
    JPanel payerTab1 = new JPanel(new BorderLayout());       
    payerTabbedPane.addTab("Payer 1", payerTab1);

    JPanel payerTab2 = new JPanel(new BorderLayout());
    payerTabbedPane.addTab("Payer 2", payerTab2);

    //create MSISDN tabbed pane in each payer tab
    JTabbedPane msisdnTabbedPane1 = new JTabbedPane();
    payerTab1.add(msisdnTabbedPane1);

    //create MSISDN tabs
    JPanel generalTabPayer1 = new JPanel(new BorderLayout());       
    msisdnTabbedPane1.addTab("GENERAL", generalTabPayer1);

    JPanel msisdnTab1 = new JPanel(new BorderLayout());       
    msisdnTabbedPane1.addTab("MSISDN 1", msisdnTab1);

    JPanel msisdnTab2 = new JPanel(new BorderLayout());       
    msisdnTabbedPane1.addTab("MSISDN 2", msisdnTab2);

    JPanel msisdnTab3 = new JPanel(new BorderLayout());       
    msisdnTabbedPane1.addTab("MSISDN 2", msisdnTab3);

    //create MSISDN options tabbed pane
    JTabbedPane msisdnOptionsTabbedPane1 = new JTabbedPane();
    msisdnTab1.add(msisdnOptionsTabbedPane1);

    //create MSISDN options tabs
    JPanel msisdnOptionsTab1 = new JPanel(new BorderLayout());       
    msisdnOptionsTabbedPane1.addTab("Option 1", msisdnOptionsTab1);

    JPanel msisdnOptionsTab2 = new JPanel(new BorderLayout());       
    msisdnOptionsTabbedPane1.addTab("Option 2", msisdnOptionsTab2);

    //add main panel to window
    pane.add(mainPanel);

}


private static void createAndShowGUI() throws FileNotFoundException {
    //Create and set up the window.
    JFrame frame = new JFrame("CSV Reader");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

    //Create and set up the content pane.
    Convertor demo = new Convertor();
    demo.addComponentToPane(frame.getContentPane());

    //Display the window.
    frame.pack();
    frame.setSize(1206, 800); 
    frame.setMinimumSize(new Dimension(1206, 800));
    frame.setMaximumSize(new Dimension(1206, 800));
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    frame.setVisible(true);
}

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

            try {
                createAndShowGUI();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }       
        }
    });
}

@Override
public void itemStateChanged(ItemEvent arg0) {
    // TODO Auto-generated method stub

}

}

最佳答案

有可能,但是很难。唯一的方法是为选项卡式 Pane 提供您自己的 UI。这是一个例子,它并不能完全满足您的要求,但它可以指明您必须走的路(抱歉,但我无法提供完整的解决方案,因为它可能会花费时间)。

import java.awt.Graphics;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import javax.swing.plaf.metal.MetalLookAndFeel;
import javax.swing.plaf.metal.MetalTabbedPaneUI;


public class BorderlessTabsExample implements Runnable {

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(MetalLookAndFeel.class.getName());
        } catch (Exception e) {
            // Nothing
        }
        SwingUtilities.invokeLater(new BorderlessTabsExample());
    }

    @Override
    public void run() {
        JTabbedPane tabber = new JTabbedPane();
        tabber.addTab("First", new JLabel("First"));
        tabber.addTab("Second", new JLabel("Second"));
        tabber.addTab("Third", new JLabel("Third"));
        // set the UI which will paint your tabs
        tabber.setUI(new MetalBorderlessTabbedPaneUI()); 
        JFrame frm = new JFrame("Tabber test");
        frm.add(tabber);
        frm.setSize(500, 400);
        frm.setLocationRelativeTo(null);
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setVisible(true);
    }

    private static class MetalBorderlessTabbedPaneUI extends MetalTabbedPaneUI {

        @Override
        protected void installDefaults() {
            super.installDefaults();
            if (contentBorderInsets != null) {
                contentBorderInsets = new Insets(contentBorderInsets.top, 0, 0, 0);
            }
        }

        @Override
        protected void paintContentBorderRightEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) {
            // Do nothing
        }

        @Override
        protected void paintContentBorderBottomEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) {
            // Do nothing
        }

        @Override
        protected void paintContentBorderLeftEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) {
            // Do nothing
        }

    }
}

关于JAVA JTabbedPane - 移除堆叠选项卡的边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51944426/

相关文章:

java - spring事务超时不起作用

java - 请求映射和静态字段

java - 无法从 SpEL 找到 Spring Security 主体

flutter - 如何在 Flutter 中为小部件添加边框?

matlab - 如何在 MATLAB 图形窗口的边缘周围创建边框?

java - 是否可以从字体中获取 vector 形式的字符?

java - Swing TextArea 函数 setLineWrap 使执行变慢

java - 实现秒表

css - 顶部内部透明箭头

java - 如何制作带有组合框和 2 个按钮的 java swing 弹出窗口?