【问题标题】:JTabbedPane add different class constructor to a tabJTabbedPane 将不同的类构造函数添加到选项卡
【发布时间】:2013-04-07 10:15:01
【问题描述】:

我正在尝试创建一个带有选项卡和菜单栏的框架,每个选项卡将包含不同的JTable,我想知道是否可以将不同类的构造函数添加到选项卡? 我的意思是:

public class Administrator() {
JFrame frame;
JTabbedPanel tabPan;
JPanel firstTab, secondTab;
JMenuBar menuBar;
JMenu menu;
JMenuItem mi1;
Administrator() {
  frame = new JFrame("Test");
  frame.setDefaultClopseOperation(JFrame.EXIT_ON_CLOSE);
  tabPan = new JTabbedPane();
  firstTab = new JPanel();
  secondTab = new JPanel();
  menuBar = new JMenuBar();
  menu = new JMenu("Menu");
  mi1 = new JMenuItem("1");
  menu.add(mi1);
  menuBar.add(menu);
  frame.addJMenuBar(menuBar);
  tabPan.addTab("First",firstTab);
  tabPan.addTab("Second",secondTab);
  frame.setVisible(true);
 }
 public static void main(String[] args) {
  new Administrator();
 }

然后是第二(第一)类:

public class First() {
  JTable firstTable = new JTable();
  //....
  First() {
  //...
  firstTab.add(firstTable);
  //...
}
}

编辑

好的,我找到了一种方法,Jtabbedpane using multiple classes,但现在我有一个不同的问题,我如何在主类中使用 JMenuBar?我扩展了 JPanel,而不是类,我可以在其他类中以某种方式使用它们吗?

【问题讨论】:

  • 我不确定你在问什么。您想将 JMenuBar 添加到 JPanel 吗?如果是这样,您可以将 JMenuBars 添加到我无法立即记住的自定义组件中,但我相信它是您必须实现的接口以允许它包含 JMenu。如果您查看从 JFrame 开始的 API 并遵循超类,您会看到它在接口中列出,可能在 Window 类或其超类周围的某个地方,它有一个明显的名称,如果我想到它,我会让你知道。如果那不是您要问的,请更具体地说明您想做什么,我会尽力提供帮助。祝你好运。
  • 它在Frame类中,接口是MenuContainer。我没有弄乱它,但我很确定这将允许您将 JMenuBar 添加到自定义容器中。但是我会考虑尝试以另一种方式完成同样的事情,很多时候事情并不经常使用它,因为有一种更简单的方法可以做到这一点,尽管情况并非总是如此。只是想一想。
  • 示例:两个类,一个有一个 JMenuBar,第二个扩展 JPanel,我可以在第二个类中以某种方式使用第一类 JMenuBar 吗?现在我不能,因为二等舱不扩展一等舱。
  • 我将其作为答案进行了回复,因此我可以为您格式化一个简短的示例程序。在该程序中,菜单在框架类中创建,对它的引用及其组件存储在面板类中。您应该能够像在框架类中一样使用面板类中菜单栏的任何部分。

标签: java swing constructor jtabbedpane


【解决方案1】:

使用 JMenuBar 是什么意思?我建议研究 OOP 和封装。 YouTube 上有一个人,我认为他在涵盖此类内容以及几种设计模式方面做得非常出色,我相信频道名称是 DerekBanas。如果你用谷歌搜索,他会出现。

对您的问题的快速回答是,您想要将某些内容传递给 JPanel 类的构造函数,或者将 main 方法放在 JPanel 类中,这是一种方法的快速示例。 .

JMenuItem 是 - 添加新记录,在第一个选项卡中,当我选择这个 JMenuItem 时,他会打开一个框架,其中是 JLabel 和 JTextField。然后是第二个选项卡,我点击同一个 JMenuItem,它会召唤新的 JFrame,它有自己的 JLabel 和 JTextField。

public class TestFrame extends JFrame {

    private ActionManager actionManager

    private JMenuBar mb;
    private JMenu file;
    private JMenuItem openDialog1;
    private JMenuItem openDialog2;

    public TestFrame() {

        this.actionManager = new ActionManager();

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setContentPanel(panel);
        setJMenuBar(createMenuBar());
        pack();
    }

    private JMenuBar createMenuBar() {
        mb = new JMenuBar();
        file = new JMenu("File");
        openDialog2 = new JMenuItem("Open Dialog 2");
        openDialog1 = new JMenuItem("Open Dialog 1");
        openDialog2.addActionListener(actionManager.openDialog2Action);
        openDialog1.addActionListener(actionManager.openDialog1Action);

        //here i would add conditional code that added the correct
        //menus to the menubar and menuitems to the correct menus and call
        //this method from a `ChangeListener` that listens for tab changes so
        //it recreates a new menu with the correct components for the selected
        //tab but i added them to the same menu to demonstrate using specific actions
        //for each menu item, it doesn't matter which menu they're attached to their
        //action wont be called unless that JMenuItem is clicked. 
        //this method can be used for any type of button as well, commonly with
        //toolbars, so you can reuse actions like copy, paste, new, open, save, etc

        file.add(openDialog1);
        file.add(openDialog1);
        mb.add(file);

        return mb;
    }

    public static void main(String[] args) {
        TestFrame frame = new TestFrame();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

还有面板类...

public class ActionManager {

    public ActionManager() {

    }

    Action openDialog1Action = new AbstractAction("Open Dialog 1") {
        JOptionPane.showMessageDialog(null, "Dialog 1");
    }

    Action openDialog2Action = new AbstractAction("Open Dialog 2") {
        JOptionPane.showMessageDialog(null, "Dialog 2");
    }

}

此代码所做的只是使用公共方法访问类中的私有字段(封装),并将 TestFrame 对象传递到 TestPanel 构造函数中,因此我们可以使用 TestPanel 类中的 TestFrame 内部的 getter 方法。我还将 ActionListener 添加为 TestPanel 类的一部分,因为这是在面板类中使用菜单栏组件的另一种方式。你能具体告诉我你想要完成什么,或者可能发布你当前代码的一小部分吗?这是执行您所要求的几种方法之一,但它可能不是首选方式,具体取决于您首先要从面板访问它们的原因,您的问题越具体,我能得到的帮助就越多。祝你好运。

【讨论】:

  • 这是我正在使用 JTabbedPane 的问题,我希望,当我使用 JMenuBar 中的 JMenuItem 时,我希望在此特定选项卡中制作我需要的按钮。 JMenuItem 在所有选项卡中保持不变,但调用的方法不同。
  • 如果我将my_name.getMenuFromFrame(); 添加到每个选项卡,那么ActionListener 会打开所有添加到JMenuItem 的方法,但我想让每个选项卡只会调用我提供的那些方法他们为这个特定的标签。
  • 例如,第一个 JMenuItem 是 - 添加新记录 ,当我选择这个 JMenuItem 时,在第一个选项卡中他打开了一个框架,JLabelJTextField。然后是第二个选项卡,我单击相同的JMenuItem,它会召唤新的JFrame,它有自己的JLabelJTextField。不同类别的不同方法。现在,当我按下 JMenuItem 时,它会从所有选项卡中调用所有方法。
  • 哦,您的意思是您希望框架的菜单、菜单项和操作能够更改并针对每个选项卡进行自定义。好的,如果我正确理解您的第二条评论,那么您在更改选项卡时会看到正确的菜单和正确的菜单项,所以您需要做的就是确保只调用一个操作并且它是该项目的正确操作,对吗?不要在面板类中实现ActionListener,而是使用ActionAbstractAction 类,它们都可以从框架类或动作处理程序类中处理,我将在我之前的答案中编辑代码以向您展示例子。
猜你喜欢
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 2019-07-12
相关资源
最近更新 更多