【问题标题】:Panel inside tab not displayed选项卡内的面板未显示
【发布时间】:2019-08-20 17:48:45
【问题描述】:

我正在尝试使用 IntelliJ GUI 表单创建 UI。 我创建了一个扩展 JFrame 的类,并且只包含 JTabbedPane 和 2 个选项卡,每个选项卡都有一个 JPanel。 然后是 2 个扩展 JPanel 的其他类。 但是,启动时没有面板显示。

我尝试过使面板无效、重绘和重新验证

//main class
import javax.swing.*;

public class jumpManMain {
    public static void main (String[] args) {
        SwingUtilities.invokeLater(() -> {
            final JFrame frame =  new frmTabs();
        });
    }
}

// tabbedpanel class
public class frmTabs extends JFrame implements constants{
    private JTabbedPane tabbedPane;
    private JPanel panelTab1;
    private JPanel panelTab2;

    public frmTabs()
    {
        setContentPane(tabbedPane);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(FORM_LEFT, FORM_TOP, FORM_WIDTH, FORM_HEIGHT);
        panelTab1 = new panel1();
        panelTab2 = new panel2();
        pack();
        setVisible(true);
        setSize(FORM_WIDTH,FORM_HEIGHT);


        ChangeListener changeListener = new ChangeListener() {
            public void stateChanged(ChangeEvent changeEvent) {
                JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent.getSource();
                int index = sourceTabbedPane.getSelectedIndex();
                System.out.println("Tab changed to: " + sourceTabbedPane.getTitleAt(index));
                panelTab1.revalidate();
                panelTab1.repaint();
                panelTab2.revalidate();
                panelTab2.repaint();
            }
        };
        tabbedPane.addChangeListener(changeListener);
    }

}
//tabs form generated by IntelliJ
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="frmTabs">
  <tabbedpane id="78766" binding="tabbedPane">
    <constraints>
      <xy x="20" y="20" width="900" height="560"/>
    </constraints>
    <properties>
      <minimumSize width="900" height="560"/>
      <preferredSize width="900" height="560"/>
    </properties>
    <border type="none"/>
    <children>
      <grid id="35c5e" binding="panelTab1" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
        <margin top="0" left="0" bottom="0" right="0"/>
        <constraints>
          <tabbedpane title="Jumps arrived"/>
        </constraints>
        <properties>
          <maximumSize width="1000" height="1000"/>
          <minimumSize width="900" height="560"/>
          <preferredSize width="900" height="560"/>
        </properties>
        <border type="none"/>
        <children/>
      </grid>
      <grid id="4323" binding="panelTab2" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
        <margin top="0" left="0" bottom="0" right="0"/>
        <constraints>
          <tabbedpane title="Jumps created"/>
        </constraints>
        <properties>
          <maximumSize width="1000" height="1000"/>
          <minimumSize width="900" height="560"/>
          <preferredSize width="900" height="560"/>
        </properties>
        <border type="none"/>
        <children/>
      </grid>
    </children>
  </tabbedpane>
</form>

//panel1 XML
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="panel1">
  <grid id="27dc6" binding="panelMain" layout-manager="GridLayoutManager" row-count="6" column-count="5" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
    <margin top="5" left="5" bottom="5" right="5"/>
    <constraints>
      <xy x="21" y="20" width="900" height="560"/>
    </constraints>
    <properties>
      <minimumSize width="900" height="560"/>
      <preferredSize width="900" height="560"/>
      <requestFocusEnabled value="true"/>
    </properties>
    <border type="bevel-raised" title="Jump Ticket Manager">
      <font name="Arial Black" style="1"/>
      <title-color color="-4451918"/>
    </border>
    <children>
....
    </children>
  </grid>
</form>
...

【问题讨论】:

  • 我对 IntelliJ 表单设计器一无所知。我建议您学习如何手动创建表单,以便您完全控制。这样,如果您需要切换到不同的 IDE,代码也可以工作。阅读 How to Use Tabbed Panes 上的 Swing 教程中的部分,以获取帮助您入门的示例。
  • 您已经初始化了两个面板,但您忘记将它们添加到您的 TabbedPanel..

标签: java swing jframe jpanel jtabbedpane


【解决方案1】:

您缺少以下步骤

1.JTabbedPane 初始化

  tabbedPane = new JTabbedPane();
  1. 将面板添加到您的 JTabbedPane

    tabbedPane.add(panelTab1);
    tabbedPane.add(panelTab2);
    

因此您的最终代码将如下所示

 public class Main {
     public static void main(String[] args) {
         SwingUtilities.invokeLater(() -> {
            final JFrame frame =  new frmTabs();
       });
   }
 }

class frmTabs extends JFrame implements constants{
private JTabbedPane tabbedPane;
private JPanel panelTab1;
private JPanel panelTab2;

public frmTabs()
{
    tabbedPane = new JTabbedPane();
    setContentPane(tabbedPane);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(FORM_LEFT, FORM_TOP, FORM_WIDTH, FORM_HEIGHT);
    panelTab1 = new JPanel();
    panelTab2 = new JPanel();
    panelTab1.setName("first Tab");   //To add titles to your tabs
    panelTab2.setName("Second Tab");  //to add titles to your tabs
    tabbedPane.add(panelTab1);
    tabbedPane.add(panelTab2);
    pack();
    setVisible(true);
    setSize(FORM_WIDTH,FORM_HEIGHT);


    ChangeListener changeListener = new ChangeListener() {
        public void stateChanged(ChangeEvent changeEvent) {
            JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent.getSource();
            int index = sourceTabbedPane.getSelectedIndex();
            System.out.println("Tab changed to: " + sourceTabbedPane.getTitleAt(index));
            panelTab1.revalidate();
            panelTab1.repaint();
            panelTab2.revalidate();
            panelTab2.repaint();
        }
    };
    tabbedPane.addChangeListener(changeListener);
    }
  }

*NB 以下几行将为您的选项卡式面板添加标题

  panelTab1.setName("first Tab");  
  panelTab2.setName("Second Tab");

输出

  Tab changed to: Second Tab
  Tab changed to: first Tab

  Process finished with exit code 0

【讨论】:

  • 我试过了,但没有用。我只用java panelTab1 = new panel1(); panelTab2 = new panel2(); 替换了新面板,但面板内的对象没有显示。 \n 除此之外,当java tabbedPane = new JTabbedPane(); IntelliJ 给我一个警告分配给 UI 绑定字段将覆盖字段生成的 UI 设计器表单。此类分配将导致 UI Designer 为此类字段生成的组件设置代码被忽略。
  • Java panelTab1 = new panel1(); 是初始化阶段(步骤 1)。要显示此窗格,您需要将其添加到选项卡式窗格,因此 tabbedPane.add(panelTab1); 。你错过了tabbedPane.add(panelTab1);
  • 使用 IntelliJ UI Designer 无需添加选项卡或窗格。它们由 IntelliJ 自动初始化。这就是我收到警告的原因,
  • 我添加了由 IntelliJ UI Designer 生成的 XML。一切都运行良好,但都没有显示。选项卡内的窗格是否有“特殊”布局?
【解决方案2】:

有效地使用 IntelliJ GUI,解决方案是这样的:

1) 创建主类

public class jManagerMainUI extends JFrame {
private JPanel panelTab1;
private JPanel panelTab2;
private JTabbedPane tabbedPane;

public jManagerMainUI(String param) {
    setContentPane(tabbedPane);
    tabbedPane.setBounds(FORM_LEFT, FORM_TOP, FORM_WIDTH, FORM_HEIGHT);
    setDefaultCloseOperation(3);
    setBounds(FORM_LEFT, FORM_TOP, FORM_WIDTH, FORM_HEIGHT);
    tabbedPane.setComponentAt(0,new jA(param).getPanel());
    tabbedPane.setComponentAt(1,new jC(param).getPanel());
    pack();
    setVisible(true);
    setSize(FORM_WIDTH, FORM_HEIGHT);
}
}

2) 为每个选项卡创建一个类,该类将返回对面板的引用

public class jA extends JFrame {
    private JPanel panelA;
    //Tab A
    private JButton btAddA;

    public JPanel getPanel() {
        return panelA;
    }
...

【讨论】:

    猜你喜欢
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    相关资源
    最近更新 更多